Handler Method : HttpEntity
2024. 10. 9. 16:46ㆍSpring Framework/Web on Servlet Stack
HttpEntity는 스프링에서 HTTP 요청 또는 응답을 표현하는 객체로, 요청의 본문(Request Body)과 헤더(Request Headers)를 함께 처리할 수 있도록 도와줍니다. @RequestBody와 유사하지만, HttpEntity는 헤더와 본문을 모두 다룰 수 있는 기능을 제공합니다.
기본 개념
HttpEntity
: 요청의 본문과 헤더를 포함하는 컨테이너 객체로, 주로 HTTP 요청의 헤더와 본문을 함께 처리할 때 사용됩니다. 응답에서도 사용할 수 있으며,ResponseEntity
를 통해 응답 본문과 상태 코드를 함께 반환할 수 있습니다.@RequestBody
와의 차이:@RequestBody
는 요청 본문만 처리하는 반면,HttpEntity
는 본문과 함께 요청 헤더를 다룰 수 있는 확장된 기능을 제공합니다.
HttpEntity
는 헤더와 본문을 쉽게 접근할 수 있는 메서드를 제공하며, 이를 통해 클라이언트가 보낸 요청에 대한 더 많은 정보를 처리할 수 있습니다.
HttpEntity
사용 예시
import org.springframework.http.HttpEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AccountController {
@PostMapping("/accounts")
public void handle(HttpEntity<Account> entity) {
// 요청 본문(Account 객체) 처리
Account account = entity.getBody();
System.out.println("Account Name: " + account.getName());
// 요청 헤더 처리
String contentType = entity.getHeaders().getContentType().toString();
System.out.println("Content-Type: " + contentType);
}
}
코드 설명:
HttpEntity<Account> entity
:HttpEntity
는 요청의 본문(Account 객체)과 헤더를 모두 포함합니다.entity.getBody()
: 요청의 본문을 가져옵니다. 이 경우Account
객체가 반환됩니다.entity.getHeaders()
: 요청의 헤더를 가져옵니다. 예를 들어,Content-Type
과 같은 헤더 값을 확인할 수 있습니다.
이 방식으로 요청 본문뿐만 아니라 헤더에 대한 정보도 함께 처리할 수 있습니다.
HttpEntity
의 주요 메서드
getBody()
: 요청 또는 응답의 본문을 반환합니다. 예를 들어,Account
객체 같은 도메인 모델을 반환할 수 있습니다.getHeaders()
: 요청 또는 응답의 HTTP 헤더를 반환합니다. 이를 통해 클라이언트가 전송한 헤더 값을 확인할 수 있습니다.
응답 처리에서의 HttpEntity
사용
HttpEntity
는 요청을 처리할 때뿐만 아니라 응답으로도 사용할 수 있습니다. 스프링에서 응답 본문과 헤더를 함께 반환할 때 ResponseEntity
를 사용하며, 이는 HttpEntity
를 확장한 형태입니다.
응답에서 ResponseEntity
사용 예시
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ResponseController {
@GetMapping("/account")
public ResponseEntity<Account> getAccount() {
Account account = new Account("John Doe", 1000);
HttpHeaders headers = new HttpHeaders();
headers.add("Custom-Header", "CustomHeaderValue");
return new ResponseEntity<>(account, headers, HttpStatus.OK);
}
}
코드 설명:
ResponseEntity<Account>
: 응답으로Account
객체를 반환하면서, 헤더와 HTTP 상태 코드도 함께 설정할 수 있습니다.- 본문:
Account
객체를 응답 본문으로 설정합니다. - 헤더:
HttpHeaders
객체를 통해 커스텀 헤더를 추가할 수 있습니다. - 상태 코드:
HttpStatus.OK
를 통해 200 OK 상태 코드를 설정합니다.
- 본문:
이 방식으로 응답에 대해 더 많은 제어를 할 수 있으며, 요청 헤더뿐만 아니라 응답 헤더도 설정할 수 있습니다.
Reactive 스택에서의 HttpEntity
사용 (Spring WebFlux)
Spring WebFlux에서도 비슷한 개념을 사용하지만, WebFlux는 비동기 방식으로 동작하므로 Mono
또는 Flux
타입을 사용하여 데이터를 처리합니다.
WebFlux에서의 RequestEntity
와 ResponseEntity
사용 예시
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
@RestController
public class ReactiveAccountController {
@PostMapping("/accounts")
public Mono<ResponseEntity<Account>> handle(HttpEntity<Mono<Account>> entity) {
return entity.getBody().map(account -> {
// 요청 본문(Account 객체) 처리
System.out.println("Account Name: " + account.getName());
// 응답 본문과 상태 코드 설정
return ResponseEntity.ok(account);
});
}
}
코드 설명:
HttpEntity<Mono<Account>>
: WebFlux에서는 비동기 처리를 위해Mono
를 사용하여 요청 본문을 처리합니다.entity.getBody()
: 요청 본문은Mono<Account>
로 제공되며, 이를 처리하여 응답으로ResponseEntity
를 반환합니다.
요약
HttpEntity
는 요청의 본문과 헤더를 함께 처리할 수 있는 객체입니다. 요청의 본문만 처리하는@RequestBody
와 달리, 헤더까지 다룰 수 있는 확장된 기능을 제공합니다.getBody()
와getHeaders()
메서드를 통해 요청 본문과 헤더를 처리할 수 있으며, 응답에서도ResponseEntity
를 사용하여 본문, 헤더, 상태 코드를 모두 제어할 수 있습니다.- Reactive 스택에서는 비동기 방식으로
Mono
나Flux
를 사용하여 본문과 헤더를 처리합니다.
이 방식은 요청 및 응답에 대해 더 많은 제어가 필요할 때 유용하며, 주로 REST API에서 본문과 헤더를 함께 처리하는 경우에 많이 사용됩니다.
'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글
Handler Method : ResponseEntity (1) | 2024.10.09 |
---|---|
Handler Method : @ResponseBody (0) | 2024.10.09 |
Handler Mapping : @RequestBody (0) | 2024.10.09 |
Handler Method : Multipart (0) | 2024.10.09 |
Handler Method : Flash Attributes (0) | 2024.10.09 |