TIL

의존 관계 자동 주입

다양한 의존 관계 주입 방법

옵션 처리

주입할 스프링 빈이 없어도 동작해야 할 때가 있다.

그런데 @Autowired만 사용하면 required옵션의 기본 값이 true로 되어 있어서 자동 주입 대상이 없으면 오류가 발생한다.

//호출 안됨
@Autowired(required = false)
public void setNoBean1(Member member) {
}

//null 호출
@Autowired
public void setNoBean2(@Nullable Member member) {
}

//Optional.empty 호출
@Autowired(required = false)
public void setNoBean3(Optional<Member> member) {
}

참고: @Nullable, Optional은 스프링 전반에 걸쳐서 지원된다. 예를 들어서 생성자 자동 주입에서 특정 필드에만 사용해도 된다.

생성자 주입을 선택해라!

조회 빈이 2개 이상 - 문제

해결

자주 사용하는 메인 스프링 빈은 @Primary를 적용해서 조회하는 곳에서 @Qualifier지정 없이 편리하게 조회하고, 서브로 사용하는 빈을 획득할 때는 @Qualifier를 지정해서 명시적으로 획득 하는 방식으로 사용하면 코드를 깔끔하게 유지할 수 있다. 물론 이때 메인 스프링 빈을 등록할 때 @Qualifier를 지정해주는 것은 상관없다.

스프링은 자동보다는 수동이, 넒은 범위의 선택권보다는 좁은 범위의 선택권이 우선 순 위가 높다. 따라서 @Primary보다 @Qualifier가 우선권이 높다.

조회한 빈이 모두 필요할 때, List, Map

@Autowiredpublic 
DiscountService(Map<String, DiscountPolicy> policyMap, 
								List<DiscountPolicy> policies) {
		this.policyMap = policyMap;
		this.policies = policies;
}

자동, 수동의 올바른 실무 운용 기준: 편리한 자동 기능을 기본으로 사용하자. 직접 등록하는 기술 지원 객체는 수동 등록. 다형성을 적극 활용하는 비즈니스 로직은 수동 등록을 고민해보자.