[Spring Boot] 공통 Response 객체 만들기

wujin·2024년 2월 7일
post-thumbnail

Spring Boot에서 공통 응답 구조를 만드는 것은 API를 표준화하고, 모든 응답에 일관된 형식을 제공하여 클라이언트 측에서 예측 가능하고 안정적으로 동작하도록 돕는 좋은 방법이다.

Spring Boot에서 공통 응답 구조를 정의하여 API를 표준화하는 것은 개발 및 유지 관리에 있어 중요한 부분이다. 모든 응답이 동일한 형식을 갖추면 클라이언트 측에서도 예측 가능하고 안정적으로 동작할 수 있다.

1. 공통 응답 객체 정의

먼저, 공통 응답 객체의 기본 클래스를 정의한다. 이 클래스는 HTTP 상태 코드와 메시지를 포함한다.

CommonResponse.java

/**
 * 공통 응답 객체의 기본 클래스
 */
public class CommonResponse {
    private int code; // HTTP 상태 코드 또는 사용자 정의 응답 코드
    private String message; // 응답에 대한 설명 또는 상태 메시지
}

이 기본 클래스를 확장하여 단일 데이터 응답과 리스트 응답을 생성할 수 있다.

SingleResponse.java

/**
 * 단일 데이터를 위한 응답 객체
 */
public class SingleResponse<T> extends CommonResponse {
    private T data; // 응답 데이터
}

ListResponse.java

/**
 * 다중 데이터를 위한 응답 객체
 */
public class ListResponse<T> extends CommonResponse {
    private List<T> dataList; // 응답 데이터 리스트
}

SingleResponse는 단일 객체를 포함하는 응답에 사용되며, ListResponse는 객체의 리스트를 포함하는 응답에 사용된다.

2. ResponseService 정의

공통 응답 구조를 제공하는 서비스 클래스를 만들어, 단일 데이터와 리스트 데이터를 위한 응답 객체를 생성할 수 있다.

/**
 * 응답 객체를 생성하는 서비스 클래스
 */
@Service
public class ResponseService {

    /** 단일 데이터에 대한 응답 객체를 생성 */
    public <T> SingleResponse<T> getSingleResponse(T data) {
        SingleResponse<T> singleResponse = SingleResponse.<T>builder().data(data).build();
        setSuccessResponse(singleResponse);

        return singleResponse;
    }

    /** 데이터 리스트에 대한 응답 객체를 생성 */
    public <T> ListResponse<T> getListResponse(List<T> dataList) {
        ListResponse<T> listResponse = ListResponse.<T>builder().dataList(dataList).build();
        setSuccessResponse(listResponse);

        return listResponse;
    }

    /** 성공 상태와 메시지를 설정하는 메서드 */
    private void setSuccessResponse(CommonResponse response) {
        response.setCode(0); // 성공 코드
        response.setMessage("SUCCESS"); // 성공 메시지
    }
}

이 서비스 클래스는 공통 응답 구조를 사용하여 다양한 형태의 응답 객체를 생성한다. getSingleResponse는 단일 객체를 반환하는 API에 사용하고, getListResponse는 리스트 데이터를 반환하는 API에 사용된다. setSuccessResponse 메서드를 통해 성공 상태와 메시지를 설정할 수 있다.

3. Controller에서 공통 응답 사용

위에서 정의한 응답 객체와 서비스 클래스를 사용하여 컨트롤러에서 공통 응답 구조를 적용해보았다.

public class SampleController {

	private final ResponseService responseService;

    // 단일 데이터 응답을 생성하는 엔드포인트
    @GetMapping("/single")
    public SingleResponse<String> getSingle() {
        return responseService.getSingleResponse("Hello, World!");
    }

    // 리스트 데이터 응답을 생성하는 엔드포인트
    @GetMapping("/list")
    public ListResponse<String> getList() {
        List<String> listData = Arrays.asList("Item 1", "Item 2", "Item 3");
        return responseService.getListResponse(listData);
    }
}

4. 결론

공통 응답 구조를 사용하면 API의 일관성을 유지하고, 클라이언트 측에서 예측 가능한 방식으로 응답을 처리할 수 있다. 또한, 개발자 측면에서는 코드 재사용성을 높이고, 예외 처리 등을 통해 일관된 오류 메시지를 제공할 수 있다. 이러한 구조를 적용하면 API 개발이 더욱 안정적이고 효율적으로 진행될 수 있다.

0개의 댓글