일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- JAVA #객체지향언어 #절차지향언어 #코딩 #Python #C #C++ #객체지향 #절차지향
- 프로그래머스 #자바 #java #코딩테스트 #연속된 수의 합 #코딩
- 프로그래머스 #JAVA #코딩테스트 #다음에 올 숫자 #코딩
- Today
- Total
Javadocs
#7. @Controller 와 @RestController 차이 본문
1. @Controller이란?
Spring MVC의 컨트롤러 어노테이션인 @Controller는 주로 View(화면)를 반환하기 위해 사용합니다.
[ 과정 ]
- Client는 URL 형식으로 요청을 보낸다.
- DispatcherServlet이 요청을 위임할 Handler Mapping을 찾는다.
- Handler Mapping을 통해 요청을 Controller로 위임한다.
- Controller는 요청을 처리한 후 View Name을 Handler Adapter한테 반환한다.
- Handler Adapter는 이걸 DispatcherServlet한테 반환한다.
- DispatcherServlet는 View Resolver를 통해 View Name에 해당하는 View를 찾아서 Client한테 반환한다.
위의 과정을 거치면서 View를 찾아서 랜더링* 하는 과정을 거치게 된다.
랜더링(Rendering)? 서버로부터 HTML 파일을 받아 브라우저에 보여주는 과정. |
But, Spring MVC의 컨트롤러를 사용할 때 Data를 반환해야 하는 경우도 있습니다. 컨트롤러에서 Data를 반환하기 위해 @ResponseBody 어노테이션을 활용해서 JSON 형태의 데이터를 반환할 수 있다.
[ 과정 ]
- Client는 URL 형식으로 요청을 보낸다.
- DispatcherServlet이 요청을 위임할 Handler Mapping을 찾는다.
- Handler Mapping을 통해 요청을 Controller로 위임한다.
- Controller는 요청을 처리한 후 객체를 반환한다.
- 반환되는 객체는 JSON으로 직렬화(Serialize)돼서 Client에게 반환한다.
Controller를 통해 데이터를 반환할 때 일반적으로 ResponseEntity로 감싸서 반환합니다. 그리고 객체(데이터)를 반환하기 위해서는 View를 반환할 때 사용된 View Resolver 대신에 HttpMessageConverter가 동작합니다.
HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환하는 데이터에 따라 사용되는 Converter가 달라집니다. 단순 문자열인 경우 StringHttpMessageConverter가 사용되고, 객체인 경우에는 MappingJackson2HttpMessageConverter가 사용되고, 데이터의 종류에 따라 서로 다른 MessageConverter가 작동하게 됩니다.
Spring은 Client의 HTTP Accept Header와 서버의 컨트롤러 반환 타입 정보 2개를 조합해서 적합한 HttpMessageConverter를 선택해서 처리합니다. MessageConverter가 동작하는 시점은 HandlerAdapter와 Controller가 요청을 주고받는 시점입니다.
바로 위 그림을 보면 4번에서 Message를 객체로 변환, 6번에서는 객체를 Message로 변환하는데 MessageConverter가 사용됩니다.
2. @RestController이란?
@RestController 어노테이션은 Restful Web Service에서 사용되는 컨트롤러 어노테이션입니다.
@Controller + @ResponseBody가 합쳐진 형태로 JSON 형태의 객체 데이터를 반환합니다. 최근에 데이터를 응답으로 제공하는 Rest API를 개발할 때 주로 사용하며 객체를 ResponseEntity로 감싸서 반환합니다. 이러한 이유로 동작 과정 역시 @Controller에 @ResponseBody를 붙인 것과 완벽히 동일합니다.
[ 과정 ]
- Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
- DispatcherServlet이 요청을 처리할 대상을 찾는다.
- HandlerAdapter을 통해 요청을 Controller로 위임한다.
- Controller는 요청을 처리한 후 객체를 반환한다.
- 반환되는 객체는 JSON으로 Serialize되어 사용자에게 반환된다.
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping(value = "/users")
public User findUser(@RequestParam("userName") String userName){
return userService.findUser(user);
}
@GetMapping(value = "/users")
public ResponseEntity<User> findUserWithResponseEntity(@RequestParam("userName") String userName){
return ResponseEntity.ok(userService.findUser(user));
}
}
findUser는 User 객체를 그대로 반환하고 있습니다. 이러한 경우의 문제는 클라이언트가 예상하는 HttpStatus를 설정해 줄 수 없기에 객체 상황에 맞는 ResponseEntity로 감싸서 반환해줘야 합니다.
[ 결론 ]
- @Controller와 @RestController의 주요한 차이점은 HTTP Response Body가 생성되는 방식입니다.
- @Controller의 역할은 Model 객체를 만들어 데이터를 담고 View를 반환하는 것.
- @RestController는 단순히 객체만을 반환하고 객체 데이터는 JSON 또는 XML 형식으로 HTTP 응답에 담아 전송합니다.
- @Controller는 클래스를 Spring MVC 컨트롤러로 표시하는데 사용되고, @RestController는 RESTful 웹 서비스에서 사용되는 특수 컨트롤러이며 @Controller + @Response와 동일.
- @Controller와 @RestController의 주요 차이점 중 하나는 @RestController를 표시하면 모든 메소드가 View 대신 객체로 작성된다.
- @Controller는 @Component 주석이 달려있고, @RestController는 아래와 같이 @Controller와 @ResponseBody 주석이 달린 편의 컨트롤러이다.
< 참고 >
https://mangkyu.tistory.com/49
[Spring] @Controller와 @RestController 차이
Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있습니다. 전통적인 Spring MVC의 컨트롤러인 @Controller와 Restuful 웹서비스의 컨트롤러인 @RestController의 주요한 차이점
mangkyu.tistory.com
https://dev-coco.tistory.com/84?fcsubscription=completed
[Spring] @Controller와 @RestController의 차이점 알아보기
@Controller 와 @RestController Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있습니다. 전통적인 Spring MVC 컨트롤러인 @Controller와 RESTful 웹 서비스의 컨트롤러인 @RestCont
dev-coco.tistory.com
'SelfStudy > CS 기술 정리' 카테고리의 다른 글
GET vs POST (0) | 2023.04.14 |
---|---|
#8. Rest API란? (0) | 2023.03.26 |
#5. WEB과 WAS의 차이 (0) | 2023.03.19 |
#3. MVC 패턴이란? (Model-View-Controller) (0) | 2023.03.18 |