Jackson 관련하여 공통적인 코드를 분리하기 위해 커스텀 어노테이션을 만들어 사용하기로 결정했습니다.
그 과정에서 Jackson이 커스텀 어노테이션을 인식하도록 하기 위해 @JacksonAnnotationsInside라는 어노테이션이 필요하다는 사실을 알게 되었고, 이를 정리해보았습니다. 👀
@JacksonAnnotationsInside란 무엇인가?
`@JacksonAnnotationsInside`는 Jackson 라이브러리에서 제공하는 메타 어노테이션으로, 커스텀 어노테이션이 Jackson의 어노테이션처럼 동작하도록 정의할 때 사용됩니다.
즉, 이 어노테이션이 없으면 Jackson이 커스텀 어노테이션을 인식하지 못합니다.
왜 필요한가?
기본적으로 Jackson은 자신이 제공하는 어노테이션(@JsonNaming, @JsonProperty 등)만 처리하도록 설계되어 있습니다.
만약 Jackson 관련 동작을 커스텀 어노테이션으로 캡슐화하려면 `@JacksonAnnotationsInside`를 사용하여 Jackson이 이를 Jackson 어노테이션으로 처리하도록 알려주어야 합니다.
사용 예시
아래는 snake case로 직렬화를 위한 커스텀 어노테이션을 만들어보도록 하겠습니다.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside // Jackson에게 이 커스텀 어노테이션이 Jackson 어노테이션임을 알림
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) // 실제 동작 정의
public @interface SnakeCase {
}
- `@JacksonAnnotationsInside`
이 어노테이션이 없으면, Jackson은 `@SnakeCase`가 Jackson 관련 설정임을 인식하지 못합니다.
따라서 커스텀 어노테이션은 단순히 Java 어노테이션으로만 동작하며, Jackson에 적용되지 않습니다. - `@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)`
Jackson에서 제공하는 어노테이션으로, 클래스의 프로퍼티 이름을 Snake Case(스네이크 케이스) 형식으로 변환합니다.
예를 들어, myProperty는 my_property로 직렬화됩니다. - 결과적으로 `@SnakeCase`를 클래스에 선언하면 내부적으로 `@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)`가 동작하게 됩니다.
@JacksonAnnotationsInside가 없다면?
Jackson은 @SnakeCase를 Jackson 관련 어노테이션으로 인식하지 않습니다.
따라서 아무런 효과도 없으며, 커스텀 어노테이션은 단순히 Java 레벨에서만 동작하게 됩니다.
어떤 상황에서 유용한가?
- Jackson 어노테이션을 반복적으로 사용하는 경우, 커스텀 어노테이션으로 캡슐화하여 코드를 간결하고 가독성 높게 작성할 수 있습니다.
- 팀원 간 규칙적인 Jackson 설정을 공유하거나, 특정 프로젝트에 특화된 Jackson 설정을 쉽게 관리할 때 유용합니다.
@JacksonAnnotationsInside는 Jackson에서 커스텀 어노테이션을 완전히 활용하기 위해 반드시 필요한 어노테이션입니다.
이를 통해 반복적인 코드를 줄이고 Jackson 설정을 더 효율적으로 관리할 수 있습니다.
'Java' 카테고리의 다른 글
[Java] Map.getOrDefault()가 예외를 던진다고? (0) | 2025.04.16 |
---|---|
JDK 23: 자바 핵심 변경점 정리 (0) | 2025.01.15 |
[Java] JPA에서 발생하는 N+1 이슈: 원인부터 해결까지 (1) | 2024.11.27 |
Java의 Reflection 사용법과 주의점 (0) | 2024.11.24 |
[Java] 빌더 패턴 (1) | 2024.11.23 |