본문 바로가기
개발/스프링부트

@Component, @Controller, @Service, @Repository의 차이

by hamcheeseburger 2022. 5. 8.

학습 동기

계층별로 해당 어노테이션을 구분하는 이유가 궁금하여 학습하게 됨

 

공식문서 파헤치기

@Component 와 다른 정형화된 annotation들

@Repository는 레포지토리(데이터 접근 객체로 알려져 있는)의 정형화 또는 역할을 하는 클래스를 위한 어노테이션이다. 많은 사용법 중 가운데 이 어노테이션은 Exception Translation에서 묘사된것처럼 자동으로 예외를 변환한다.

어떤 예외를 어떻게 변환한다는 것일까? 낮은 레벨의 영속성 예외를 높은 레벨의 스프링 예외로 변환한다는 것이다.

Spring은 우리가 선택한 선택한 ORM 툴(JPA, Mybatis 등)로 부터 일반적인 데이터 접근 예외들을 감쌀 수 있다. Checked exception들을 일반적인 런타임 예외인 DataAccessException으로 변환한다. 이러한 변환은 복구불가능한 영속계층의 예외를 처리할 수 있게 되고 지겨운 예외 선언과 catches/throws 키워드로 부터 벗어나게 해준다. 

 

@Component는 스프링에서 관리하는 컴포넌트에 대한 포괄적으로 정형화된 타입이다. @Repository, @Service, @Controller는 @Component의 특수한 사용 방법에 대해 한정된 어노테이션들이다.

그러므로 당신은 당신의 컴포넌트 클래스에 @Component를 쓸 수 있지만 @Repository, @Service, @Controller를 사용하면 사용 용도에 따라 적절하게 맞추어질 것이다.
예를 들면 이러한 정형화된 어노테이션들은 수정에 용이한 대상이 된다. @Repository, @Service, @Controller는 스프링 프레임워크가 추후에 릴리즈 될 때 추가적인 의미들을 가질 수 있기 때문이다.

그러므로 Service 레이어에서 @Component와 @Service 중 하나를 고를 때, @Service 사용하는 것이 분명히 더 좋은 선택이다. 이와 비슷하게 앞에서 말했다시피, @Repository는 영속성 계층에서 자동으로 예외를 변환하는 표식자로서 이용할 수 있다.

위의 말을 요약하자면, @Component는 @Repository, @Service, @Controller의 공통점을 가지는 어노테이션이다. 

@Component을 사용하면 Spring이 자동으로 커스텀 빈으로 인식할 수 있다.

즉 @Controller, @Repository, @Service를 특정 클래스에 사용하면 @Component를 사용한 것과 같이 Spring이 커스텀 빈으로 인식한다는 것이다.

 

실제로 @Service, @Controller, @Repository에 @Component이 적용되어 있는 것을 확인 할 수 있다.

위의 글에서는 @Repository와 @Component에 대한 기술적인 차이점을 중점으로 다룬 것 같다.

하지만 @Repository 말고도 @Controller에서도 중요한 차이점이 있다.

 

@RequestMapping은 @Controller 아래서만 사용할 수 있다는 것이다. (다른 어노테이션 아래 사용하면 runtime error 발생)

Dispatcher Servlet이 @RequestMapping이 적용된 클래스에 @Controller가 적용되어 있는지 확인하기 때문이다.

 

@Service는 다른 어노테이션과 다르게 @Component와 다른 차이점이 없다.

하지만 추후에 스프링 프레임워크가 업데이트 될 때 다른 기능이 추가될 수 있으므로, Service 레이어에서는 @Component보다 @Service를 사용하는 것이 더 적절하다.

 

요약

@Component

- 스프링 빈으로 등록하는 역할

- @Repository, @Service, @Controller의 포괄적인 어노테이션

 

@Controller

- @Component의 세부화 된 어노테이션

- @RequestMapping을 사용할 수 있음

- Presentation layer에 걸맞는 어노테이션

 

@Service

- @Component의 세부화 된 어노테이션

- @Component와 구별되는 점은 현재로는 딱히 없음

- Business layer에 걸맞는 어노테이션

- Business layer에서는 명시적으로 @Component보다 @Service를 사용할 것

 

@Repository

- @Component의 세부화 된 어노테이션

- 낮은 레벨의 영속성 예외를 높은 레벨의 스프링 예외로 변환

- Persistence layer에 걸맞는 어노테이션

 

 

 

출처 : https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-stereotype-annotations

 

이전 댓글