Spring & Spring boot

[Spring Boot] Rest Controller - 6. HttpEntity

jh4dev 2024. 7. 24. 16:56
<목차>

1. HttpEntity ?
2. RequetEntity & ResponseEntity

 

[HttpEntity]

Spring Framework에는 HttpEntity 라는 클래스가 있다.

HttpEntity 는, HeaderBody 로 구성되어 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를 상속받은 RequestEntityResponseEntity 클래스를 사용하는 것을 권장한다.

 

    /**
     * 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());
    }