최근 서비스에서 캐시 기능을 구현하다가, 흥미로운 문제를 마주했습니다.
isTypeA()라는 단순한 메서드를 추가했을 뿐인데,
캐시된 데이터를 불러오는 과정에서 typeA라는 필드를 찾을 수 없다는 오류가 발생한 것입니다.
원인
이는 Java Bean 명명 규약과 관련이 있었습니다.
Java에서는 is로 시작하는 메서드를 boolean 타입 필드의 getter로 인식하는데, Jackson 라이브러리가 이 규약에 따라 JSON 변환을 수행하다 보니 발생한 문제였습니다.
Java Bean 명명 규약
Java Bean 규약에 따르면, is로 시작하는 메서드는 boolean(primitive) 타입 필드의 getter로 인식된다.
· isActive() → active 필드의 getter로 해석
· isEnabled() → enabled 필드의 getter로 해석
- 특정 타입 체크를 위한 isTypeA() 메서드를 클래스에 추가
- 객체가 캐시에 저장될 때 Jackson이 이 메서드를 boolean 필드의 getter로 해석
- 실제로는 존재하지 않는 필드가 JSON에 포함되어 저장
- 캐시에서 데이터를 읽어올 때 해당 필드를 매핑할 수 없어 역직렬화 실패
해결
가장 간단한 해결 방법은 @JsonIgnore 어노테이션을 추가하는 것입니다.
또는 메서드명을 checkTypeA() 등 다른 이름으로 변경하는 것으로도 이 문제를 해결할 수 있습니다.
프레임워크나 라이브러리가 제공하는 기능을 사용할 때는 동작 방식을 이해하는 것이 중요하고,
특히 Java Bean 규약처럼 널리 사용되는 관례들이 예상치 못한 곳에서 영향을 미칠 수 있다는 점을 배웠다.......
'Framework > Spring' 카테고리의 다른 글
Gradle의 의존성 구성 (0) | 2024.07.21 |
---|---|
[Spring] 애플리케이션과 NCP Object Storage 연결하기 (0) | 2024.03.25 |
[Spring] 스프링의 캐시 추상화 (0) | 2024.03.17 |
[Spring] SpEL으로 더 강력하게 표현식 작성하기 (0) | 2024.03.13 |
[Spring] 애플리케이션의 초기 응답 속도 개선하기 (0) | 2024.03.07 |