11. 의존관계 자동 주입
11. 의존관계 자동 주입
의존관계 자동 주입
의존관계 주입 방법에는 4가지가 있다.
- 생성자 주입
- 수정자 주입 (setter 주입)
- 필드 주입
- 일반 메서드 주입
생성자 주입
- 생성자를 통해 의존 관계 주입
- 특징
- 최초 1회만 주입 받는다.
- 불변, 필수 의존관계에 사용
1
2
3
4
5
6
7
8
9
10
11
12
@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;
}
}
- 여기서는 할인 정책과 멤버 기록을 함부러 바꿀 일이 없기에 불변으로 설정해 프로그램의 안전성을 보장한다.
- 단 생성자가 딱 한개면
@Autowired
지정을 생략 할 수 있다.- 단 생성자가 여러개면 어떤 생성자로 Bean 등록을 해야할지 모르기에
@Autowired
를 많이 사용한다.
- 단 생성자가 여러개면 어떤 생성자로 Bean 등록을 해야할지 모르기에
수정자 주입
- setter 주입이라고도 한다.
- 수정 할 때 주로 사용
1
2
3
4
5
6
7
8
9
10
@Component
public class OrderServiceImpl implements OrderService{
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository)(
this.memberRepository = memberRepository;
}
setter
를 통해 자동으로 주입을 한다.- 단 생성자가 있다면 우선적으로 생성자 부터 등록되고 setter가 실행된다.
참고 :
@Autowired
는 기본 동작은 주입 대상이 없으면 오류@Autowired(required = false)
를 통해 주입 대상 없이 동작이 가능하다.
필드 주입
- 이름 그대로 필드에 바로 주입
- 특징
- 코드가 간결하긴하다.
- DI 프레임워크가 없으면 아무것도 할 수 없다.
- 외부에서 테스트하기가 너무 힘들다.
- 어디서 사용할까?
- 테스트 코드
1
2
3
4
5
6
7
@Component
public class OrderServiceImpl implements OrderService{
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
일반 메서드 주입
- 일반 메서드를 통해 주입
- 특징
- 여러 메서드를 동시에 주입 가능
- 일반적으로 자주 사용되지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
@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;
}
}
옵션 처리
- 주입할 스프링 빈이 없어도 동작해야할 때가 있다.
자동 주입 대상을 옵션으로 처리
@Aurowired(required=false)
: 자동 주입 대상이 없으면 수정자org.springframework.lang.@Nullable
: 자동 주입대상 없으면 null 입력- Optional 활용
이러한 방법은 스프링 전반에 걸쳐 지원되며 생성사 자동 주입에서 특정 필드에 있어 사용될 수도 있다.
그렇다면 우리는 어떤 주입을 선택해야할까?
생성자 주입이 좋은 이유
불변
- 대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존 관계를 변경 할 일이 없다.
- 대부분의 의존관계는 종료전까지 변하면 안된다.
- 누군가 실수로 의존관계를 변경 할 수도 있다. → 메서드는 함부로 열지 않는다.
- 충분히 불변하게 설계가 가능하다.
- 객체의 final을 사용하도록 해서 실수를 방어하자
- 컴파일 오류로 버그를 방지한다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.