내가 그 동안 autowire를 사용하면서 @Component에 대해 잘못 알고 있는 것 같아 정리를 해보았다.
나는 @Component가 @Repository, @Service, @Controller 등보다 더 작은 의미의 사전 그대로의 의미인 '컴포넌트' (구성단위)인줄 알았다.
개념상으로 일종의 @Component는 @Service보다 작은 단위라고 생각했던 것이다.
그런데 막상 찾아보니 @Service는 @Component의 구체적인 역할을 나타내는 세부적인 관점이었다.
코드로 예를 들자면
org.springframework.stereotype 패키지에 있는 Component 애노테이션은 다음과 같이 정의되어 있다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {
/**
* 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
*/
String value() default "";
}
Service 애노테이션은 다음과 같이 @Componet애노테이션이 붙어서 정의가 되어 있다.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
/**
* 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
*/
String value() default "";
}
일종의 메타 애노테이션인 셈인데, '애노테이션의 정의에 부여된 애노테이션'의 의미이다.
Spring provides further stereotype annotations: @Component
, @Service
, and @Controller
. @Component
is a generic stereotype for any Spring-managed component.@Repository
, @Service
, and @Controller
are specializations of @Component
for more specific use cases, for example, in the persistence, service, and presentation layers, respectively. Therefore, you can annotate your component classes with @Component
, but by annotating them with @Repository
, @Service
, or@Controller
instead, your classes are more properly suited for processing by tools or associating with aspects.
더 나아가(레퍼런스의 이 단락 바로 전에 @Repository에 대해 먼저 언급했다) 스프링은 다음과 같은 스테레오타입 애노테이션들을 제공한다: @Component, @Service, @Controller
@Component는 어떤 스프링이 관리하는 컴포넌트를 나타내는 일반적인 스테레오 타입이다.
좀더 세부적인 유스 케이들을 위하여 @Component의 구체화된 형태로 @Repository, @Service, @Controller들이 있다.
예)
애노테이션 |
유스케이스 |
@Repository |
퍼시스턴스(persistence) 레이어, 영속성을 가지는 속성(파일, 데이터베이스 등) |
@Service |
서비스 레이어 |
@Controller |
프레젠테이션 레이어 |
따라서 당신의 컴포넌트 클래스들에 @Component를 붙일 수 있지만, @Repository, @Service, @Controller를 붙인다면 도구들이 클래스들을 처리하는데 더 적합하도록 할 수 있고 관점(aspects)에 더 연관성을 부여할 수 있다.
여하튼 스프링에서도 @Component보다는 @Repository, @Service, @Controller를 권장하고 있었던 것이었다.
'Programing > Framework' 카테고리의 다른 글
[Spring] @Controller에서 @RequestParam로 Date 타입 받기. (0) | 2016.09.08 |
---|---|
logback - 사람이 보기 좋게 하기 위해 패딩(padding)을 넣자. (0) | 2016.08.11 |
[스프링] ibatis / mybatis의 스프링4 지원 중단? (0) | 2015.05.14 |
[아키텍쳐] 마이크로 서비스 아키텍쳐(MSA) (0) | 2015.01.06 |
OpenCV (0) | 2012.11.29 |