- 스프링 부트로 백엔드 API를 만들면서, 반환하는 데이터가 없는 api를 위해 다음처럼 응답 DTO를 만들었다. 데이터가 없는 경우 json의
data
가 null
을 반환하도록 하고 싶었다
@Getter
@NoArgsConstructor
public class ApiResponse<T> {
private CommonData common;
private T data;
private ApiResponse(CommonData common) {
this.common = common;
}
private ApiResponse(CommonData common, T data) {
this.common = common;
this.data = data;
}
public static <T> ApiResponse<T> ok(String requestUri) {
CommonData common = new CommonData("success", requestUri, HttpStatus.OK);
return new ApiResponse<>(common);
}
public static <T> ApiResponse<T> ok(String requestUri, T data) {
CommonData common = new CommonData("success", requestUri, HttpStatus.OK);
return new ApiResponse<>(common, data);
}
- 이때 고민이었던게, 어쨋든 제네릭 T 타입은 선언을 해줘야하는데 어떤 타입을 쓸지였다. 처음에는
Object
를 넣었었다
@PatchMapping("/{ticketId}/paymentStatus/completed")
public ApiResponse<Object> completeTicketPayment(final @PathVariable String ticketId) {
}
- 객체가 없는건데 모든 객체를 받을 수 있게 제네릭을 사용하는 건 이상한거 같아서 찾아보다보니
void
도 Integer, Long
처럼 객체가 있다는 것을 알게 되었다. int, long
같은 원시형을 래핑하는 객체와는 달리 void
키워드를 클래스로 표현하기 위한 객체이다
public final
class Void {
@SuppressWarnings("unchecked")
public static final Class<Void> TYPE = (Class<Void>) Class.getPrimitiveClass("void");
private Void() {}
}
- 그래서 제네릭에
Void
를 넣었더니 딱 알맞고 굳!
@PatchMapping("/{ticketId}/paymentStatus/completed")
public ApiResponse<Void> completeTicketPayment(final @PathVariable String ticketId) {
}