[Spring Boot] 공통 응답 ApiResponse 만들기

nano·2024년 11월 25일

Spring Boot

목록 보기
1/4
post-thumbnail

ResponseEntity

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이다. 주변의 도움을 조금 받아서인지 괜찮은것같은(?) ApiResponse형식을 만들어 볼 수 있었다.

  • ApiResponse
{
    "success": true || false,
    "message": "string",
    "data": {
    		json타입
    }
}

만약 응답에 성공하게된다면, success에 true 또는 false값을 반환해주며, 미리 지정해둔 입력값의 메시지를 보낼 수 있게 된다.
또한 어떤 데이터가 담겨있는지 직관적으로 볼 수 있도록 json타입으로 데이터를 반환해주기로 하였다.

구현

먼저 ApiResonse의 코드이다.

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 이렇게 총 세개이다.

왜 데이터타입은 T로 해야할까?

  • API의 응답의 경우 여러가지 경우에 따라 다르게 반환을 해야한다.
    • 사용자가 정보 요청 시, User 객체를 반환
    • 목록 데이터를 요청 시, List 같은 객체를 반환

만약 ApiResponse가 특정 데이터 타입에 고정되어 있다면, 다른 타입의 데이터를 반환하기 위해 별도의 클래스를 만들어야 한다.
하지만 제네릭을 사용하면 ApiResponse에서 T만 달리 지정하여 모든 경우에 대응할 수 있다.

API 요청 결과

    @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타입으로 반환하는형식으로 진행하였다. 추후 내용에 따라서 다른방식으로도 정의하거나 여러가지 해 볼 수 있을것 같다.

0개의 댓글