Handler Method : HttpEntity

2024. 10. 9. 16:46Spring 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에서의 RequestEntityResponseEntity 사용 예시

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 스택에서는 비동기 방식으로 MonoFlux를 사용하여 본문과 헤더를 처리합니다.

이 방식은 요청 및 응답에 대해 더 많은 제어가 필요할 때 유용하며, 주로 REST API에서 본문과 헤더를 함께 처리하는 경우에 많이 사용됩니다.


참고 : [https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/httpentity.html]

'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