가천-카카오엔터프라이즈 SW 아카데미를 참여하면서, 겪은 에러 상황에 대해 트러블 슈팅을 작성하고자 합니다.
이슈 설명
👉 API를 작성하면서 목록 데이터를 페이징하여 전달해줘야 했습니다. 페이징 중 Slice의 정보만 필요하여, hasNext, isFirst, isLast의 값을 DTO에 담아서 응답 값을 전달하였습니다.
하지만, Swagger로 테스트를 하면 계속해서 isFirst → First, isLast → Last로 응답하는 이슈가 있었습니다.
문제 분석
👉 ‘JavaBeans Convention’ 처리 방식에 의해 is 키워드가 제거되는 문제
Java Beans 컨벤션에 따라 boolean 타입의 필드에 대한 getter 메서드는 is로 시작합니다. boolean isLast 필드의 경우, getter 메서드는 isLast()가 됩니다.
필드명이 is로 시작하는 경우, getter 생성 시 JavaBeans 컨벤션에 따라 is 접두사가 제거된 이름으로 처리되어, last, first를 기본 필드명으로 인식합니다.
@Getter
public static class PostItemList {
private List<PostItem> postItem;
private boolean hasNext;
private boolean isFirst;
private boolean isLast;
}
그래서 제가 작성한 아래의 DTO 클래스에서 boolean 타입의 변수명들이 작성한 필드명대로 인식되지 않는 문제였습니다.
해결 방법
👉 변수명 변경 or 자료형 Boolean으로 변경 or @JsonProperty 사용하기
저는 위 문제를 해결하고자 isFirst, isLast를 hasFirst, hasLast로 변경할까 고민이었습니다. 하지만 관례로 첫 페이지 여부와 마지막 페이지의 여부를 isFirst, isLast로 사용하고 있기에 다른 방법을 선택하였습니다.
boolean 타입을 래퍼 클래스인 Boolean 타입으로 변경하면 올바르게 변수명을 표기할 수 있었습니다. 다른 방법으로는 @JsonProperty를 작성하여 원하는 변수명을 지정할 수도 있습니다.
@JsonProperty를 사용하는 경우 Slice를 적용하는 모든 DTO에 추가적인 코드를 작성해줘야 하므로, 자료형을 래퍼 클래스 Boolean으로 변경하여 해결하였습니다.