본문 바로가기

Spring

Spring Boot CustomResponse

1. CustomResponse

Provide the parametrized type for this generic.
Raw use of parameterized class 'CustomResponse'

@Getter
@AllArgsConstructor
public class CustomResponse<T> {

    private static final String HTTP_STATUS_SUCCESS = "success";
    private String status;
    private int code;
    private String message;
    private T data;

    public CustomResponse(String status, int code, String message) {
        this.status = status;
        this.code = code;
        this.message = message;
    }

    public static CustomResponse successResponse(String message) {

        return new CustomResponse(
                HTTP_STATUS_SUCCESS,
                HttpStatus.OK.value(),
                message
        );
    }

    public static <T> CustomResponse<T> successResponse(String message, T data) {

        return new CustomResponse(
                HTTP_STATUS_SUCCESS,
                HttpStatus.OK.value(),
                message,
                data
        );
    }
}

기존의 코드는 이와 같이 제네릭이 있음에도 불구하고,

public static CustomResponse successResponse(String message) {

        return new CustomResponse(
                HTTP_STATUS_SUCCESS,
                HttpStatus.OK.value(),
                message
        );
    }

제네릭을 명시해주지 않고 사용하고 있었습니다.

위의 코드는 다음과 같은 컨트롤러에서 사용되었습니다.

@PostMapping("/oauth/kakao")
    public ResponseEntity<CustomResponse> kakaoLogin() {

        return ResponseEntity
                .ok()
                .body(new CustomResponse(
                        "success",
                        200,
                        "카카오 로그인 성공"
                ));
    }

이 코드의 문제점이 보이시나요?

2. 문제점

위 코드의 문제점은 제네릭을 마음대로 생략했다는 것입니다.

Data가 들어가지 않기 때문에 생략을 한 것이지만, 코드를 처음 보는 사람이 위 코드를 보았을 때 혼동이 올 수 있습니다.

따라서 제네릭을 사용하지 않는다고 Void를 다음과 같이 명시해주어야 합니다.

3. 해결

@PostMapping("/oauth/kakao")
    public ResponseEntity<CustomResponse<Void>> kakaoLogin() {

        return ResponseEntity
                .ok()
                .body(CustomResponse.successResponse("카카오 로그인 성공"));
    }
public static CustomResponse<Void> successResponse(String message) {

        return new CustomResponse<>(
                HTTP_STATUS_SUCCESS,
                HttpStatus.OK.value(),
                message
        );
    }

이처럼 data 부분을 사용하지 않겠다고 Void로 선언을 해줄 경우, 코드의 가독성이 향상될 수 있습니다.