코딩하는 오징어
자동인식을 이용한 빈등록: 스테레오타입 애노테이션과 빈스캐너 본문
오늘은 스프링의 빈 스캔에 대해서 알아보자.
모든 빈을 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 "";
}
'Framework > Spring' 카테고리의 다른 글
Spring & JPA의 Hibernate 설정시 주의 사항 & CandidateComponentsIndexLoader 클래스 (0) | 2018.07.28 |
---|---|
Spring web mvc & jpa - hibernate 빈 설정 (MAVEN) (0) | 2018.07.15 |
intellij에서 Spring 4 초기 환경 세팅에서 디비연동까지 한 번에 하기 (Maven & Mysql & Mybatis) (7) | 2018.03.09 |
Spring 4 하나 이상의 Dispatcher Servlet 설정하기 (1) | 2018.03.07 |
Spring 4 mvc에서 Restful API (0) | 2018.03.06 |