Spring/API

[Spring] ResponseEntity란?

JWonK 2022. 7. 25. 16:37
728x90
반응형

ResponseEntity가 무엇인지 알기 위해서 사전 지식으로 REST API가 무엇인지 알아야 한다.

REST API에 대해 정리한 글이 존재하니 무엇인지 보고 오면 좋을 듯하다.

https://wonsjung.tistory.com/418

 

API란? REST API란?

API란 무엇인가? API는 정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘이다. 예를 들어, 기상청의 소프트웨어 시스템에는 일일 기상 데이터가

wonsjung.tistory.com

 

 

 

1. ResponseEntity란?


Spring Framework에서 제공하는 클래스 중 HttpEntity라는 클래스가 존재한다. 이것은 HTTP 요청(Request) 또는 응답(Response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스이다.

 

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

 

HttpEntity (Spring Framework 5.3.22 API)

Represents an HTTP request or response entity, consisting of headers and body. Often used in combination with the RestTemplate, like so: HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.TEXT_PLAIN); HttpEntity entity = new HttpEnti

docs.spring.io

 

public class HttpEntity<T> {

	private final HttpHeaders headers;

	@Nullable
	private final T body;
}

 

public class RequestEntity<T> extends HttpEntity<T>

public class ResponseEntity<T> extends HttpEntity<T>

HttpEntity 클래스를 상속받아 구현한 클래스가 RequestEntity, ResponseEntity 클래스이다.

ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다. 

따라서, HttpStatus, HttpHeaders, HttpBody를 포함한다.

 

ResponseEntity의 생성자를 보면 this()를 통해서 매개변수가 3개인 생성자를 호출해 결국엔 아래 보이는 매개변수가 3개인 생성자로 가게 된다.

public ResponseEntity(HttpStatus status) {
	this(null, null, status);
}

 

public ResponseEntity(@Nullable T body, HttpStatus status) {
	this(body, null, status);
}

 

 

 

2. 예시를 통해 더 알아보자.


@RestController
public class TestController {

    @GetMapping("/test")
    public ResponseEntity getAllUsers(){
        return new ResponseEntity(HttpStatus.OK);
    }
}

 

 

간단한 코드를 작성하고 Postman으로 요청하면 상태코드 200을 확인할 수 있다.

 

 

이제 ResponseEntity를 이용해서 클라이언트에게 응답을 보내는 예제를 정리해보자.

@Data
public class Message {

    private StatusEnum status;
    private String message;
    private Object data;

    public Message() {
        this.status = StatusEnum.BAD_REQUEST;
        this.data = null;
        this.message = null;
    }
}

Message라는 클래스를 생성하였다. 상태코드 / 메세지 / 데이터를 담을 필드를 추가해준다.

 

 

 

public enum StatusEnum {

    OK(200, "OK"),
    BAD_REQUEST(400, "BAD_REQUEST"),
    NOT_FOUND(404, "NOT_FOUND"),
    INTERNAL_SERER_ERROR(500, "INTERNAL_SERVER_ERROR");

    int statusCode;
    String code;

    StatusEnum(int statusCode, String code) {
        this.statusCode = statusCode;
        this.code = code;
    }
}

상태코드로 전송할 몇 가지 예시를 만든 enum을 생성해준다.

 

 

 

@RestController
public class UserController {

    private UserDaoService userDaoService;

    public UserController(UserDaoService userDaoService) {
        this.userDaoService = userDaoService;
    }

    @GetMapping(value = "/user/{id}")
    public ResponseEntity<Message> findById(@PathVariable int id) {
        User user = userDaoService.findOne(id);
        Message message = new Message();
        HttpHeaders headers= new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));

        message.setStatus(StatusEnum.OK);
        message.setMessage("성공 코드");
        message.setData(user);

        return new ResponseEntity<>(message, headers, HttpStatus.OK);
    }

}

이제 위와 같은 Controller를 하나 생성한 후, id를 통해 일치하는 User를 조회하고 Message 클래스를 통해서 StatusCode, ResponseMessage, ResponseData를 담아서 클라이언트에게 응답을 전송해준다.

 

이제 Postman을 통해 결과를 확인해보면

위와 같이 올바르게 작동하는 것을 확인할 수 있다.

728x90
반응형