
의존 관계 주입 방식
생성자 주입
- 생성자를 통해 의존 관계 주입하는 방법
- 특징
- 생성자 호출 시점 1번만 호출이 보장
- 불변, 필수 의존 관계에서 사용
- final 은 값이 있음을 보장
- 생성자가 하나만 있으면 Autowired 를 생략해도 된다! 자동으로 의존 관계 주입이 일어난다
수성자 주입 (setter 주입)
- setter 라고 불리는 필드의 값을 변경하는 수정자 메소드를 통해 의존 관계 주입 하는 방법
- set + Autowried 가 있으면 연간관계 자동 주입
- 특징
- 선택, 변경 가능성이 있는 의존 관계에 사용
- 자바빈 프로퍼티 규약 : setXxx, get Xxx 메서드 통해 값을 읽거나 수정하는 규칙
필드 주입
- 필드에 바로 주입하는 방식
- 특징
- 외부에서 변경이 불가능해서 테스트가 어려움
- DI 프레임 워크가 없으면 아무것도 할 수 없다
- 변경해야 할 경우 setter 를 따로 만들어서 변경해야한다
- @Autowired는 스프링 컨테이너를 테스트에 통합한 경우에만 가능
일반 메서드 주입
- 일반 메스드 통해 주입 가능
- 특징
- 한번에 여러 필드 주입 받을 수 없다
- 의존 관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작!
옵션 처리
- 스프링 빈이 없어도 동작해야하는 경우가 있다
- @Autowired 사용하면 기본값 (required = true) 오류 발생
옵션 처리 방법
- @Autowired(requred = false) : 수정자 메서드 자체 호출 x
- @Nullable : 자동 주입할 대상이 없으면 null 입력
- Optional<> : 자동 주입할 대상이 없으면 Optioanl.empty 입력
생성자 주입 선택하자!
불변
- 의존 관계 주입은 보통 한 번 일어나면 종료시점까지 의존 관계를 변경할 일이 X
- 수정자 주입을 사용하면 set 메서드를 Public 으로 열어두어야한다. -> 변경가능
- 생성자 주입은 객체를 생성할 때 딱 한 번만 호출되므로 불변하게 설계 가능
누락
- @Autowired 가 프레임 워크 안에서 동작할 때는 의존관계가 없으면 오류가 발생
- 순수한 단위 테스트 시, 생성자 주입을 사용하며 의존성 주입을 하면 컴파일 오류가 발생해 에러를 쉽게 해결 가능
final
- 생성자 주입을 사용하면 final 키워드 사용 가능
- 값이 설정되지 않는 오류를 컴파일 시점에 막아줌
정리 (생성자 주입을 선택해야하는 이유!!)
- 프레임 워크에 의존 X, 순수한 자바 언어의 특징을 잘 살리는 방법
- 필수값이 아닌 경우 수정자 주입 방식을 옵션으로 부여
-> 생성자 주입 (기본) , 수정자 주입(필요시)
롬북과 최신 트랜드
- @ RequiredArgsConstructor : final 이 붙은 필드를 모아 생성자를 자동으로 만들어준댜
- 최근에는 생성자 하나(@Autowired 생략) , @ RequiredArgsConstructor 을 같이 많이 사용
조회 빈이 2개 이상
- @Autowired 는 타입으로 조회 ( ac.getBean(DiscountPolicy.class)
해결 방법
@Autowired 필드맹 매칭
- 타입 매칭 -> 필드 이름 -> 파라미터 이름 순으로 매칭
@Qualifier 매칭
- 주입시 추가적인 방법 제공하는 것(빈이름 변경 X)
- 빈 이름 등록시 @Qualifier("mainDiscountPolicy")
- 주입시에 @Qualifier 를 붙이고 등록한 이름 붙인다
- 못찾을 경우 mainDIsountPolicy 라는 이름의 스프링 빈을 추가로 찾는다
- @Primary 보다 우선순위가 높다
->
- Qualifier 끼리 매칭
- 빈 이름 매칭
- NoSuchBeanDefinitionException발생
@Primary 사용
- 우선순위 부영하는 방법
- Autowired 시 여러개 매칭되면 우선권을 가짐