본문 바로가기

Programing/Framework

[스프링] @Component에 대한 잘못 알고 있었던 것

내가 그 동안 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 "";

}

일종의 메타 애노테이션인 셈인데, '애노테이션의 정의에 부여된 애노테이션'의 의미이다.



스프링 레퍼런스 5장 10.1절에 보면

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를 권장하고 있었던 것이었다.