메시지 큐 리스너에 대한 피드백을 받으면서 @Service 어노테이션을 사용하신 분도 있고,
@Component 어노테이션을 사용하신 분도 있어 헷갈리지 않게 다시 정리하려고 한다.
그래서 난?
@Slf4j
@Component
@RequiredArgsConstructor
public class OrderQueue {
}
내 선택은 @Component 였다.
OrderQueue 라는 클래스를 만들어 Listener 를 처리하지만, 이 부분이 비즈니스 로직과 연관되어있지 않으므로 @Component 어노테이션을 붙여 빈 등록했다.
내 방식이 맞지만 좀 더 정확하게 이유를 정리하려고 한다.
@Component
- 일반적인 스프링 빈 인식을 위한 어노테이션이다.
- @Service 와 같이 스프링 빈을 등록되는데 사용되지만 특정 계층(서비스, 컨트롤러, 리포지토리)에 속하지 않는 일반적인 클래스를 등록하는데 사용하는 어노테이션이다.
@Service

- @Component 어노테이션과 같이 스프링 빈 등록되는데 사용하지만, spring.io 에 따라 비즈니스 레이어에 있는 빈에 마킹하도록 가이드가 되어있다.
- 그에 따라 @Service 어노테이션은 트랜잭션 관리, 예외 처리 등 서비스 계층에 필요한 추가적인 기능을 제공할 수 있다.
- 또, 서비스 계층이라는 것을 명시적으로 나타낸다.
주요 차이점
역할
- @Component 어노테이션은 일반적인 클래스를 스프링 빈으로 등록할 때 사용되고, @Service 어노테이션은 서비스 계층의 클래스를 스프링 빈으로 등록할 때 사용한다.
의미
- @Service 어노테이션은 클래스가 서비스 계층에 속한다는 것을 명시적으로 나타내어 코드의 가독성과 유지보수성을 향상시킨다.