Developer/Spring eGov4.0 (Java11, Tomcat9)

Spring , @Autowired & @Qualifier 를 활용한 bean 주입

단님 2024. 9. 25. 00:06
728x90
스프링 프레임 워크의 의존성 주입,
@Autowired & @Qualifier 는 의존성 주입을 할 떄 사용하는 애노테이션.
의존성 주입은 스프링이 자동으로 객체를 생성해주고 , 이를 필요한 곳에 주입하는 방식을 말한다.

 

@Autowired 
@Autowired를 붙이면 , 스프링이 알아서 해당 타입의 빈을 찾아 멤버 변수에 넣어준다.
대입의 역할만 하는거고 직접 인스턴스를 생성하는 것이 아니기 때문에,
인스턴스는 미리 bean으로 생성이 되어 있어야한다.
스프링은 @Autowired를 보고 메모리에 있는 타입이 일치하는 객체를 자동으로 주입해준다.
속성으로는 required가 있다.
@Autowired(required = false)로 설정하면, 주입할 빈이 없을 때 오류를 발생시키지 않고 null을 주입
이를 통해 나중에 빈이 없을 때의 오류를 처리할 수있다.

 

@Component
class Speaker {
    // Speaker 클래스가 스프링 빈으로 등록됨
}

@Component
class TV {
    @Autowired(required = false)
    private Speaker speaker; // Speaker 빈이 없으면 null이 주입됨
}

 

@Qualifier
@Autowired 는 타입에 따라 빈을 자동으로 주입하는데 , 만약 같은 타입의 빈이 여러개 있을 경우 어떤 빈을 주입할지 명확하지 않으면 오류가 발생된다. 이럴때 @Qualifier를 사용하여 특정 이름을 가진 빈을 지정할 수 있다.

만약 같은 타입의 빈이 여러개 있을 경우
@Qualifier 로 구체적으로 지정하지 않으면, NoUniqueBeanDefinitionException 이라는 오류가 발생

 

 

  • Speaker 인터페이스를 구현한 두 개의 클래스 (SpeakerA와 SpeakerB)가 있다고 가정해 본다.
  • @Qualifier("spa")는 "spa"라는 이름의 빈을 주입하겠다는 뜻이다.
public interface Speakeri {
    // Speaker 인터페이스
}

@Component("spa")
class SpeakerA implements Speakeri {
    // SpeakerA가 스프링 빈으로 등록됨
}

@Component("spb")
class SpeakerB implements Speakeri {
    // SpeakerB가 스프링 빈으로 등록됨
}

@Component
class TV {
    @Autowired(required = false)
    @Qualifier("spa") // "spa"라는 이름의 빈을 주입
    private Speakeri speaker; 
}

 

 

 

Spring 의 어플리 케이션 실행 순서

 

 

  • XML 설정에 따른 빈 스캔: @Component가 붙은 클래스들을 스캔하여 스프링 빈으로 등록.
  • 빈의 주입: @Autowired나 @Qualifier에 따라 적절한 빈을 찾아서 주입.
  • 메인 실행: main() 메소드가 실행되면서 실제 프로그램이 동작.

즉 , 스프링의 실행 순서: 빈 생성 → 의존성 주입 → 프로그램 실행.