<목차>
1. HttpEntity ?
2. RequetEntity & ResponseEntity
[HttpEntity]
Spring Framework에는 HttpEntity 라는 클래스가 있다.
HttpEntity 는, Header 와 Body 로 구성되어 HTTP 요청과 응답을 구성하는 역할을 수행한다.
HttpEntity 의 필드는 다음과 같다.
package org.springframework.http;
import org.springframework.lang.Nullable;
import org.springframework.util.MultiValueMap;
import org.springframework.util.ObjectUtils;
public class HttpEntity<T> {
public static final HttpEntity<?> EMPTY = new HttpEntity();
private final HttpHeaders headers;
@Nullable
private final T body;
... 이하 생략
- headers (헤더) : Request 또는 Response의 메타데이터를 포함
- body : Request 또는 Response 의 실제 데이터를 포함
- GET/POST/PUT/DELETE 등 다양한 HTTP 메서드와 함께 사용할 수 있음
- 제네릭 타입을 사용하기에, 다양한 타입의 데이터를 BODY 에 처리할 수 있음
즉, HttpEntity 는 Spring 에서 HTTP Request, Respones 를 캡슐화하여 처리하는 클래스이다.
Header 와 Body 를 포함할 수 있으며, 다른 서버의 API를 호출하거나 Controller 에서 요청을 받을 때 사용된다.
단, Rest Controller 를 작성함에 있어, HttpEntity 는 적합하지 않다.
[RequestEntity & ResponseEntity]
앞서 HttpEntity 에 대해 설명하며, Rest Controller 를 작성함에 있어, HttpEntity 는 적합하지 않다고 하였다.
HttpEntity 는 Header 와 Body "만"포함하기 때문이다.
조금 더 자세히 얘기하자면, REQUEST 에서 필요로하는 URI / HTTP 메서드 (GET/POST/PUT/DELETE...) 데이터를 포함하지 않는다.
또한, RESPONSE 에 HTTP 상태 코드를 포함하지 않는다.
단순한 API 작성에서는 HttpEntity 를 사용해도 된다.
하지만 보다 복잡한 요청을 처리해야되는 케이스나, 별도의 HTTP Status 코드를 관리해야하는 시스템이라면 HttpEntity를 상속받은 RequestEntity 와 ResponseEntity 클래스를 사용하는 것을 권장한다.
/**
* Get Controller
* Request : HttpEntity
* Response : HttpEntity
* */
@GetMapping(value = "/entity1")
public HttpEntity<MemberDto> entityTest1(HttpEntity<MemberDto> entity) {
StringBuilder sb = new StringBuilder();
sb.append("headers : ").append(entity.getHeaders()).append("\n")
.append("body : ").append(entity.getBody()).append("\n")
// .append("method : ").append(entity.getMethod()).append("\n") //없는 메서드
// .append("url : ").append(entity.getUrl()); //없는 메서드
System.out.println(sb.toString());
/*
status 설정 불가
*/
return new HttpEntity<MemberDto>(entity.getBody(), entity.getHeaders());
}
/**
* Get Controller
* Request : RequestEntity
* Response : HttpEntity
* */
@GetMapping(value = "/entity2")
public HttpEntity<MemberDto> entityTest2(RequestEntity<MemberDto> entity) {
StringBuilder sb = new StringBuilder();
//Request 처리
sb.append("headers : ").append(entity.getHeaders()).append("\n")
.append("body : ").append(entity.getBody()).append("\n")
.append("method : ").append(entity.getMethod()).append("\n")
.append("url : ").append(entity.getUrl());
System.out.println(sb.toString());
return new HttpEntity<MemberDto>(entity.getBody(), entity.getHeaders());
}
/**
* Get Controller
* Request : HttpEntity
* Response : ResponseEntity
* */
@GetMapping(value = "/entity3")
public ResponseEntity<MemberDto> entityTest3(HttpEntity<MemberDto> entity) {
StringBuilder sb = new StringBuilder();
sb.append("headers : ").append(entity.getHeaders()).append("\n")
.append("body : ").append(entity.getBody()).append("\n")
// .append("method : ").append(entity.getMethod()).append("\n") //없는 메서드
// .append("url : ").append(entity.getUrl()); //없는 메서드
System.out.println(sb.toString());
return ResponseEntity.status(HttpStatus.ACCEPTED).body(entity.getBody());
}
/**
* Get Controller
* Request : RequestEntity
* Response : ResponseEntity
* */
@GetMapping(value = "/entity4")
public ResponseEntity<MemberDto> entityTest4(RequestEntity<MemberDto> entity) {
StringBuilder sb = new StringBuilder();
//Request 처리
sb.append("headers : ").append(entity.getHeaders()).append("\n")
.append("body : ").append(entity.getBody()).append("\n")
.append("method : ").append(entity.getMethod()).append("\n")
.append("url : ").append(entity.getUrl());
System.out.println(sb.toString());
return ResponseEntity.status(HttpStatus.ACCEPTED).body(entity.getBody());
}

'Spring & Spring boot' 카테고리의 다른 글
| [Spring Boot] JPA - 2. Entity (0) | 2024.07.25 |
|---|---|
| [Spring Boot] JPA - 1. ORM 과 JPA (0) | 2024.07.25 |
| [Spring Boot] Rest Controller - 5. DELETE (1) | 2024.07.24 |
| [Spring Boot] Rest Controller - 4. PUT (0) | 2024.07.24 |
| [Spring Boot] Rest Controller - 3. POST (2) | 2024.07.24 |