[오늘의 배움] Java Void 타입

이상민·2021년 11월 2일
2

[오늘의 배움]

목록 보기
64/70
post-thumbnail
  • 스프링 부트로 백엔드 API를 만들면서, 반환하는 데이터가 없는 api를 위해 다음처럼 응답 DTO를 만들었다. 데이터가 없는 경우 json의 datanull을 반환하도록 하고 싶었다
@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) {
        // 뭔가 작업
    }
  • 객체가 없는건데 모든 객체를 받을 수 있게 제네릭을 사용하는 건 이상한거 같아서 찾아보다보니 voidInteger, 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) {
        // 뭔가 작업
    }
profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글