Java

Jackson 커스텀 어노테이션: @JacksonAnnotationsInside

누구세연 2024. 12. 21. 13:43
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 {
}
  1. `@JacksonAnnotationsInside`
    이 어노테이션이 없으면, Jackson은 `@SnakeCase`가 Jackson 관련 설정임을 인식하지 못합니다.
    따라서 커스텀 어노테이션은 단순히 Java 어노테이션으로만 동작하며, Jackson에 적용되지 않습니다.
  2. `@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)`
    Jackson에서 제공하는 어노테이션으로, 클래스의 프로퍼티 이름을 Snake Case(스네이크 케이스) 형식으로 변환합니다.
    예를 들어, myProperty는 my_property로 직렬화됩니다.
  3. 결과적으로 `@SnakeCase`를 클래스에 선언하면 내부적으로 `@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)`가 동작하게 됩니다.

 

@JacksonAnnotationsInside가 없다면?

Jackson은 @SnakeCase를 Jackson 관련 어노테이션으로 인식하지 않습니다.

따라서 아무런 효과도 없으며, 커스텀 어노테이션은 단순히 Java 레벨에서만 동작하게 됩니다.

 

 

어떤 상황에서 유용한가?

  • Jackson 어노테이션을 반복적으로 사용하는 경우, 커스텀 어노테이션으로 캡슐화하여 코드를 간결하고 가독성 높게 작성할 수 있습니다.
  • 팀원 간 규칙적인 Jackson 설정을 공유하거나, 특정 프로젝트에 특화된 Jackson 설정을 쉽게 관리할 때 유용합니다.

 

 

@JacksonAnnotationsInside는 Jackson에서 커스텀 어노테이션을 완전히 활용하기 위해 반드시 필요한 어노테이션입니다.
이를 통해 반복적인 코드를 줄이고 Jackson 설정을 더 효율적으로 관리할 수 있습니다.