이 글의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
Return Type
The post describes the supported controller method return values.
-
Handler Method가 다루는 Return Type은
-
주로 응답 또는 모델을 랜더링할 뷰에 대한 정보를 제공하는데 사용한다.
-
docs.spring.io에서 Return Values에서 다양한 종류의 Return Values를 볼 수 있다.
ResponseEntity
ResponseEntity = 응답으로 보낼 데이터(Body, Header) + Http Status Code
The return value that specifies the full response (including HTTP headers and body) is to be converted through HttpMessageConverter implementations and written to the response.
- 다양한 형태의 생성자 구조를 갖는다.
-
HttpStatus만 설정
-
HttpStatus와 Body를 설정
-
HttpStatus와 Body와 headers를 설정
public class ResponseEntity<T> extends HttpEntity<T> {
private final Object statusCode;
public ResponseEntity(
HttpStatus status) {
this((Object)null, (MultiValueMap)null, (HttpStatus)status);
}
public ResponseEntity(
T body,
HttpStatus status) {
this(body, (MultiValueMap)null, (HttpStatus)status);
}
public ResponseEntity(
MultiValueMap<String, String> headers,
HttpStatus status) {
this((Object)null, headers, (HttpStatus)status);
}
public ResponseEntity(
T body,
MultiValueMap<String, String> headers,
HttpStatus status) {
super(body, headers);
Assert.notNull(status, "HttpStatus must not be null");
this.statusCode = status;
}
private ResponseEntity(
T body,
MultiValueMap<String, String> headers,
Object statusCode) {
super(body, headers);
this.statusCode = statusCode;
}
...
}
-
즉 ResponseEntity는
-
개발자가 직접 결과 데이터와 HTTP 상태 코드를
-
직접 제어할 수 있는 클래스로
-
요청에 대한 Response를
-
디테일하게 제어할 수 있다.
String
A view name to be resolved with ViewResolver implementations and used together with the implicit model — determined through command objects and @ModelAttribute methods.
The handler method can also programmatically enrich the model by declaring a Model argument
-
ViewResolver를 사용해서 View를 찾을 때
-
사용할 View 이름의 타입이다.
-
즉 핸들러가 리턴하는 문자열은
-
해당 핸들러가 요청에 결과로 보여주려는
-
View를 찾아가는 단서가 된다.
-
하지만 상황에 따라 다르게 해석될 수 있다.
-
아래 코드와 같이
-
@ResponseBody가 선언이 되어 있다면
-
Response Body에 응답을 쓰라는 뜻으로 해석된다.
@GetMapping("/events")
@ResponseBody
public String hello() {
return "hello";
}
-
@ResponseBody가 선언이 되어있지 않다면
-
ViewResolver를 통해서
-
hello 라는 파일을 찾게 된다.
-
그 이유는 hello 라는 String을 리턴했기 때문이다.
@GetMapping("/events")
public String hello() {
return "hello";
}