본문 바로가기
Back-End/Spring Boot

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

by 코젼 2025. 3. 17.
728x90
반응형

각각의 클래스특정 역할을 수행하는 Spring Bean으로 등록할 때 사용된다. 각 애너테이션은 클래스가 어떤 역할을 하는지를 명시적으로 나타내며, Spring@ComponentScan 기능을 통해 자동으로 Bean으로 등록된다. 모두 내부적으로 @Component 어노테이션을 사용하고 있

특징과 용도

  • @Component는 가장 일반적인 형태의 어노테이션으로, 특정 역할에 종속되지 않는 일반적인 Spring Bean을 나타낸다. 공통 기능을 제공하는 유틸리티 클래스나, 특정 계층에 속하지 않는 일반적인 컴포넌트정의할 때 사용된다.
  • @Service는 비즈니스 로직을 수행하는 클래스에 사용되며 서비스 레이어의 Bean을 나타낸다.
  • @Controller는 Spring MVC에서 웹 요청처리하는 컨트롤러 클래스에 사용되며 프레젠테이션 레이어의 Bean을 나타낸다.
  • @Repository는 데이터베이스와의 상호작용을 수행하는 클래스에 사용되며. 데이터 액세스 레이어의 Bean을 나타낸다.

@Controller, @Repository 대신 @Component 를 사용할 수 있는가?

Spring 6(Spring Boot 3) 이전 버전에서는 @Component + @RequestMapping으로도 Bean 및 핸들러로 등록되었지만, Spring 6 이후 부터 @Controller 외에는 핸들러로 등록하지 않아 웹 요청을 정상적으로 수행할 수 없다.

public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMapping
		implements MatchableHandlerMapping, EmbeddedValueResolverAware {
    ...
    @Override
    protected boolean isHandler(Class<?> beanType) {
		// 컨트롤러 애너테이션인지 확인
        return AnnotatedElementUtils.hasAnnotation(beanType, Controller.class);
    }
    ...
}

@Repository@Component로 대체할 경우, PersistenceExceptionTranslationPostProcessor 에 의해 예외DataAccessException으로 변환되지 않는다. 이 경우 데이터 액세스 계층에서 발생하는 예외 처리영향을 미칠 수 있다.

  • PersistenceExceptionTranslationPostProcessor 빈의 담당 역할: Spring 에서는 JPA 예외(EntityNotFoundException, ConstraintViolationException 등) 을 Spring의 DataAccessException 으로 변환하여 일관된 방식으로 예외를 처리할 수 있도록 함.
  • 이 프로세서는 @Repository 어노테이션이 붙은 클래스에서 발생하는 예외만 변환해줌.
    • @Repository 가 달린 클래스를 감지해서 AOP 기반의 예외 변환 기능을 적용하는 방식.
  • @Component 를 사용해야 하는 특수한 이유가 있는 경우, 수동으로 예외 변환을 해주어야 함.

@Service, @Controller, @Repository는 각각 특정 계층을 나타내므로, AOP포인트컷정의할 때 유용하게 사용될 수 있다. @Component를 사용하면 이러한 계층 구분이 불분명해져 AOP 적용이 어려울 수 있다.

728x90
반응형

'Back-End > Spring Boot' 카테고리의 다른 글

Spring Event Publisher/Listener  (0) 2024.08.09
트랜잭션 전파  (0) 2024.07.26
@Transactional  (0) 2024.07.15
Spring Controller header 값 가져오기  (0) 2024.07.10
데이터베이스 decimal 타입 JPA 에서 표현하기  (0) 2024.07.09

댓글