본문 바로가기
Spring

[Spring/스프링] @Qualifier 구분자, 의존성 주입 시 위치

by LasBe 2022. 4. 2.
반응형

목차

    ⚡️시작하기 전


    스프링을 공부하며 생성자 주입 방식으로 의존성을 주입하는 도중

    같은 타입의 빈을 구별하기 위해 코드에 @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 어노테이션의 위치를 지정하는 방법을 소개합니다.

    1. 생성자 주입
    2. 필드 주입
    3. 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 주입 시엔 생성자와 동일하게 파라미터에 어노테이션을 선언해주면 됩니다.

    반응형

    댓글


    오픈 채팅