의존관계 주입 방법
1. 생성자 주입(권장하는 방법)
- 생성자를 통해서 의존 관계를 주입
- 생성자 호출시점에 딱 1번만 호출되는 것이 보장
- 불변, 필수(값이 무조건 필요) 의존관계에 사용
- ⚠생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입
2. 수정자(setter) 주입
- 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입
- 선택, 변경 가능성이 있는 의존관계에 사용
- 스프링은 빈을 생성하는 라이프사이클과 의존관계주입을 해주는 라이플 사이클로 나눠져 있다.
--> setter주입은 의존관계주입 시 사용(@Autowired를 보고 주입)
--> 생성자 주입은 빈을 생성할 때 주입
- @Autowired는 주입할 대상이 없으면 오류가 발생한다 -> @Autowired(required = false)지정
- 자바빈 프로퍼티 규약: setXxx, getXxx 라는 메서드를 통해서 값을 읽거나 수정하는 규칙
3. 필드 주입
- 필드에 바로 주입하는 방법
- 외부에서 변경이 불가능해서 테스트 하기 힘들다
- DI 프레임워크가 없으면 아무것도 할 수 없다.
- 그냥 사용하지 말자!
4. 일반 메서드 주입
- 일반 메서드를 통해서 주입
- 한번에 여러 필드를 주입 가능
- 잘 사용하지 않음
옵션 처리
1. @Autowired(required=false)
: 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨
@Autowired(required = false)
public void setNoBean1(Member member) {
System.out.println("setNoBean1 = " + member);
}
2. org.springframework.lang.@Nullable
: 자동 주입할 대상이 없으면 null이 입력된다.
@Autowired
public void setNoBean2(@Nullable Member member) {
System.out.println("setNoBean2 = " + member);
}
3. Optional<>
: 자동 주입할 대상이 없으면 Optional.empty
@Autowired(required = false)
public void setNoBean3(Optional<Member> member) {
System.out.println("setNoBean3 = " + member);
}
롬복 lombok
- 생성자가 딱 1개만 있으면 @Autowired 를 생략
- 롬복 라이브러리가 제공하는 @RequiredArgsConstructor 기능을 사용
-> final이 붙은 필드를 모아서 생성자를 자동 생성
- 자주쓰는 롬복, @Getter, @Setter, @ToString... 등
조회 빈이 2개 이상
@Autowired 필드 명 매칭
- 타입매칭을 시도 => 여러 빈이 있으면 필드 이름, 파라미터 이름으로 추가 매칭(같으면 가져 옴)
@Qualifier 사용(추가 구분자)
- @Qualifier("A(추가적인 이름)")
- @Autowired타입 매칭 => @Qualifier끼리 매칭
=> A라는 이름의 스프링 빈을 추가로 찾는다(추천 안함)
@Primary
- 우선순위 지정
- 여러 빈 중에 @Primary가 우선적으로 선정
활용
메인 데이터베이스의 커넥션을 획득하는 스프링 빈은 @Primary 를 적용,
서브 데이터베이스 커넥션 빈을 획득할 때는 @Qualifier 를 지정해서
명시적으로 획득 하는 방식으로 사용하면 코드를 깔끔하게 유지 가능.
(우선순위: @Qualifier가 @Primary보다 우선순위가 높다)
애노테이션 직접 만들기
조회한 빈이 모두 필요할 때, List, Map
자동, 수동의 올바른 실무 운영 기준