우선,
HTTP란?
- HyperText Transfer Protocol 의 약자로, server와 client간 데이터를 송수신하기 위한 규약이다.
- HTTP Request : 요청
- Start line : method, URL, version으로 이루어짐.
- Headers : 요청에 대한 접속 운영체제, 포트 번호, 쿠키/캐시 정보와 같은 부가적인 내용을 담고 있음.
- Body : json, xml로 된 요청에 대한 구체적인 내용
- HTTP Response : 응답
- Status line : 요청에 대한 처리 상태를 담고 있음. ex) 404 -> 200
- Headers : 서버 정보, 쿠키/캐시 정보, Access-Control-Allow-Origin (CORS에러 관련) 와 같은 부가적 내용을 담고 있음.
- Body : json, xml로 된 응답 데이터
- HTTP Request : 요청
HTTP Response 의 형태로 client 서버에 데이터를 보내기 위해, Spring에는 여러 애노테이션이 존재한다.
1. @ResponseBody
애노테이션이 붙은 대상은 HTTPMessageConverter에 의해 response body에 직렬화된다.
즉 controller에서 이 애노테이션을 붙인 method가 반환하는 값이나 객체는 json화 되어 HTTP response의 body에 담기게 된다.
@ResponseBody
@ResponseStatus(HttpStatus.OK)
public MoveResponseDto move(@PathVariable String name, @RequestBody RequestDto requestDto) {
...
return moveResponseDto;
}
✏️ @RequestBody
이름에서 유추 가능하듯이, @ResponseBody의 반대 기능을 수행한다.
Spring은 client 서버에서 받아온 HTTP request의 body 부분을 객체로 변환하여 해당 애노테이션이 붙은 객체에 전달한다.
위의 코드처럼 메소드 하나하나에 @ResponseBody 애노테이션을 다는 대신, 한 컨트롤러 전체에 @ResponseBody를 적용하는 애노테이션이 존재하는데 , 다음과 같다.
2. @RestController
이 애노테이션을 컨트롤러에 달아주면, 컨트롤러 내에 존재하는 모든 method에 @ResponseBody가 적용된 것과 같이 기능한다.
다만 이 두 방식은 response header에 대해 유연한 설정이 어렵고, status 설정을 위해서는 @ResponseStatus(HttpStatus.OK) 라는 또 다른 애노테이션을 추가로 사용해야 한다는 번거로움이 존재한다.
이런 점들을 보완하여 나온 것이 바로 ResponseEntity이다.
3. ResponseEntity
ResponseEntity는 애노테이션이 아닌 객체이다.
ResponseEntity를 controller에서 반환하면, Spring은 이 객체 내의 정보를 사용해 HTTP response의 형태로 client 서버에 데이터를 전달한다.
ResponseEntity는 HttpEntity라는 객체를 상속하여 구현되어 있다.
// HttpEntity 선언 구조
public class HttpEntity<T> {
public static final HttpEntity<?> EMPTY = new HttpEntity<>();
private final HttpHeaders headers;
@Nullable
private final T body;
}
//ResponseEntity 선언 구조
public class ResponseEntity extends HttpEntity {
private final Object status;
}
headers와 body가 HttpEntity의 필드로 존재하며, status가 ResponseEntity의 필드로 존재함을 볼 수 있다.
ResponseEntity를 사용하면 headers , body, status 모두를 한 번에 설정할 수 있다.
ResponseEntity를 생성할 때의 형식은
ResponseEntity<반환할 타입>(Body, headers, status) 로 작성한다.
ResponseEntity를 생성하여 사용하는 방법에는 크게 두 가지가 있다.
첫 번째는 생성자를 통해 객체를 생성하여 반환하는 방법,
두 번째는 생성자가 아닌 Builder를 사용하는 방법이다.
대체로 Builder를 사용하는 방법이 선호된다. 생성자 이용시 숫자로 된 상태 코드를 넣을 때 발생할 수 있는 실수 때문이다.
// 생성자
return new ResponseEntity<ResponseDto>(ResponseDto, headers, HttpStatus.valueOf(200));
// Builder
return ResponseEntity.ok()
.headers(headers)
.body(moveResponseDto);
- https://tecoble.techcourse.co.kr/post/2021-05-10-response-entity/ 를 참고하여 작성된 게시글입니다.
'Back-End > Spring' 카테고리의 다른 글
[Spring] 싱글톤객체 / 자동 의존 주입 / 컴포넌트 스캔 (0) | 2022.03.25 |
---|---|
[Spring] 의존 주입 (0) | 2022.03.25 |