클라이언트 → 디스패처서블릿(DispatcherServlet) → Controller → Service → Repository → Controller → 디스패처서블릿(DispatcherServlet) → 클라이언트
- 클라이언트가 HTTP 요청을 보낸다.
- DispatcherServlet이 요청을 받는다.
- DispatcherServlet은 HandlerMapping을 통해 적절한 Controller를 찾는다.
- Controller는 필요한 경우 Service와 Repository를 호출하여 비즈니스 로직과 데이터 처리를 수행한다.
- 처리 결과를 Controller가 반환한다.
- 반환 방식에 따라 View나 HTTP를 클라이언트에 반환한다.
주로 View를 반환하는 MVC에서 사용한다.
@Controller public class UserController { @GetMapping("/users") public String users(Model model) { model.addAttribute("users", userService.findAll()); return "users"; } }
- 위 코드처럼 model을 통해 view를 렌더링하여 클라이언트에 응답한다.
- 클라이언트 요청 → HTTP 요청 → DispatcherServlet → HandlerMapping → Controller
→ View 이름 반환 → DispatcherServlet → ViewResolver → View 렌더링 → HTML 응답 → 클라이언트
주로 HTTP 응답을 반환할 때 사용한다.(Ex : REST API)
@RestController public class UserController { @GetMapping("/users") public ResponseEntity<List<User>> users() { List<User> users = userService.findAll(); return ResponseEntity.ok(users); } }
- 위 코드처럼 주로 ResponseEntity를 통해 HTTP로 반환한다.
- ResponseEntity는 응답 전체를 표현하는 객체로 데이터외에 HTTP 상태 코드, 헤더도 동봉가능하다.
- 클라이언트 요청 → HTTP 요청 → DispatcherServlet → HandlerMapping → Controller
→ ResponseEntity 반환 → HttpMessageConverter → JSON 변환 → 클라이언트
View 이름 반환, ResponseEntity 반환 전단계의 Controller에서 Controller > Service > Repository > Controller가 될 수 있으나 항상 서비스와 레포지토리를 사용하는 건 아님
| 구분 | @Controller | @RestController |
|---|---|---|
| 주요 용도 | MVC 웹 페이지 | REST API |
| 반환값의 기본 의미 | View 이름 | 응답 Body 데이터 |
| ViewResolver | 사용 가능 | 일반적으로 사용하지 않음 |
| @ResponseBody | 별도로 사용 가능 | 기본적으로 적용됨 |
| 주된 응답 형태 | HTML 등 View | JSON, XML 등의 데이터 |