본문 바로가기
Spring

Spring - @Component @Service Annotation 들의 차이

by 오늘부터개발시작 2022. 8. 9.

Spring을 사용하면 어노테이션을 사용해서 편리하게 개발할 수 있다. 서비스, 레포지토리, 컨트롤러 등등에서 다양한 어노테이션들을 사용해왔을 것이다. 어노테이션이 생기기 전에는 xml 파일에 일일히 객체들을 등록해주었어야 했다. 그 복잡한 xml 파일 대신 어노테이션 하나로 처리할 수 있다니 얼마나 행복한 세상인지 비교가 되지 않는다. 그런데 어노테이션을 사용하기는 하지만 어떤 차이가 있는지에 대해서는 잘 모르는 경우가 많다. 오늘은 어노테이션이 어떻게 다른지에 대해서 알아보도록 하자.

 

먼저 자주 쓰이는 어노테이션들을 정리해보자. 

@Repository

@Component

@Controller

@RestController

@Service

 

주로 쓰이는 어노테이션들은 이 정도 일 것 같다. 놀랍게도 여기에 사용된 어노테이션들은 사실 @Component를 상속한 어노테이션들이다. 결국엔 @Component와 동일한데 이름만 다르거나 추가적으로 다른 기능이 조금씩 들어가있는 것이다. 

 

@Service vs @Component

@Service와 @Component는 사실상 다른게 없는 어노테이션이다. 단지 기능을 정확히 명시적으로 구분하기 위해 존재한다. @Service는 비즈니스 로직을 구현하는 객체에 사용하고 @Component는 원형에 가까운 객체에 사용하면 좋다. 

 

@Respoistory vs @Component

@Repository는 @Component와는 조금 다르다. @Repository는 Spring에서 지원하지 않는 데이터베이스 Exception을 Spring based Unchecked Exception으로 변환시켜주는 역할을 한다. 예를 들면, Hibernate를 사용할 때 Spring template이 아닌 JDBC Template 같은 객체를 사용해서 데이터베이스와 통신하기 때문에 에러가 났을 때 Spring이 알 수 있는 에러로 변환시켜주는 것이다. 이 때문에 트랙잭션 과정 중 데이터베이스 에러가 발생해도 Spring에서 롤백을 해줄 수 있는 이유이다. 

 

@Controller vs @Component

@Controller와 @Component와 @RequestMapping을 합쳐놓은 어노테이션이라고 보면 된다. @Controller의 자리에 @Component를 넣으면 view를 제대로 반환해주지 못한다. @Controller의 주석을 보면 @RequestMapping과 Combination으로 사용된다고 적혀있는데 @Component와 @RequestMapping을 같이 쓰면 @Controller와 동일하게 작동한다. @Controller는 결국 @Component = Bean과 @RequestMapping = URL을 매핑시켜주는 역할을 하는 것이다. 다른 내용이지만 Dispatcher Servlet이 이렇게 만들어진 짝을 보고 요청을 위임하게 된다. 

 

 

그렇다면 @RestController와 @Controller는 도대체 무슨 차이인지 궁금하신 분들이 있을텐데 그 차이는 다른 포스팅에서 알아보려고한다. 차이를 알아보면서 Spring이 어떻게 요청을 처리하는지에 대해서도 같이 알아보면 좋을 것 같다.