Day10. Springboot: Jackson 사용 시 boolean

2ㅣ2ㅣ·2024년 11월 3일

Project

목록 보기
9/13

개요

로그인 시 BaseResponse 클래스의 isSuccess 필드가 JSON 응답에서 의도와 다르게 나타나는 문제가 발생했다. 이를 해결하기 위해 Jackson 라이브러리의 동작 방식을 이해할 필요가 있었다.

As-Is

isSuccesssuccess라는 키로 한번 더 리턴이 되고 있었다.

BaseResponse.java
@JsonProperty로 JSON 필드명도 명시해주고 있는 상황이었다.

@JsonProperty("isSuccess")
private boolean isSuccess

LoginFilter.java
로그인 메세지를 보내는 메서드이다. JacksonObjectMapper를 사용하여 JSON으로 변환하고 있었다.

    /**
     * Login 성공/실패 시 메세지 보내는 메서드
     * */
    private void sendMemberLoginResponse(
            HttpServletResponse response,
            HttpStatus status,
            BaseResponse<?> baseResponse) throws IOException{
        response.setContentType("application/json;charset=UTF-8");
        response.setStatus(status.value());

        PrintWriter out = response.getWriter();
        out.print(new ObjectMapper().writeValueAsString(baseResponse));
        out.flush();
    }

이유는 Jackson은 자바 빈(Bean) 규약을 따르며, boolean 타입의 필드에 대해 getter 메서드를 사용할 때 is 접두사를 사용한다. 예를 들어, isSuccess 필드의 getter는 isIsSuccess()가 된다. 그러나 Jackson은 JSON 필드명을 결정할 때는 is 접두사를 제거하고 나머지 부분을 생성하여 사용한다.

그러면 sccuess 필드만 나타나야 되는거 아닌가? 그런데 나는 isSuccesssuccess가 동시에 나왔다. 이유는 @JsonProperty를 사용하여 isSuccess를 명시적으로 지정해줬기 때문이다.


@JsonProperty를 제거하면 success만 나타나는걸 확인할 수 있다.

To-Be

BaseResponse 클래스의 isSuccess 필드를 Wrpper 클래스인 Boolean으로 변경했다.

BaseResponse.java

@JsonProperty("isSuccess")
private Boolean isSuccess


BaseResponse대로 잘 응답받는걸 확인할 수 있다.

Jackson 라이브러리를 사용할 때, is로 시작하는 boolean 타입의 필드명은 JSON 변환 시 필드명이 의도와 다르게 나타날 수 있음을 유의하자.


출처
✔️ Jackson 사용시 primitive boolean 주의점

0개의 댓글