Spring 에서 컨트롤러를 지정해주는 어노테이션으로 @Controller 와 @RestController 가 있다.
@Controller 는 Spring MVC 에서 Controller 의 역할을 하는 클래스를 지정하는 것으로 요청에 대한 응답을 Spring MVC 에서 View 에 결과 객체를 담아서 반환한다.
반면에 @RestController 는 Restful 한 웹 서비스를 구현할 때 사용하는 어노테이션으로 @RestController 로 지정된 클래스는 결과 값을 View 가 아닌 객체 그 자체로 JSON 이나 XML 형태로 반환한다. 해당 결과들은 Http Response 의 Body 에 담겨져서 Client 로 전달된다.
1. @Controller
@Controller 는 Client 의 요청을 처리하는 Spring 컴포넌트로 @Component 어노테이션을 포함하고 있어서 Spring 실행 시에 bean 으로 자동 등록된다.
@Controller 아래에서 @RequestMapping 을 사용할 수 있는데, 이를 통해서 사용자의 요청과 연결되는 엔드포인트로 지정할 수 있다.
@Controller
@RequestMapping("/")
public class HelloController {
@GetMapping("home")
public String getHome() {
return "index.html";
}
@GetMapping("hello")
public ResponseEntity<String> getHello() {
return ResponseEntity.ok("hello");
}
}
- Spring MVC Controller 요청 처리 과정
1. Client 가 URI 형식으로 웹 서비스에 요청을 보낸다.
2. DispatcherServlet 은 HandlerMapping 을 통해 요청을 처리할 메서드 (Controller) 를 찾는다.
3. HandlerAdapter 를 통해 HandlerMapping 에서 찾은 Controller 에게 처리를 요청한다.
4. Contoller 는 요청을 처리하여 Model 객체에 적용하고 HandlerAdapter 에게 view 이름을 결과로 반환한다.
5. HandlerAdapter 가 Model 객체와 view 이름을 통해 ModelAndView 객체로 DispatcherServlet 에게 전달한다.
6. DispatcherServlet 은 전달받은 값을 가지고 ViewResolver 에 해당 값에 매핑되는 view 가 있는지 확인한다.
7. ViewResolver 의 처리 결과가 포함된 view 를 DispatcherServlet 에 전달한다.
8. DispatcherServlet 에서 최종 응답 결과를 Client 에게 전달한다.
2. @RestController
@RestController 는 전통적인 MVC 와 달리 결과를 view 로 전달하는 것이 아니라 데이터 객체로 전달한다.
@RestController 는 @Controller 와 @ResponseBody 를 더한 어노테이션이다. @Controller 와 같이 매핑된 요청에 응답하는데, 응답하는 값이 ResponseBody 에 포함되는 데이터 객체의 형태로 전달된다.
@RestController
@RequestMapping("/rest")
public class RestHelloController {
@GetMapping("home")
public String getHome() {
return "index.html";
}
@GetMapping("hello")
public ResponseEntity<String> getHello() {
return ResponseEntity.ok("hello");
}
@GetMapping("test")
public Map<Object, Object> getTest() {
Map<Object, Object> map = new HashMap<>();
map.put("content", "hello");
return map;
}
}
- RestController 요청 처리 과정
1. Client 가 URI 형식으로 웹 서비스에 요청을 보낸다.
2. DispatcherServlet 은 HandlerMapping 을 통해 요청을 처리할 메서드 (Controller) 를 찾는다.
3. HandlerAdapter 를 통해 HandlerMapping 에서 찾은 Controller 에게 처리를 요청한다.
4. Contoller 는 요청을 처리한 후에 HandlerAdapter 에게 결과를 반환한다. 이때 @Controller 처럼 view 이름을 반환하지 않고 결과 객체를 ResponseEntity 로 감싸서 전달한다.
5. HandlerAdapter 는 ViewResolver 를 거치지 않고 HttpMessageConverter 를 통하여 ResponseEntity 를 Http Response 의 Body 에 추가하여 결과를 변환한다.
6. HandlerAdapter 가 변환된 Http Response 를 DispatcherServlet 에게 전달한다.
7. DispatcherServlet 은 전달받은 값을 HTTP Response 로 Client 에게 전달한다.
※ @ResponseBody
@ResponseBody 는 결과값을 view 가 아닌 데이터로 전달하는 경우에 사용하는 어노테이션이다.
해당 어노테이션을 붙인 함수는 결과값을 JSON 형태로 Response Body 에 포함시켜서 반환한다.
[Reference]
- https://dev-coco.tistory.com/84
- https://mangkyu.tistory.com/49
- https://jaimemin.tistory.com/1823
- https://www.geeksforgeeks.org/difference-between-controller-and-restcontroller-annotation-in-spring/
'Tech > Spring | SpringBoot' 카테고리의 다른 글
[SpringBoot] Database 연동 - 2 (JDBC) (0) | 2022.09.17 |
---|---|
[SpringBoot] Database 연동 - 1 (DataSource, h2 database) (0) | 2022.09.13 |
[Spring] Spring MVC (0) | 2022.09.05 |
[Spring] Swagger 3.0.0 적용 (0) | 2022.07.01 |
[Spring] Spring Framework 개념 정리 (0) | 2021.05.05 |