1. @Controller
  2. @RestController
본문 바로가기

강의/모든 개발자를 위한 HTTP

HTTP Response의 이해 (@Controller, @RestController)

@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