상황
프론트에서 특정 기능을 사용 유무를 판단하기 위한 boolean 값의 필드를 디비에 추가해야 할 일이 있었다.
해당 기능은 CUD API를 제공해야 하는 기획이었으므로 DTO에도 필드값과 대응되는 멤버변수를 추가해주었다.
그러나 API를 태워본 결과 결과 데이터 바인딩이 제대로 되지 않는 이슈가 있었다.
원인
스프링이 내부적으로 Data Mapping을 할 때 사용하는 직렬화/역직렬화 라이브러리인 Jackson에 버그가 있었다.
Jackson 라이브러리는 Java 객체를 JSON으로 직렬화할 때 get이나 is로 시작하는 메소드를 찾아서 해당 값들을 JSON 속성으로 매핑한다. 그런데 Jackson 라이브러리의 특정 버전에서는 is로 시작하는 메소드의 경우 이를 직렬화 및 역직렬화 대상에서 제외시키는 버그가 있었던 것이다.
해결 방안
@JsonProperty를 세팅해주어 해결하였다.
@JsonProperty 어노테이션을 사용하면 Jackson에게 해당 필드가 JSON에서 어떤 이름으로 표시되어야 하는지 명시적으로 알려준다.
해당 어노테이션을 사용하면 Jackson이 사용하는 자동 추론을 재정의 할 수 있기 때문이다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@JsonProperty("isActive")
private boolean isActive;
}