[Spring] 스프링 의존관계 주입 방법
스프링 컨테이너에서 관리하는 스프링 빈들의 의존관계를 주입하는 방법은 크게 네 가지가 있다.
생성자 주입 (Constructor Injection)
수정자 주입(Setter Injection)
필드 주입 (field Injection)
일반 메서드 주입
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 주입)
settr 메서드를 통해 의존관계를 주입하는 방법
선택, 변경 가능성이 있는 의존관계에 사용된다.
@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;
}
}
@Autowired는 주입할 대상이 없으면 오류가 발생하기 때문에 주입할 대상이 없어도 동작하게 하려면 @Autowired(required = false)로 지정하면 된다.
3. 필드 주입
필드에 바로 의존관계를 주입하는 방법
@Component
public class OrderServiceImpl implements OrderService {
@Autowired private MemberRepository memberRepository;
@Autowired private DiscountPolicy discountPolicy;
}
코드가 간결하지만 외부에서 변경이 불가능해 테스트하기 힘들고 DI 프레임워크가 없으면 아무것도 할 수 없다.
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;
}
}
위처럼 의존관계를 주입하는 방법에는 네 가지 방법이 있지만 스프링은 생성자 주입을 권장한다.
이유는 다음과 같다.
1. 불변
대부분의 의존관계 주입은 한 번 일어나면 종료 시점까지 의존관계를 변경할 일이 거의 없다. 따라서 객체를 생성할 때 한 번만 호출되는 생성자 주입을 사용한다.
2. 누락
final 키워드로 필드를 만들고 생성자 주입을 통해 의존관계를 주입하기 때문에 누락 시 컴파일 오류가 발생해서 개발자가 알기 쉽다.
(생성자 주입만 final 키워드를 사용한다.)
따라서 항상 생성자 주입을 선택하고, 가끔 옵션이 필요하면 수정자 주입을 선택하면 된다.
참고 자료 : 김영한님 스프링 핵심 원리 - 기본편
'Programming > Spring' 카테고리의 다른 글
[Spring] 예외처리 - ExceptionHandler, ControllerAdvice (0) | 2022.10.30 |
---|---|
[Spring] Spring MVC 구조 (0) | 2022.10.25 |
[Spring] 컴포넌트 스캔(ComponentScan) (1) | 2022.10.23 |
[Spring] 싱글톤과 스프링 컨테이너 (0) | 2022.10.20 |
[Spring] IoC, DI (0) | 2022.10.19 |