응답 DTO의 boolean 필드를 반환할 때 발생한 문제와 해결

HoyongLee·2023년 5월 25일
0

Serialize와 Deserialize

간단하게 말하자면,

  • Serialize(직렬화) : POJO를 외부에서 사용할 수 있도록 Byte 형태로 변환하는 것.
    • 변수에 POJO 인스턴스를 할당할 때, 변수에는 POJO 인스턴스의 주소값이 저장된다.
    • 외부에서 POJO의 주소값이 아닌 값 자체를 볼 수 있도록 Byte 형태로 변환하는 것이다.
  • Deserialize(역직렬화) : Byte 형태의 데이터를 POJO로 변환하는 것.

ObjectMapper

Jackson 라이브러리의 ObjectMapper를 사용하여 요청/응답 객체를 역직렬화/직렬화 한다.

  • ObjectMapper 는 POJO를 직렬화/역직렬화할 때, getter , setter , isgetter , creator , field 를 이용한다.
  • getter 를 사용하여 직렬화 할 때, getXXX() 에서 XXX를 키로, getXXX() 의 반환 값을 값으로 사용하기 때문에, 필드와 getter 메서드의 네이밍에 유의해야 한다.

문제상황

  • @Getter 롬복 어노테이션을 활용했는데, boolean 타입의 필드에 대해서는 getXXX() 가 아닌 isXXX()getter를 만든다(타입이 Boolean 일 때는 getXXX()로 생성된다).
  • 따라서 DTO를 직렬화 할 때, isXXXXXX를 키 값으로, isXXX()의 반환값을 값으로 사용했기 때문에 is가 사라진 필드명이 보이는 것이다.
  • @JsonProperty 에 value로 명시된 값을 직렬화 시 키로 사용하고, 필드의 값 or getter()의 반환값으로 추가하기 때문에 XXX, isXXX 모두 나타나는 것으로 추측된다(확실하지 않음).

해결방법

  • @JsonAutoDetect 는 직렬화 시 필드를 AUTO DETECT 하기 위한 메서드를 정할 수 있고, 접근 제한 수준까지 정할 수 있는 어노테이션이다. 즉, 필드의 직렬화 대상을 설정할 수 있다.
  • 위와 같은 경우 필드 가시성을 ANY(모든 접근제한자를 허용)로, isGetter(isXXX()와 같은 메서드)의 가시성을 NONE(모든 접근제한자를 허용하지 않음)으로 설정하여 isGetter를 사용하는 필드는 isGetter를 사용하여 값을 넣는게 아닌, 필드에 접근하여 값을 넣도록 하여 문제를 해결했다. → isGetter 를 접근할 수 없으므로, 필드명을 읽어 직렬화 시 넣을 키(isXXX)를 정하기 때문에 결과에서 isXXX: value로 나타나는 것을 확인할 수 있다.
profile
아직 반지하

0개의 댓글