티스토리 뷰
728x90
👉🏻 Spring에서는 DI기능을 제공합니다. 이는 Applicaiton 시작 시 IOC에 Bean으로 설정된 Object를 관리하고, Singleton 형태로 '@Autowired' 되어있는 객체에 주입이 됩니다. 주입 방식에는 기본적으로 필드주입, Setter주입, 생성자 주입이 있으며 현재까지는 생성자 주입이 가장 안정적인 방법으로 알려져 있습니다.
그 이유를 살펴보겠습니다. [일반 메서드 주입도 있으나 잘 사용하지 않거나 Setter와 비슷하여 제외]
Setter 주입
- DI를 Setter 함수에서 실행하는 방법
- 선택, 변경 가능성이 있는 의존관계에서 사용
@Slf4j
@Service
public class MemberService{
private MemberMapper MemberMapper;
@Autowired
public void setMemberMapper(MemberMapper memberMapper) {
this.MemberMapper = memberMapper;
}
...
Field 주입
- DI를 field에 직접 주입 하는 방법
- 코드의 간결함이 장점
- 외부 변경이 불가능하기 때문에 Test code 작성 시 실행이 힘듬
- DI Framwork가 없으면 아무것도 할 수 없음
@Slf4j
@Service
public class EmailService{
@Autowired
private SmsMapper smsMapper;
..
생성자 주입
- DI를 생성자에서 실행하는 방법
- 생성자 호출 시점에 딱 1번 호출 되는 것이 보장
- 1번 호출 보장은 데이터 보존에 유리함 -> 외부 접근 할 수 있는 곳이 한 곳이니까
- 불편, 필수 의존 관계에 사용
- Spring 프레임 워크가 밀고 있음
- 생성자가 1개인 경우 @Autowired를 생략해도 주입이 가능
@Service
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
private MemberService memberService;
public UserServiceImpl(UserRepository userRepository, MemberService memberService) {
this.userRepository = userRepository;
this.memberService = memberService;
}
}
생성자 주입을 사용해야하는 이유
불변
- 대부분의 의존관계 주입은 한 번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다.
오히려 대부분의 의존관계는 애플리케이션 종료전까지 변하면 안된다. 불변의 법칙 - 수정자 주입을 사용하면, setXxx메서드를 public으로 열어두어야 한다.
- 누군가 실수로 변경할 수도 있고, 변경하면 안되는 메서드를 이용해서 에러가 날 수 있다.
- 생성자 주입은 객체를 딱 1번만 호출하므로 이후에 호출 되는 일이 없다. 따라서 불변하게 설계할 수 있다
final키워드
생성자 주입을 사용할 때 final 키워드를 사용할 수 있다.
final을 사용하면 생성자에서 혹시라도 값이 설정하지 않을 경우 오류 메시지를 뱉는다.
728x90
'💻 개발 > 프레임워크' 카테고리의 다른 글
댓글
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday