스프링에서 의존관계 주입은 크게 4가지 방법이 있다.
- 생성자 주입
- 수정자 주입(setter 주입)
- 필드 주입
- 일반 메서드 주
● 생성자 주입
이름 그대로 생성자를 통해서 의존 관계를 주입받는 방법이다
특징으로는 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다.
추가로 불변, 필수 의존관계에 사용된다.
예시를 통해 알아보자.
Ex) OrderServiceImpl 생성자에 MemberRepository, DicsountPolicy 의존관계 연결
@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;
}
}
의존관계를 연결할 필드를 final을 통해 필수로 입력을 받도록 하고,
생성자에서 의존관계를 주입 해준다.
일반적인 의존관계 방법이다.
※ 참고로 생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입된다.
물론 스프링 빈에만 해당한다.
● 수정자 주입(setter 주입)
setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법이다.
특징으로는 선택, 변경 가능성이 있는 의존관계에 사용된다.
자바 빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다.
예시를 통해 알아보자.
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;
}
}
이 방법은 외부에서 set 메서드를 수정할 수도 있기에(public 클래스여서)
권장하지는 않는다.
※참고: @Autowired의 기본 동작은 주입할 대상이 없으면 오류가 발생한다.
주입할 대상이 없어도 동작하게 하려면 @Autowired(required = false)로 지정하면 된다.
● 필드 주입
필드 주입은 이름 그대로 필드에 바로 주입하는 방법이다.
특징으로는, 코드가 간결하지만 외부에서 변경이 불가능해서
테스트하기 힘들다는 치명적인 단점이 있다.
필드 주입은 애플리케이션의 실제 코드와 관계없는 테스트 코드나
스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만
특별한 용도로 사용한다.
@Component
public class OrderServiceImpl implements OrderService {
@Autowired private MemberRepository memberRepository;
@Autowired private DiscountPolicy discountPolicy;
}
● 일반 메서드 주입
일반 메서드를 통해서 주입받을 수 있다.
특징은 한 번에 여러 필드를 주입받을 수 있다.
일반적으로 잘 사용하지 않는다
@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;
}
}
지금까지 의존관계 주입 방법에 대해 알아보았다.
일반적인 경우 생성자 주입을 사용한다.
참고: 어쩌면 당연한 이야기이지만
의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다.
스프링 빈이 아닌 Member 같은 클래스에서 @Autowired 코드를 적용해도
아무 기능도 동작하지 않는다.
'Java > Spring' 카테고리의 다른 글
[Spring] 스프링 빈 생명주기 콜백 (0) | 2022.01.26 |
---|---|
[IntelliJ] 인텔리제이 롬복(lombok) 설치 및 설정 | lombok으로 의존관계 설정하기 (0) | 2022.01.24 |
[Spring] 스프링 필터(Spring Filter) | FilterType 옵션 (0) | 2022.01.22 |
[Spring] 컴포넌트 스캔 (@Component) | 의존관계 자동 주입(@Autowired) (0) | 2022.01.22 |
[Spring] 싱글톤 방식의 주의점 | 무상태(stateless) (0) | 2022.01.21 |