코딩하는 오징어

자동인식을 이용한 빈등록: 스테레오타입 애노테이션과 빈스캐너 본문

Framework/Spring

자동인식을 이용한 빈등록: 스테레오타입 애노테이션과 빈스캐너

코딩하는 오징어 2018. 3. 28. 22:52
반응형

오늘은 스프링의 빈 스캔에 대해서 알아보자.

 모든 빈을 XML에 일일이 선언하는 것이 귀찮게 느껴질 수 있다. 이때, XML문서와 같이 한곳에 명시적으로 선언하지 않고도 스프링 빈을 등록하는 방법이 있다. 빈으로 사용될 클래스에 특별한 애노테이션을 부여해주면 이런 클래스를 자동으로 찾아서 빈으로 등록하게 해줄 수 있다. 이렇게 특정 애노테이션이 붙은 클래스를 자동으로 찾아서 빈으로 등록해주는 방식을 빈 스캐닝을 통한 자동인식 빈 등록 기능이라고 하고, 이런 스캐닝 작업을 담당하는 오브젝트를 빈 스캐너(scanner)라 한다. 스프링의 빈 스캐너는 지정된 클래스패스 아래에 있는 모든 패키지의 클래스를 대상으로 필터를 적용해서 빈 등록을 위한 클래스들을 선별해낸다. 빈 스캐너에 내장된 디폴트 필터는 @Component 애노테이션이 또는 @Component를 메타 애노테이션으로 가진 애노테이션이 부여된 클래스를 선택하도록 되어있다. 이를 이용하면 @Component등의 애노테이션을 지정하는 것만으로도 빈 등록이 가능하다. @Component를 포함해 디폴트 필터에 적용되는 애노테이션을 스프링에서는 스테레오타입(stereotype) 애노테이션이라고 부른다. 예제 코드를 보자 먼저 빈 캐너를 이용하기 위해서는 컨텍스트 파일에 다음과 같이 선언하여야한다.

<context:component-scan base-package="com.codingsquid.spring4Tutorial" />

 위와 같이 스캔할 패키지를 설정 해준 후 다음과 같이 클래스 위에 애노테이션을 달면 된다.

@Component
@Aspect
public class CheckSessionValid {

private SessionTokenRedisRepository sessionTokenRedisRepository;

@Autowired
public CheckSessionValid(SessionTokenRedisRepository sessionTokenRedisRepository) {
this.sessionTokenRedisRepository = sessionTokenRedisRepository;
}

 CheckSessionValid 클래스는 스테레오타입 애노테이션인 @Component가 붙어 있으므로 빈 스캐너가 감지해서 자동으로 빈으로 등록해주는 후보가 된다. 하나의 빈이 등록되려면 최소한 아이디와 클래스 이름이 메타정보로 제공돼야 한다. 빈 스캐너가 클래스를 감지하는 것이니 클래스 이름은 간단히 가져올 수 있다. (기본적으로 클래스 이름을 빈의 아이디로 사용한다. 정확히는 클래스 이름의 첫 글자만 소문자로 바꾼 것을 사용한다.)


 빈의 이름을 클래스 이름과 다르게 지정하고 싶다면 다음과 같이 작성하면 빈의 이름이 설정된다.

@Component("codingsquid")
@Aspect
public class CheckSessionValid {

private SessionTokenRedisRepository sessionTokenRedisRepository;

@Autowired
public CheckSessionValid(SessionTokenRedisRepository sessionTokenRedisRepository) {
this.sessionTokenRedisRepository = sessionTokenRedisRepository;
}

 애노테이션으로 빈 설정을 하게되면 편리하지만 단점 또한 있다. 빈 스캔에 의해 자동등록되는 빈은 XML처럼 상세한 메타정보 항목을 지정할 수 없고, 클래스당 한 개 이상의 빈을 등록할 수 없다는 제한이 있다.


 추가적으로 다음과같은 스테로타입 애노테이션들이있다.


스테레오타입 애노테이션

적용 대상

@Repository

데이터 액세스 계층의 DAO 또는 리포지토리 클래스에 사용된다. DataAccessException 자동변환과 같은 AOP의 적용 대상을 선정하기 위해서도 사용된다. 

@Service 

서비스 계층의 클래스에 사용된다. 

@Controller

프레젠테이션 계층의 MVC 컨트롤러에 사용된다. 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정된다. 


 사실 위의 애노테이션들을 타고 들어가보면 다음과같이 @Component가 붙어있다.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {

/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
*/
String value() default "";

}


반응형
Comments