@Controller를 사용해본적이 있고
@RestCotroller를 사용해본적이 있어야 이해하기가 편할 것으로 생각됩니다.
들어가기에 앞서 Controller return 값에 따라 HTTP Response의 값이 어떻게 변하는지 먼저 알아보도록 하겠습니다.
위에 표를 보고 한눈에 이해하기가 쉽지 않을 수 있습니다.
같이 한번 살펴보도록 하겠습니다.
일반적으로 @Controller가 반환하는 return 타입은 1가지 나눌 수 있습니다. (String)
@RestController가 반환하는 return 타입은 2가지 나눌 수 있습니다. (String, String외)
이에따라 HTTP Response는 어떻게 변하는지 살펴보도록 하겠습니다.
@Controller
자, 앞서 Controller 어노테이션은 String 타입의 리턴값을 반환한다고 하였습니다.
여기서는 타임리프를 사용하는 경우에 대한 예시 입니다.
아래와 같이 "hello"를 return한다면 결과적으로 templates/hello.html의 뷰를 반환할 것입니다.
HTTP의 header에는 Content-Type:text/html 이 들어가고
HTTP body에는 templates/hello.html 의 html 코드들이 들어가 있는 것을 확인할 수 있습니다.
@GetMapping("/body/test")
public String test() {
return "hello";
}
같은 String을 반환하지만 redirect: 를 할 경우에는 달라진다고 합니다.
@GetMapping("/body/test")
public String test() {
return "redirect:/hello/response";
}
위와 같이 redirect를 할 경우 HTTP header에 Location 정보만 추가되며, HTTP body는 비어있을 것이라고 설명을 하였지만
실제로 확인한 경우에는 HTTP의 Response header에는 Content-Type:text/html 이 들어가 있었으며
HTTP Response body에는 redirect된 url 페이지의 html 값이 들어가 있었습니다.
이 부분은 추가적으로 확인해 보도록 하겠습니다.
@RestController
@RestController 같은 경우에는 2가지 타입으로 반환을 할 수 있다고 하였습니다.
String 타입과 String을 제외한 나머지 타입
1. 먼저 String을 반환할 경우를 살펴보도록 하겠습니다.
@ResponseBody
@GetMapping("/json/string")
public String helloHtmlString() {
return "<html><body>Hello @ResponseBody</body></html>";
}
HTTP의 header에는 Content-Type:text/html 이 들어가고
HTTP body에는 return한 문자 그대로가 들어가 있는 것을 확인할 수 있습니다.
2. 두번째 String 외 타입입니다.
왜 String외 라고 말을 하고 있을까요??
@RestController에서 return하는 타입이 String이 아닌 경우에는 모두
HTTP에서 받아들이는 Content type이 동일하기 때문입니다.
Response Header 부분에는 Content-type:application/json 이 지정되고
Response Body 부분에는 return한 값이 저장되어 있습니다.
아래에서 반환하고 html로 확인한 결과를 각각 살펴보도록 하겠습니다.
2-1 리스트를 반환한 경우
@GetMapping("/json/list")
public List<String> helloJson() {
List<String> words = Arrays.asList("Hello", "Controller", "And", "JSON");
return words;
}
2-2 객체를 반환한 경우
@GetMapping("/json/class")
@ResponseBody
public Star helloJson() {
return new Star("BTS", 28);
}
지금까지 @Controller @RestController 반환 타입에 따른 결과를 살펴보았습니다.
'강의 > 모든 개발자를 위한 HTTP' 카테고리의 다른 글
HTTP 메서드의 속성 (0) | 2022.04.21 |
---|---|
HTTP API 생성 (0) | 2022.04.21 |
HTTP의 구조를 알아보자 (0) | 2022.03.26 |
HTTP (0) | 2022.03.08 |