Spring, CS 공부 내용 10

김정용·2025년 2월 10일

기술면접 공부

목록 보기
10/15
post-thumbnail

@Component, @Controller, @Service, @Repository

SpringBoot 개발을 하면서 밥먹듯이 나오는 어노테이션들이다.

해당 어노테이션들의 역할과 차이에 대해 설명한다.

각 어노테이션들은 클래스파일을 특정역할을 수행하는 Spring Bean으로 등록할 때 사용된다.

Spring에 있는 @ComponentScan 기능을 사용하여 자동으로 Bean 등록이 수행된다.

@Component

뒤에 나올 @Controller, @Service, @Repository 어노테이션들은 내부적으로 @Component 어노테이션을 사용한다.

@Component 어노테이션은 가장 일반적인 형태로 특정 역할에 종속되지 않는 기본적인 Spring Bean을 나타낸다.

보통 공통기능을 제공하는 유틸 클래스나, 특정 계층에 소속되지 않는 클래스를 컴포넌트로 정의할 때 사용된다.

@Controller

Spring MVC에서 웹 요청을 직접적으로 받는 컨트롤러 클래스에 사용되며 프레젠테이션 레이어의 Bean을 타나낸다.

엔드포인트라는 경로를 통해 웹에서 받은 요청을 Service 단으로 넘겨주는 역할을 수행한다.

@Service

어노테이션 중 가장 중요하다고 생각되는 어노테이션이다.

서비스의 핵심 비즈니스 로직을 수행하는 클래스가 이 @Service 어노테이션을 달고 서비스 레이어의 Bean을 나타낸다.

@Repository

DB와의 상호작용을 하는 클래스에 사용된다. 데이터 엑세스 레이어의 Bean을 나타낸다.

@Controller, @Service 등의 어노테이션이 내부적으로 @Component를 사용한다고 하는데 그렇다면 @Component 어노테이션으로 대체 가능한가?

Spring 6 이전 버전에서는 사용 가능했다!

@Controller

@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

@Repository 어노테이션은 어떨까?

@Repository 를 @Component로 대체하게되면 PersistenceExceptionTranslationPostProcessor 때문에 DataAccessException으로 예외가 반환되지 않는다.

데이터 엑세스 계층에서 발생하는 예외처리를 하는데에 좋지 않은 영향을 미칠 수 있다.

굳이

@Controller, @Service, @Repository 등의 어노테이션은 이름에서도 바로 클래스의 역할을 알 수 있다.

계층 관계를 확실하게 나타낼 수 있는 어노테이션을 사용하는게 개발하면서의 이점을 가져 올 수 있다.

AOP 포인트컷

AOP 포인트 컷은 어떤 메소드에 대해 공통 관심사를 적용할지 지정 하는 역할을 한다.

@Controller, @Service, @Repository 어노테이션을 사용하게되면 AOP 포인트 컷을 정의할때 빈의 역할을 확실히 알 수 있기에 범위와 구분을 명확히 할 수 있다.

참고

면접 질문 내용과 답변의 일부는 기술 면접 구독 서비스 - 매일메일 에 있다.
흥미로웠다면 구독해보는 것도 추천한다!

profile
누군가의 롤모델이 될 때까지😇

0개의 댓글