어노테이션 기반 기본 설정

어노테이션 기반 설정

<context:component-scan base-package="…"/>

  • xml 파일에 직접 빈 등록 설정을 하지 않고, 자동으로 설정되게하는 엘리먼트이다.

  • 이 설정을 통해 스프링 컨테이너는 지정한 클래스 패스에 있는 클래스들 중 @Component 어노테이션이 붙은 클래스들을 스캔하고 빈으로 등록한다.

빈 등록을 위한 어노테이션

@Component("…")

  • 빈으로 등록하기위해 클래스 선언부 위에 설정하는 어노테이션이다.

  • 당연히 클래스의 기본 생성자가 있어야만 컨테이너가 빈으로 등록할 수 있다.

  • 또한, 컨테이너가 생성한 객체를 사용하기 위해서는 id나 name과 같은 이름을 설정해주어야 한다. 설정하지 않은 경우에는 자동으로 클래스명에서 앞글자를 소문자로 바꾼 이름으로 등록된다.

  • @Controller | @Service | @Repository 어노테이션들은 @Component를 상속한 것으로, 각각 MVC 역할을 수행하는 클래스임을 분류하고 인식되도록 하는 어노테이션들이다.

의존성 주입을 위한 어노테이션

@Autowired

  • 스프링에서 제공하는 어노테이션이다.

  • 객체의 타입을 이용하여, 등록된 빈들 중 일치하는 것을 찾아 주입하는 어노테이션이다. 주입하기위해서는 빈으로 등록된 객체이어야 한다.

  • 등록된 빈이 없거나 같은 타입으로 등록된 빈이 2개 이상이면, NoSuchBeanDefinitionException이 발생한다. 이를 방지하기 위해 required 속성을 false로 주거나 @Qualifier 어노테이션을 사용하면 된다.

  • 여기서 같은 타입의 빈이 여러개일 때 @Qualifier가 없이도 주입을 할 수 있다. 빈 이름을 변수명으로 사용하는 경우이다.

  • 다시 한번 정리해보면, 다음과 같다.

    • 객체 타입의 빈이 없다 -> ERROR

    • 객체 타입의 빈이 유일하다 -> OK

    • 객체 타입의 빈이 여러개다

      • 객체 이름과 같은 빈이 있다. -> OK

      • 객체 이음과 같은 빈이 없다 -> ERROR

@Qualifier

  • 스프링에서 제공하는 어노테이션이다.

  • 객체의 이름을 이용하여, 등록된 빈들 중 일치하는 것을 찾아 주입하는 어노테이션이다.

@Inject

  • 자바에서 제공하는 어노테이션이다.

  • 객체의 타입을 통해 주입하는 어노테이션으로 @Autowired와 유사하다.

@Resource

  • 스프링에서 제공하지 않고 자바에서 제공하는 어노테이션이다.

  • 객체의 이름을 이용하여 주입하는 어노테이션으로 @Qualifier와 유사하다.

댓글