JackSon(JSON 관련 어노테이션)

민준·2025년 3월 22일

Spring Boot

목록 보기
3/3
post-thumbnail

Spring Boot에서 객체를 JSON으로 변환할 때, Jackson이라는 라이브러리를 많이 쓴다.
이 라이브러리는 Java 객체를 JSON으로 변환(직렬화)하거나 JSON을 Java 객체로 변환(역직렬화)하는 역할을 한다.
이때, Jackson이 제공하는 여러 어노테이션을 사용하면 JSON 데이터를 더 쉽게 다룰 수 있음.


1. 각 어노테이션의 역할

1) @JsonInclude

  • "NULL 값은 JSON에서 빼줘!"

  • 기본적으로 Java 객체의 필드는 모두 JSON으로 변환됨.

  • 하지만 NULL 값을 가진 필드도 포함되면 보기 지저분할 수 있어서 클래스 선언부분 위에 @JsonInclude(JsonInclude.Include.NON_NULL)를 사용하면 NULL인 필드는 JSON에서 제외하여 깔끔하게 값을 반환할수 있음.

    (예시)

    @JsonInclude(JsonInclude.Include.NON_NULL) // 혹은   @JsonInclude(Include.NON_NULL)을 사용해도 됨.
    public class UserResponseDto {
        private String name;
        private String address; // null일 경우 JSON에서 제외
    }

    {"name": "Alice"} (address가 null이면 JSON에서 아예 빠져서 출력됨)


2) @JsonProperty

  • "JSON에서 보이는 필드 이름을 변경하고 싶어!"

  • Java에서는 변수명을 camelCase로 많이 쓰지만, 프론트엔드에서는 snake_case를 선호하는 경우가 있다.

  • @JsonProperty("user_name")을 사용하면 Java 객체의 userName 필드를 JSON에서 user_name으로 변환할 수 있다.

    (예시)

    public class UserDto {
        @JsonProperty("user_name")
        private String userName;
    }

    {"user_name": "Alice"}


3) @JsonNaming

  • "모든 필드의 네이밍 컨벤션을 한 번에 바꾸고 싶어!"

  • @JsonProperty를 필드마다 넣는 건 상당히 귀찮다.

  • 따라서 @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)을 사용하면 클래스 내 모든 필드를 한 번에 snake_case로 변환 가능.

    (예시)

    @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
    public class Student {
        private String myName;
        private String myAge;
    }

    {"my_name": "Alice", "my_age": "20"}


4) @JsonPropertyOrder

  • "출력시 JSON 필드 순서를 정하고 싶어!"

  • 기본적으로 JSON은 필드 순서를 보장하지 않지만, 특정 순서대로 정렬하고 싶을 때 사용

    (예시)

    @JsonPropertyOrder({"userId", "userName"})
    public class UserDto {
        private String userName;
        private Integer userId;
    }

    {"userId": 1, "userName": "Alice"}


5) @JsonIgnore

  • "JSON에서 특정 필드를 숨기고 싶어!"

  • @JsonIgnore를 사용하면 JSON 응답에서 특정 필드를 제외할 수 있어.

    (예시)

    public class UserDto {
        private String name;
        @JsonIgnore
        private String password; // JSON에서 제외됨
    }

    {"name": "Alice"} (password 필드는 보이지 않음)


6) @JsonFormat

  • "날짜 포맷을 변경하고 싶어!"

  • Java의 LocalDateTime을 JSON으로 변환하면 이상한 포맷이 나올 수 있음.

  • @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")를 사용하면 원하는 포맷으로 변환 가능.

    (예시)

    public class Event {
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private LocalDateTime eventDate;
    }

    {"eventDate": "2025-03-05 15:30:00"}


7) @JacksonAnnotationsInside

  • "자주 쓰는 JSON 어노테이션을 하나로 만들어서 사용하고 싶어!"

  • 여러 어노테이션을 조합해서 새로운 커스텀 어노테이션을 만들 때 사용.

    (예시)

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    @JacksonAnnotationsInside
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder
    public @interface CustomJson {
    }

8) Enum 관련 직렬화

  • "Enum을 JSON에서 보기 좋게 변환하고 싶어!"

  • 기본적으로 Java의 Enum 값은 JSON에서 "ENUM_NAME" 형태로 반환돼.

  • @JsonValue, @JsonCreator 등을 사용하면 변환 방식을 조정할 수 있어.

    (예시 - 특정 값만 반환)

    public enum Status {
        @JsonValue
        SUCCESS("Success"),
        FAILURE("Failure");
    
        private String value;
        Status(String value) {
            this.value = value;
        }
    }

    {"status": "Success"}


2. 정리하면?

어노테이션역할
@JsonIncludeNULL 값 제외 가능
@JsonProperty필드명을 JSON에서 변경
@JsonNaming모든 필드의 네이밍 컨벤션 변경
@JsonPropertyOrderJSON 필드 순서 지정
@JsonIgnore특정 필드를 JSON에서 제외
@JsonFormat날짜 형식을 변환
@JacksonAnnotationsInside여러 어노테이션을 조합한 커스텀 어노테이션 생성
@JsonValueEnum을 JSON에서 특정 값으로 변환
@JsonCreatorJSON 데이터를 특정 Enum 값으로 변환

0개의 댓글