목차
⚡️시작하기 전
스프링을 공부하며 생성자 주입 방식으로 의존성을 주입하는 도중
같은 타입의 빈을 구별하기 위해 코드에 @Qualifier를 사용했습니다.
그런데 이리저리 옮겨봐도 오류가 나는 바람에 한참의 시도 끝에 성공 후,
구글에도 자료가 잘 보이지 않아 저와 같은 오류를 겪을 분들을 위해 글을 남겨봅니다.
⚡️@Qualifier 어노테이션
@Qualifier 어노테이션은 빈을 탐색할 때 같은 타입의 클래스를 @Autowised로 부터 구별할 수 있게 해줍니다.
아래는 Travel 클래스에 Camera 타입의 객체를 주입하려고 할 때 같은 타입이 2개 이상 존재하면 발생하는 오류입니다.
@Component
public class SonyCamera implements Camera {
@Override
public void shooting() {
System.out.println("소니 카메라로 사진을 찍었습니다.");
}
}
/////////////////////////////////////////////////////////////////////////
@Component
public class CannonCamera implements Camera{
@Override
public void shooting() {
System.out.println("캐논 카메라로 사진을 찍었습니다.");
}
}
@Component
public class Travel {
private final Camera camera;
@Autowired
public Travel(Camera camera) {
this.camera = camera;
}
public void photography() {
camera.shooting();
}
}
이러한 오류는 컨테이너가 빈을 탐색할 때 동일한 타입의 클래스가 2개 이상 발견됐지만 서로 구분할 수 없어서 발생합니다.
이 때 @Qualifire 어노테이션을 이용해 같은 타입의 빈들을 구분지어 인식할 수 있게 만들 수 있습니다.
그럼 @Qualifire의 사용법부터 알아보겠습니다.
⚡️@Qualifier 사용법
@Qualifire("[빈 이름]")
간단하게 위와 같이 어노테이션과 식별할 빈의 이름을 넣어주면 끝입니다!
빈의 이름은 등록 시 직접 지정해준게 아니라면 클래스의 이름의 첫 알파벳을 소문자로 변환한 것이 됩니다.
예를들어 [클래스 : Hello] => [빈 이름 : hello] 이런 식으로요.
그럼 의존성을 주입하는 3가지 방법에 대해 @Qualifier 어노테이션의 위치를 지정하는 방법을 소개합니다.
- 생성자 주입
- 필드 주입
- setter 주입
📌 생성자 주입
@Component
public class Travel {
private final Camera camera;
@Autowired
public Travel(@Qualifier("cannonCamera") Camera camera) {
this.camera = camera;
}
public void photography() {
camera.shooting();
}
}
생성자 주입에서는 파라미터 부분에 어노테이션을 추가하면 됩니다.
📌 필드 주입
@Component
public class Travel {
@Autowired
@Qualifier("sonyCamera")
private Camera camera;
public void photography() {
camera.shooting();
}
}
필드에 주입할 때는 그저 필드위에 @Autowired와 @Qualifire를 함께 선언해주면 됩니다.
📌 setter 주입
@Component
public class Travel {
private Camera camera;
@Autowired
public void setCamera(@Qualifier("sonyCamera") Camera camera) {
this.camera = camera;
}
public void photography() {
camera.shooting();
}
}
setter 주입 시엔 생성자와 동일하게 파라미터에 어노테이션을 선언해주면 됩니다.
'Spring' 카테고리의 다른 글
[Spring/스프링] ComponentScan, XML & Java 사용법 (0) | 2022.04.05 |
---|---|
[Spring/스프링] 싱글톤 패턴(Singleton pattern) 과 @Scope prototype (0) | 2022.04.02 |
[Spring/스프링] @Configuration @Bean 스프링 설정 클래스 생성하기 (0) | 2022.04.01 |
[Spring/스프링] 제어의 역행(IoP)과 의존성 주입(Dependency Injection, DI) (0) | 2022.03.31 |
[Spring/스프링] 스프링 프레임워크의 특징, 사용하는 이유 (0) | 2022.03.29 |
댓글