
ResponseEntity는 HTTP 응답을 나타내는 Spring Framework의 클래스입니다. 이 클래스는 요청에 대한 응답의 HttpHeader, HttpBoday 및 status Code 를 포함하여 클라이언트에게 전달 할 수 있는 기능을 제공합니다.
ResponseEntity를 사용하면, 객체와 status를 함께 보내줄 수 있다. 때문에 @ResponseStatus를 사용하지 않아도 되고 메서드 별로 다른 status를 리턴할 수 있기 때문에 좀 더 세밀하게 상태 전송이 가능하다.
@GetMapping("/responseEntity")
public ResponseEntity<String> responseEntity() {
return ResponseEntity.ok("ok");
}
위 API로 요청을 보낼경우 다음과 같은 응답을 받아볼 수 있다.

하지만 보통 프로젝트를 하다보면 더 구체적인 응답으로 반환받고, 제대로 정보가 전달되었는지 혹은 자신에게 익숙한 형태로 응답을 처리하고싶어서 요청을 하기도한다. 그래서 API들에 대한 공통적으로 쓸 응답형태를 만들기도 한다.
그렇게 만들어진게 ApiResponse이다. 주변의 도움을 조금 받아서인지 괜찮은것같은(?) ApiResponse형식을 만들어 볼 수 있었다.
{
"success": true || false,
"message": "string",
"data": {
json타입
}
}
만약 응답에 성공하게된다면, success에 true 또는 false값을 반환해주며, 미리 지정해둔 입력값의 메시지를 보낼 수 있게 된다.
또한 어떤 데이터가 담겨있는지 직관적으로 볼 수 있도록 json타입으로 데이터를 반환해주기로 하였다.
package whynotthis.domain.common;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class ApiResponse<T> {
private boolean success;
private String message;
private T data;
public static <T> ApiResponse<T> success(T data) {
return new ApiResponse<>(true,"요청이 성공적으로 처리되었습니다.",data);
}
public static <T> ApiResponse<T> success(String message,T data) {
return new ApiResponse<>(true,message,data);
}
public static <T> ApiResponse<T> failure(T data) {
return new ApiResponse<>(false,"요청에 실패했습니다.",data);
}
public static <T> ApiResponse<T> failure(String message,T data) {
return new ApiResponse<>(false,message,data);
}
}
ApiResponse에서 받는 값은 성공의 여부를 확인하는 success, Api의 응답 메시지를 정의해줄 message, 값이 있다면 그걸 담아줄 data 이렇게 총 세개이다.
만약 ApiResponse가 특정 데이터 타입에 고정되어 있다면, 다른 타입의 데이터를 반환하기 위해 별도의 클래스를 만들어야 한다.
하지만 제네릭을 사용하면 ApiResponse에서 T만 달리 지정하여 모든 경우에 대응할 수 있다.
@PostMapping
public ResponseEntity<ApiResponse<Object>> write(@RequestBody BoardRequestDTO boardRequestDTO) {
CustomUserDetails userDetails = SecurityUtil.getEmail();
String email = userDetails.getUsername();
boardService.createBoard(boardRequestDTO,email);
ApiResponse<Object> response = ApiResponse.success("게시글 작성 완료.", boardRequestDTO);
return ResponseEntity.ok(response);
}
성공한다면 아래와 같은 응답이 나온다

만약 실패하게된다면 아래와 같은 응답이 나오도록 설정하였다.

ApiResponse 클래스를 정의하고 그에 맞게 데이터를 json타입으로 반환하는형식으로 진행하였다. 추후 내용에 따라서 다른방식으로도 정의하거나 여러가지 해 볼 수 있을것 같다.