새소식

스프링

[매일메일] @Component, @Controller, @Service, @Repository의 차이에 대해서 설명해주세요.

  • -

@Component, @Controller, @Service, @Repository는 각 역할에 맞는 스프링빈을 등록할 때 사용하는 어노테이션으로 스프링의 컴포넌트 스캔에 의해 자동으로 빈으로 등록된다. @Controller, @Service, @Repository는 내부적으로 @Component를 포함한다.

 

@Component

가장 기본적인 어노테이션으로, 특정 역할에 종속되지 않는 일반적인 스프링 빈을 나타낸다. 공통 기능을 제공하는 유틸리티 클래스나, 특정 계층에 속하지 않는 일반적인 컴포넌트를 정의할 때 사용된다.

@Controller

스프링 MVC에서 웹 요청을 처리하는 컨트롤러 클래스에 사용된다.

 

Dispatcher Servlet은 뭔데요?

Dispatcher Servlet에 대해 알아보기 전에 아래 글에서 서블릿에 대해 알아보고 오자!⬇️ 서블릿이 뭐에요?스프링 MVC에 대해 공부하던 중 서블릿에 대한 나름대로의 정리가 필요할 것 같았다. 그래

dockerel.tistory.com

위 포스팅에서 스프링 MVC가 어떻게 설계되었는지, 그리고 @Controller가 동작하는 과정에 대해 알아볼 수 있다.

@Service

비즈니스 로직을 수행하는 서비스 클래스에 사용된다.

@Repository

DB와의 상호작용을 수행하는 클래스에 사용된다.

@Controller, @Service, @Repository 대신 @Component 사용하면?

@Controller 대신 @Component?

스프링 부트 3.0(스프링 프레임워크 6.0) 이전에는 @Component + @RequestMapping으로도 빈 및 핸들러로 등록이 되었다. 하지만 스프링 부트 3.0 이후부터 @Controller외에는 핸들러로 등록하지 않아 웹 요청이 정상적으로 처리되지 않는다.

자세한 내용은 이 커밋에서...

@Service 대신 @Component?

@Service 대신 @Component를 사용하는건 가능하긴 하지만 해당 레이어의 특징(비즈니스 로직 작성)을 명시하기 위해 사용한다고 보면 된다.

@Repository 대신 @Component?

@Repository를 사용하면 PersistenceExceptionTranslationPostProcessor에 의해 예외가 공통적인 예외(DataAccessException)으로 변환된다. 만약에 @Repository를 사용하지 않으면 데이터베이스마다 예외들에 다르기 때문에 결국 데이터베이스에 종속적인 코드를 작성할 수 밖에 없다.

AOP 적용시?

@Slf4j
@Aspect
@Component
public class LoggingAspect {

    @Around("@within(org.springframework.stereotype.Service)")
    public Object logServiceMethods(ProceedingJoinPoint joinPoint) throws Throwable {
        // 로깅 로직
    }
}

@Service, @Controller, @Repository를 사용하면 각각의 계층을 뚜렷하게 구분할 수 있으므로 위와 같이 AOP를 적용할 때 유용하다. 반대로 @Component 사용시 계층 구분이 불분명해져 AOP 적용이 어려울 수 있다. 위 AOP 로깅 코드는 서비스 레이어에만 적용될 수 있도록 구현한 것이다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.