이끌든지 따르든지 비키든지

Framework/Spring

[Spring] Java Bean 규약과 JSON 직렬화 문제

SeongHo5 2024. 9. 3. 20:25

최근 서비스에서 캐시 기능을 구현하다가, 흥미로운 문제를 마주했습니다.

 

isTypeA()라는 단순한 메서드를 추가했을 뿐인데,

캐시된 데이터를 불러오는 과정에서 typeA라는 필드를 찾을 수 없다는 오류가 발생한 것입니다.

 

 

원인


 

이는 Java Bean 명명 규약과 관련이 있었습니다.

Java에서는 is로 시작하는 메서드를 boolean 타입 필드의 getter로 인식하는데, Jackson 라이브러리가 이 규약에 따라 JSON 변환을 수행하다 보니 발생한 문제였습니다.

 

 

Java Bean 명명 규약

Java Bean 규약에 따르면, is로 시작하는 메서드는 boolean(primitive) 타입 필드의 getter로 인식된다. 
· isActive() → active 필드의 getter로 해석
· isEnabled() → enabled 필드의 getter로 해석

 

  1. 특정 타입 체크를 위한 isTypeA() 메서드를 클래스에 추가
  2. 객체가 캐시에 저장될 때 Jackson이 이 메서드를 boolean 필드의 getter로 해석
  3. 실제로는 존재하지 않는 필드가 JSON에 포함되어 저장
  4. 캐시에서 데이터를 읽어올 때 해당 필드를 매핑할 수 없어 역직렬화 실패

 

해결


 

가장 간단한 해결 방법은 @JsonIgnore 어노테이션을 추가하는 것입니다.

 

또는 메서드명을 checkTypeA() 등 다른 이름으로 변경하는 것으로도 이 문제를 해결할 수 있습니다.

 

 

 

프레임워크나 라이브러리가 제공하는 기능을 사용할 때는 동작 방식을 이해하는 것이 중요하고,

특히 Java Bean 규약처럼 널리 사용되는 관례들이 예상치 못한 곳에서 영향을 미칠 수 있다는 점을 배웠다.......