Backend
[매일메일] @Component, @Controller, @Service, @Repository의 차이점에 대해서 설명해주세요.
· 7분 읽기
@Component, @Controller, @Service, @Repository의 차이점에 대해서 설명해주세요.
1. 직접 조사(구글링, 공식문서, 기술 포스팅 등으로 학습)
<table style="border-collapse: collapse; width: 100%; height: 425px;" border="1" data-ke-align="alignLeft"><tbody><tr style="height: 42px;"><td style="height: 42px; width: 16.279%;">어노테이션</td><td style="height: 42px; width: 12.2094%;">적용 계층</td><td style="height: 42px; width: 16.5116%;">주요 역할</td><td style="height: 42px; width: 30.9302%;">스프링의 추가 기능</td><td style="height: 42px; width: 23.9535%;">코드 예시</td></tr><tr style="height: 85px;"><td style="height: 85px; width: 16.279%;"><b>@Component</b></td><td style="height: 85px; width: 12.2094%;">전 계층 (범용)</td><td style="height: 85px; width: 16.5116%;">스프링 IoC 컨테이너에 빈(Bean)으로 등록</td><td style="height: 85px; width: 30.9302%;">- 의존성 주입(DI) 대상이 될 수 있음<br>- 특별한 기능 없음 (단순 빈 등록)</td><td style="height: 85px; width: 23.9535%;">java<br>@Component<br>public class MyUtil {...}<br></td></tr><tr style="height: 85px;"><td style="height: 85px; width: 16.279%;"><b>@Repository</b></td><td style="height: 85px; width: 12.2094%;">Persistence Layer (DAO/DB)</td><td style="height: 85px; width: 16.5116%;">데이터베이스와 직접 상호작용하는 DAO 정의</td><td style="height: 85px; width: 30.9302%;">- 발생한 DB 관련 예외를 DataAccessException 계열 예외로 변환 (예외 번역)<br>- 컴포넌트 스캔 시 자동 빈 등록</td><td style="height: 85px; width: 23.9535%;">java<br>@Repository<br>public class UserRepository {...}<br></td></tr><tr style="height: 64px;"><td style="height: 64px; width: 16.279%;"><b>@Service</b></td><td style="height: 64px; width: 12.2094%;">Service Layer (비즈니스 로직)</td><td style="height: 64px; width: 16.5116%;">도메인/비즈니스 로직 구현</td><td style="height: 64px; width: 30.9302%;">- 트랜잭션 경계 지정 위치로 사용- AOP 적용 지점으로 적합<br>- @Transactional과 함께 자주 사용</td><td style="height: 64px; width: 23.9535%;">java<br>@Service<br>public class UserService {...}<br></td></tr><tr style="height: 85px;"><td style="height: 85px; width: 16.279%;"><b>@Controller</b></td><td style="height: 85px; width: 12.2094%;">Web Layer (MVC 컨트롤러)</td><td style="height: 85px; width: 16.5116%;">클라이언트 요청 처리, 뷰 반환 (JSP, Thymeleaf 등)</td><td style="height: 85px; width: 30.9302%;">- DispatcherServlet에 의해 요청 매핑<br>- @RequestMapping, @GetMapping, @PostMapping 등과 함께 사용</td><td style="height: 85px; width: 23.9535%;">java<br>@Controller<br>public class UserController {...}<br></td></tr><tr style="height: 64px;"><td style="height: 64px; width: 16.279%;"><b>@RestController</b></td><td style="height: 64px; width: 12.2094%;">Web Layer (REST API)</td><td style="height: 64px; width: 16.5116%;">RESTful API 요청 처리, JSON/XML 반환</td><td style="height: 64px; width: 30.9302%;">- @Controller + @ResponseBody 기능 결합<br>- 반환값을 자동으로 HTTP 응답 Body에 매핑</td><td style="height: 64px; width: 23.9535%;">java<br>@RestController<br>public class ApiController {...}<br></td></tr></tbody></table>
2. 정답 확인(매일메일 해설)
3. 최종 정리
- @Component: 범용 빈 등록, 의미적 구분이 중요.
- @Repository: DB 계층용, 예외 변환 기능 제공.
- @Service: 비즈니스 로직 계층, 트랜잭션/로직 처리 중심.
- @Controller: MVC 웹 요청 처리, 뷰 반환.
- @RestController: REST API 처리, JSON/XML 반환.
🔗 참고 URL
댓글
GitHub 계정으로 댓글을 남길 수 있어요.