@Autowired
애노테이션을 통해 스프링 빈을 자동주입하지만, 주입할 스프링 빈이 없어도 동작을 해야할 상황이 생길 수 있다.
자동 주입할 대상을 옵션으로 처리하는 방법은 다음과 같다.
🖐️ 1. @Autowired(required=false)
: 기본값은 required = true
로, 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 X
🖐️ 2. Optional<>
: 자동 주입할 대상이 없으면 Optional.empty 가 입력된다.
🖐️ 3. org.springframework.lang.@Nullable
: 자동 주입할 대상이 없으면 null이 입력된다.
의존관계 주입 방법에는 생성자 주입
, 수정자 주입
, 필드 주입
, 일반 메서드 주입
크게 4가지가 존재한다.
대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없기에 불변하도록 설계 가능한 생성자 주입을 권장한다.
이런 생성자 주입을 편리하게 도와주는 라이브러리가 바로 롬복(Rombok) !
롬복 라이브러리가 제공하는 @RequiredArgsConstructor
기능을 사용하면 final
이 붙은 필드를 모아서 생성자를 자동으로 만들어준다.
❗ 오직 생성자 주입 방식만이
final
예약어를 사용할 수 있다. 컴파일 시점에 오류를 잡아줄 수 있는fianl
예약어를 활용하자 !
@Autowired
애노테이션의 경우, 해당 스프링 빈의 타입(Type)으로 조회한다.
2개 이상의 같은 타입 클래스가 스프링 빈이 조회됐을 경우
: NoUniqueBeanDefinitionException
오류 출력
이를 해결할 수 있는 방법은 크게 3가지가 존재한다.
🖐️ 1. @Autowired
필드 명을 통한 해결방법
: @Autowired
은 타입 매칭을 시도하고, 여러 빈이 존재하면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭하므로, 필드 명으로 빈 이름을 등록해보자 !
🖐️ 2. @Qualifier
해결방법
: @Qualifier
는 추가 구분자를 붙여주는 방법이다. 주입시 추가적인 방법을 제공하는 것으로, 빈 이름을 변경하는 것은 아니다.
🖐️ 3. @Primary
해결방법
: @Primary
우선순위를 정하는 애노테이션으로, 여러 빈이 매칭되면 @Primary
가 우선권을 가진다
❗
@Qualifier
가@Primary
보다 우선권이 높다.
📌 본 포스트는 스프링 핵심 원리 - 기본편 통해 학습한 내용을 요약 및 정리한 것입니다.