➡️Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있다.
전통적인 Spring MVC의 컨트롤러인 @Controller와 Restuful 웹서비스의 컨트롤러인 @RestController의 주요한 차이점은 HTTP Response Body가 생성되는 방식에서 나타난다.
➡️@Controller
- SpringMvc 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용한다.
- 클라이언트는 URI형식으로 웹 서비스애 요청을 보낸다.
- DispatcherServlet이 요청을 받아 매핑되는 핸들러와 그 type을 찾아 준다.
- 다음은 요청한 뷰 이름으로 viewResolver를 찾는다.
- viewResolver는 뷰의 논리 이름을 물리 이름으로 바꾸고 ,렌더링 역할을 담당하는 뷰 객체를 반환한다.
- 마지막으로 뷰를 통해서 뷰를 렌더링 한다.
- 렌더링 한 후에는 뷰를 사용자에게 반환한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Controller
@RequestMapping("/spring/members")
public class SpringMemberControllerV3 {
@GetMapping
public String members(Model model) {
List<Member> members = memberRepository.findAll();
model.addAttribute("members", members);
return "/members";
}
}
|
cs |
@Controller를 위 코드처럼 사용한다면 DispatcherServlet이 핸들러 어댑터를 호출한다. 핸들어 어댑터를 통해 members라는 뷰 이름을 획득한다.그리고 뷰를 반환한다.
혹여나 @Controller로 데이터를 반환할려고 한다면 @ResponseBody를 사용해줘야 한다.
@RestController
- RestController는 SpringMvc Controller에 @ResponseBody가 추가된 것이다.
- RestController는 주로 Json 형태로 객체 데이터를 반환하는 것이다.
- RestController는 viewResolver대신에 HttpMessageConverter가 동작한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@RestController
@RequestMapping("/mapping/users")
public class MappingClassController {
/**
* GET /mapping/users
*/
@GetMapping
public String users() {
return "get users";
}
/**
* POST /mapping/users
*/
@PostMapping
public String addUser() {
return "post user";
}
}
|
cs |
- @Controller 는 반환 값이 String 이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다.
- @RestController 는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다. 따라서 실행 결과로 get users, post users 메세지를 받을 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@RestController
public class ResponseBodyController {
@ResponseStatus(HttpStatus.OK)
@GetMapping("/response-body-json")
public MyData responseBodyJsonV2(){
MyData myData = new MyData();
myData.setUsername("KK");
myData.setAge(22);
return myData;
}
}
|
cs |
- 이런식으로 데이터를 넣을때 사용이 많이 된다.
- 이렇게 데이터를 넣으면 HTTP 메시지 바디에 Json형태로 {"username":"KK","age":"22"}로 반환이 된다.
➡️HttpMessageConverter 간단한 동작 방식
@RestController가 Data를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작합니다. HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라진다.
단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고, 객체인 경우에는 MappingJackson2HttpMessageConverter가 사용되며, 데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 된다.
Spring은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter를 선택하여 이를 처리한다.
- 대표적인 것들이 MappingJackson2HttpMessageConverter, StringHttpMessageConverter가 있다. StringHttpMessageConverter는 요청이 String으로 들어오면 문자로 처리한다.
- MappingJackson2HttpMessageConverter는 요청이 객체 또는 HashMap으로 들어 오면 JSON으로 처리한다.
➡️정리
- @Controller는 데이터를 처리 할 수 있지만 view만 처리하고 @RestController와 분리해서 @Controller는 뷰 처리를 하고 @RestController는 데이터 처리를 분리 해주는 것이 좋을거 같다.
- 일반적은 Spring MVC @Controller와 RESTful 컨트롤러인 @RestController의 차이점은 HTTP Response Body가 생성되는 방식이다.
- @Controller 는 View Page를 반환하지만, @RestController는 객체(VO,DTO)를 반환하기만 하면, 객체데이터는 application/json 형식의 HTTP ResponseBody에 직접 작성되게 된다.
'Dev > Spring' 카테고리의 다른 글
DAO,DTO,Entity Class (0) | 2021.08.13 |
---|---|
@RequestMapping에 대하여 (0) | 2021.07.24 |
로깅(Logging) (0) | 2021.07.13 |
[Spring]다양한 의존관계 주입 방법 (0) | 2021.06.25 |
[Spring]의존성 주입(Dependency Injection) (0) | 2021.06.24 |