이 애노테이션들은 각각의 클래스를 특정 역할을 수행하는 Spring Bean으로 등록할 때 사용합니다. 각 애노테이션은 클래스가 어떤 역할을 하는지를 명시적으로 나타내며, Spring의 @ComponentScan 기능을 통해 자동으로 Bean으로 등록됩니다. @Controller, @Service, @Repository 애노테이션은 내부적으로 @Component 애노테이션을 포함하고 있습니다.
@Component 애노테이션은 가장 일반적인 형태의 빈 등록 애노테이션으로, 특정 역할에 종속되지 않는 일반적인 Spring Bean을 나타냅니다. 공통 기능을 제공하는 유틸리티 클래스나 특정 계층에 속하지 않는 일반적인 컴포넌트를 정의할 때 사용됩니다.
@Service 애노테이션은 비즈니스 로직을 수행하는 클래스에 사용됩니다. 다른 애노테이션과 비교하여 특별한 처리를 해주는 애노테이션은 아니고, 핵심 비즈니스 계층을 인식하는 데 도움을 줄 수 있습니다.
@Controller 애노테이션은 Spring MVC에서 웹 요청을 처리하는 컨트롤러 클래스에 사용되며 프레젠테이션 레이어의 Bean을 나타냅니다.
@Repository 애노테이션은 데이터베이스와의 상호작용을 수행하는 클래스에 사용되며, 데이터 액세스 레이어의 Bean을 나타냅니다.
@Controller, @Repository 대신 @Component를 사용하면 안되나요?
Spring 6(Spring Boot 3) 이전 버전에서는 @Component + @RequestMapping 으로도 Spring 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 애노테이션은 데이터 계층의 예외를 스프링 예외로 변환해주는 기능을 가지고 있습니다. @Componenet를 사용할 경우 특정 데이터 접근 기술에 종속되어 유지보수 비용이 높은 코드를 작성하게 되는 문제가 발생합니다.
'백엔드 면접' 카테고리의 다른 글
| TCP 3-way handshake에 대해서 설명해 주세요. (0) | 2024.12.10 |
|---|---|
| 동기 방식으로 외부 서비스(API)를 호출할 때 외부 서비스 장애가 나면 어떻게 조치할 수 있나요? (0) | 2024.12.09 |
| 동일성과 동등성에 대해서 설명해 주세요. (0) | 2024.12.06 |
| equals와 hashCode는 왜 함께 재정의해야 할까요? (0) | 2024.12.05 |
| JPA ID 생성 전략에 대해 설명해 주세요. (0) | 2024.12.05 |