RequestEntity, ResponseEntity

goose_bumps·2025년 3월 28일

SpringBoot

목록 보기
2/9

웹 애플리케이션에서 클라이언트(사용자)와 서버는 HTTP를 통해 데이터를 주고받는다.

Spring에서는 이러한 HTTP 요청과 응답을 보다 쉽게 관리할 수 있도록 RequestEntityResponseEntity를 제공한다.

RequestEntity는 클라이언트가 서버로 요청을 보낼 때 사용하고,
ResponseEntity는 서버가 클라이언트에게 응답을 보낼 때 사용한다.

이 두 클래스는 HttpEntity라는 클래스를 상속받으며, HTTP 요청/응답의 본문(Body), 헤더(Headers), 상태 코드(Status Code) 등을 다룰 수 있도록 도와준다.

바로 이해가 가지 않을 수 있는데 택배를 생각해보면 이해하기 쉬울 것이다.

  • RequestEntity는 고객이 택배를 보낼 때 작성하는 송장이라고 생각하면 된다.(받는 주소, 물건 목록 등)
  • ResponseEntity는 택배사가 고객에게 보내는 알림이라고 생각하면 된다.(배송완료, 배송지연 등)

즉, RequestEntity서버로 요청을 보낼 때 필요한 정보(요청 본문, 헤더, HTTP 메서드 등)를 담고 있고,
ResponseEntity서버가 클라이언트에게 응답을 보낼 때 상태 코드, 본문, 헤더 등을 포함하여 전달한다.

1. RequestEntity

  • T getBody() : Http 요청의 Body(본문) 반환
  • HttpHeaders getHeaders() : Http 요청의 Header 반환
  • HttpMethod getMethod() : HTTP 요청의 메서드(GET, POST 등)을 반환
  • URI getUrl() : HTTP 요청의 URL을 반환

바로 예시를 통해 이해해보자.

@RestController
@RequestMapping("/api")
public class RequestEntityController {
    @PostMapping("/test")
    public ResponseEntity<String> handleRequest(RequestEntity<String> requestEntity){
        //본문 반환
        System.out.println("Body : " + requestEntity.getBody());
        //헤더 반환
        System.out.println("Headers : " + requestEntity.getHeaders());
        //메서드 반환
        System.out.println("Method : " + requestEntity.getMethod());
        //URI 반환
        System.out.println("URI : " + requestEntity.getUrl());

        return ResponseEntity.ok("No Problem!!");
    }
}

POST API를 통해 JSON 형식으로 Body를 받고 이는 매개변수인 requestEntity로 입력되어 클라이언트가 요청한 정보에 대한 본문, 헤더, 메서드, URI를 반환할 수 있다.

Talend API Tester를 통해 JSON 형식으로 입력하여 요청을 하였고 콘솔에서 반환받은 값을 출력한 결과 클라이언트의 요청에 대한 정보들이 정상적으로 반환된 것을 알 수 있다.

출력값을 통해 bodyheader의 내용, 어떤 API로 요청했는지, 그리고 요청 URI는 어떻게 되는지를 알 수 있다.

Talend API Tester에서 "No Problem!"이라고 응답이 온 것을 볼 수 있는데 이는 ResponseEntity를 사용하여 구현한 것이다.


2. ResponseEntity

  • T getBody() : HTTP 응답의 본문(body)을 반환
  • HttpHeaders getHeaders() : HTTP 응답의 headers를 반환
  • HttpStatus getStatusCode() : HTTP 응답의 상태 코드(Status Code) 객체를 반환
  • int getStatusCodeValue() : HTTP 응답의 상태 코드 숫자 값을 반환
    (ex: 200, 404)

이번에는 반대로 서버에서 클라이언트로 응답을 해보겠다. body와 headers를 반환하는 점은 RequestEntity와 동일하지만 상태코드도 반환할 수 있다는 특징이 있다.

간단한 예시를 통해 이해해보자.

클라이언트로부터 GET 요청이 들어왔고 서버에서 404 Not Found라는 응답을 보내려면

    @GetMapping("/notfound")
    public ResponseEntity<String> notFound(){
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("404 Not Found");
    }

ResponseEntity 클래스의 클래스 메서드인 status()를 호출하여 매개변수로 HttpStatus의 열거형을 호출하고 해당하는 상수를 지정하면 된다.

HttpStatus의 열거형은 굉장히 많기 때문에 아래 링크를 참고하면 된다.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpStatus.html

이렇게 요청을 하면 지정한 응답을 보낼 수 있다.

ResponseEntity.status(HttpStatus.OK).body("body)처럼 길게 작성하지 않고 ResponseEntity.ok(body)처럼 가독성 좋게 응답이 가능하고 결과는 동일하게 출력된다.
하지만 상태 코드를 변경해야 할 경우에는 status()를 호출하는 방법이 더 좋다.

자주 사용하는 상태코드를 정리하면 다음과 같다.

  • ResponseEntity.ok(body) : 200 OK / 요청 성공
  • ResponseEntity.status(HttpStatus.CREATED).body(body) : 201 Created / 리소스 생성 완료
  • ResponseEntity.noContent().build() 204 No Content 본문 없이 요청 성공
  • ResponseEntity.badRequest().body(body) : 400 Bad Request / 클라이언트 오류
  • ResponseEntity.notFound().build() : 404 Not Found / 리소스를 찾을 수 없음
  • ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(body) : 500 Internal Server Error / 서버 오류

RequestEntityResponseEntity를 활용하면 데이터 베이스에 리소스가 없거나 저장이 정상적으로 되었을 때 그에 맞는 적절한 응답을 클라이언트에게 보내고 클라이언트가 요청한 정보를 사용할 수도 있다.


RequestEntity
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/RequestEntity.html

ResponseEntity
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/ResponseEntity.html

HttpEntity
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpEntity.html

HttpStatus
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpStatus.html

0개의 댓글