의존관계 주입 방법은 크게 4가지가 있다.
1. 생성자 주입
2. 수정자 주입(setter 주입)
3. 필드 주입
4. 일반 메서드 주입
==============================
1. 생성자 주입
생성자 호출 시점에 의존관계 주입.
*딱 1번만 호출되는 것이 보장된다.
*불변, 필수 의존관계에 사용
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired //생략 가능
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
생성자가 딱 1개 있으면 @Autowired를 생략해도 자동 주입된다.(스프링 빈에만 해당)
2. 수정자 주입(setter 주입)
setter를 통해 의존관계 주입.
*선택, 변경 가능성이 있는 의존관계에 사용
*자바빈 프로퍼티 규약(setXxx, getXxx)의 수정자 메서드 방식을 사용하는 방법
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
3. 필드 주입
필드에 바로 주입하는 방법.
*코드가 간결하지만 외부에서 변경이 불가능해 테스트하기 힘들다.
*DI 프레임워크가 없으면 아무것도 할 수 없다.
*사용하지 말자!
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
4. 일반 메서드 주입
일반 메서드를 통해 의존관계 주입.
*한번에 여러 필드를 주입받을 수 있다.
*일반적으로 잘 사용하지 않는다.
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
결론: 생성자 주입을 사용해라!
불변
* 대부분 의존관계 주입은 애플리케이션 종료시점까지 변경할 일이 없다. 오히려 변경하면 안된다.
누락
* 객체를 생성할때 의존 관계를 주입해야하기 때문에, 주입 데이터를 누락했을때 컴파일 오류가 발생한다.
final 키워드
* 생성자에서 혹시라도 값이 설정되지 않는 오류를 컴파일 시점에 막아준다.
* 나머지 주입 방식은 모두 생성자 이후에 호출되므로, 필드에 final 키워드를 사용할 수 없다.
반복되는 생성자 코드 작성이 귀찮다면 Lombok을 적용해보자.
Lombok의 @RequiredArgsConstructor를 사용하면 final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다.
롬복이 자바의 애노테이션 프로세서라는 기능을 이용해서 컴파일 시점에 생성자 코드를 자동으로 생성해준다.
'공부 > Spring' 카테고리의 다른 글
[스프링 핵심](8) 빈 스코프 (0) | 2024.01.18 |
---|---|
[스프링 핵심](7) 빈 생명주기 콜백 (0) | 2024.01.16 |
[스프링 핵심](5) 컴포넌트 스캔 + Autowired (0) | 2024.01.16 |
[스프링 핵심](4) 싱글톤 컨테이너 (1) | 2024.01.07 |
[스프링 핵심](3) 회원, 주문과 할인 예제를 스프링으로 전환 (0) | 2024.01.07 |