Spring에서는 HTTP Response 를 만드는 것이 주요한 관심사다.
200, 404 등 각각의 응답의 상태 코드뿐만 아니라, Body 에 들어갈 내용도 넣어 주어야 한다.
이 세 가지 요소를 채운 객체를 만드는 것, 즉 이 데이터를 받아서 자동으로 구성해주는 것이 바로 @ResponseBody 와 ResponseEntity다.
@ResponseBody
우선 @ResponseBody는 HTTP 규격에 맞는 응답을 만들어주기 위한 Annotation 이다.
HTTP 요청을 객체로 변환하거나, 객체를 응답으로 변환하는 HttpMessageConverter를 사용한다.
스프링부트 @RequestBody와 @ReponseBody
Annotation을 추가하는 것으로 간단하게 처리를 할 수 있다는 점이 장점이지만
HTTP Header 에 대해서 유연하게 설정을 할 수 없다는 점 등의 단점이 있는데,
(@ResponseBody 만 사용시에 별도의 뷰를 제공하지 않고, 데이터만 전송하는 형식이기 때문이다.)
이와 같은 부분들 해결해 줄 수 있는 것이 ResponseEntity 객체다.
ResponseEntity란?
@ResponseBody 와 달리 Annotation이 아닌 객체로 사용한다.
HTTP 요청(Request) 또는 응답(Response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스이고,
즉, 응답으로 변환될 정보를 모두 담은 요소들을 객체로 만들어서 반환해준다.
그리고 ReponseEntity가 HttpEntity를 상속 받았기 때문에 ResponseEntity는 HttpMessageConverter로 컨버팅이 되는데 따라서 HttpMessageConverter를 통해 Json으로 응답한다.
<ResponseEntity 선언 구조>
public class ResponseEntity extends HttpEntity {
private final Object status;
}
ResponseEntity는 다음과 같이 Status 만 필드 값으로 가지고 있다.
ResponseEntity 에서 직접적으로 Status Code 를 지정할 수 있다는 것을 의미한다.
나머지 부분은 HttpEntity 에 구현이 되어있는데, 이는 RequestEntity 와 여러 설정들을 공유하기 때문이다. 다음은 HttpEntity 의 구현 부분을 보자.
이 HttpEntity 클래스를 상속받아 구현한 클래스로 ResponseEntity 클래스가 있다.
ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다. 따라서 HttpStatus, HttpHeaders, HttpBody를 포함한다.
ResponseEntity의 생성자를 보면 this( )를 통해서 매개변수가 3개인 생성자를 호출해 결국엔 아래 보이는 매개변수가 3개인 생성자로 가게된다.
또한 상태코드(Status), 헤더(headers), 응답데이터(ResponseData)를 담는 생성자도 존재한다.
ResponseEntity 를 사용할 때, Constructor 를 사용하기보다는 Builder 를 활용하는 것을 권장하고 있다.
(숫자로 된 상태 코드를 넣을 때, 잘못된 숫자를 넣을 수 있는 실수 때문)
예시 >
return new ResponseEntity<MoveResponseDto>(moveResponseDto, headers, HttpStatus.valueOf(200));
return ResponseEntity.ok()
.headers(headers)
.body(moveResponseDto);
'🍃 𝗦𝗽𝗿𝗶𝗻𝗴 𝗕𝗼𝗼𝘁' 카테고리의 다른 글
[SpringBoot] 스프링 controller에서 json 받기 (@RequestBody, @ResponseBody 어노테이션 사용) (0) | 2022.10.25 |
---|---|
Builder Pattern 빌더 패턴의 특징, 장점 (@Builder 사용이유, @Builder 예제) (5) | 2022.09.16 |
[Spring data JPA] Auditing (AuditingEntityListener) (0) | 2022.09.15 |
[Spring] Gradle 버전 확인 방법 (0) | 2022.09.15 |
[Spring Jpa] nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist (0) | 2022.09.06 |
댓글