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로 선언을 해줄 경우, 코드의 가독성이 향상될 수 있습니다.