의존관계 주입 방법#
생성자, 수정자, 필드 ,메서드 4가지
생성자 주입#
- 생성자를 통해 주입받는 방법
- 생성자 호출시점에 단 한번만 (불변, 필수)
생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입
수정자 주입#
setter을 통해 의존관계 주입선택, 변경가능성이 있는 의존관계에 사용 (거의 사용할일 없음)
필드 주입#
- 필드에 바로 주입하는 방식
- 코드가 간결하지만, 외부에서 변경 불가 => 테스트하기 어려움
- DI 프레임워크가 없으면 암것도 못함
@Configuration같은 곳에서만 특별한 용도로 사용 웬만하면 사용하지 말자!!실무에서 많이씀
일반 메서드 주입#
- 일반적인 메서드를 통한 주입
- 안씀
옵션 처리#
주입할 스프링 빈이 없어도 동작해야 될 때
@Autowired(required=false): 대상이 없으면 메서드 자체가 호출안됨org.springframework.lang.@Nullable: 대상없으면 null입력Optional<>
생성자 주입선택!!#
과거에는 필드 주입을 많이 사용했지만, 최근에는 DI 프레임워크 대부분이 생성자 주입을 권장
불변
- 대부분 DI는 애플리케이션 종료시점까지 의존관계가 변하면 안됨
- 객체를 생성할 때 딱 1번만 호출됨
누락
- 프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우 NPE 위험 방지
final 선언 가능
- 생성자에서 뭔가를 잘못해도, 컴파일 시점에 막아줌 final은 항상 생성자에서 들어가야됨
조회할 빈이 2개이상#
@Autowired는 타입으로 조회하는데, 같은 타입이 2개 이상이라면??
수동으로 등록해서 해결할 수도 있다
@Autowired 필드 명 매칭#
@Autowired는 타입 매칭을 시도하고, 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 추가 매칭
@Qualifier#
추가 구분자를 붙여주는 방법 (주입시 추가적인 방법을 제공)
주입할 객체, 주입받을 객체에 모두
@Qualifier붙여줘야됨
빈등록할때
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy...찾을때
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
...
}@Primary#
@primary가 있으면, 다 무시하고 우선권을 가짐
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy{조회한 빈이 모두 필요할 때 List,Map#
Map<String, 타입>으로 주입받으면, 해당 타입의 <빈이름 :객체>Map을 받을 수 있다.List로 주입받으면 모든 빈을 담아준다 해당사향이 없으면 빈 컬랙션이나 Map을 주입한다
자동, 수동의 기준#
웬만하면 자동을 쓰는 추세
애플리케이션은 크게 업무 로직, 기술지원 로직으로 나눌 수 있다.
- 업무 로직 빈 : 컨트롤러, 서비스, 리포지토리 등
- 기술 지원 빈 : 기술적인 문제나, 공통 관심사를 처리 (DB연결, 공통 로그 처리)
업무 로직의 경우는 자동 빈 권장
기술 지원 로직은 수가 매우 적고, 애플리케이션 전반에 걸쳐서 광범위한 영향 또한 적용이 잘 되나조차 파악하기 어려운 경우가 많음 따라서 수동으로 등록하여 설정정보에 바로 나타나게 하는것이 유지보수에 좋음