본문 바로가기
spring

[Spring] @JsonCreator로 Enum 역직렬화하기

by goblin- 2024. 10. 30.

@JsonCreator는 Jackson 라이브러리에서 객체를 JSON으로부터 역직렬화(JSON -> Java 객체)할 때 특정한 생성자나 메서드를 사용하여 객체를 생성하도록 지시하는 어노테이션입니다. 이를 통해 복잡한 객체의 필드 매핑을 손쉽게 할 수 있고, JSON 데이터의 특정 값을 이용해 객체를 생성할 수 있습니다.

 

@JsonCreator가 필요한 이유

 

1. 복잡한 객체 변환: JSON 데이터가 객체의 생성자나 필드와 직접 매핑되지 않을 때, 원하는 방식으로 매핑하기 위해 사용합니다.

2. 유효성 검사와 예외 처리: JSON 데이터가 정확한 형태인지 확인하거나, 값이 유효하지 않을 때 예외를 던질 수 있도록 정적 팩토리 메서드와 함께 사용합니다.

 

사용 예시

 

JobType이라는 열거형(ENUM)이 있고, JobType에는 DEVELOPERENGINEER라는 두 가지 값이 있습니다. 이 값들은 각각 이름세부 역할 목록을 가지고 있습니다. 예를 들어, "Developer"라는 JSON 문자열을 받아서 JobType.DEVELOPER로 변환하고 싶다면, @JsonCreator를 통해 Jackson에 이 값이 DEVELOPER로 변환되어야 한다는 규칙을 알려줄 수 있습니다.

 

아래와 같은 코드 예시로 이해해 보겠습니다.

 

코드 예시

// JobType.java

@Getter
@AllArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public enum JobType {
    DEVELOPER("Developer", Arrays.asList("Frontend", "Backend")),
    ENGINEER("Engineer", Arrays.asList("DevOps", "SRE"));

    String name;
    List<String> titles;

    // @JsonCreator로 지정한 정적 팩토리 메서드
    @JsonCreator(mode = Mode.DELEGATING)
    public static JobType deserialize(String name) {
        for (JobType each : JobType.values()) {
            if (each.getName().equals(name)) {
                return each;
            }
        }
        throw new CustomException(ExceptionType.INVALID_INPUT,
            "JobType 내 해당하는 Enum 이 존재하지 않습니다. name : " + name);
    }
}

코드 설명

 

JobType"Developer""Engineer"라는 name 값을 가진 열거형입니다.

deserialize 메서드는 @JsonCreator로 지정되어 있어, Jackson이 이 메서드를 이용해 JSON 문자열을 JobType으로 변환합니다.

Mode.DELEGATING은 JSON에서 넘어온 값 전체를 하나의 파라미터로 전달받아 메서드를 호출하겠다는 의미입니다.

deserialize 메서드는 매핑되지 않는 값이 들어올 경우 예외를 던져서 유효하지 않은 데이터를 처리할 수 있습니다.

 

동작 과정

 

1. JSON 데이터가 아래와 같이 주어진다고 가정합니다:

{
    "job": "Developer"
}

 

2. Jackson은 job이라는 필드를 JobType 객체로 변환하려고 합니다.

3. 이때 @JsonCreator가 붙은 deserialize 메서드가 호출됩니다.

deserialize("Developer")가 호출되고, "Developer" 문자열을 가지고 JobType.DEVELOPER를 찾아 반환합니다.

4. 만약 "Manager"와 같은 유효하지 않은 값이 들어온다면, CustomException을 발생시킵니다.

 

@JsonCreator가 자동으로 실행되는 이유

 

Jackson이 JSON 데이터를 JobType 필드에 매핑할 때, @JsonCreator가 지정된 메서드를 사용하도록 설정되어 있습니다.

따라서 개발자가 직접 deserialize 메서드를 호출하지 않아도, Jackson이 자동으로 JSON 데이터를 JobType으로 변환하기 위해 해당 메서드를 호출합니다.

 

요약

 

@JsonCreator는 Jackson에서 객체를 역직렬화할 때 특정 메서드나 생성자를 사용하게 하는 어노테이션입니다.

JSON 데이터에서 복잡한 형태로 들어오는 값들을 객체로 변환할 때 유용하게 사용됩니다.

Mode.DELEGATING 옵션을 사용하면 JSON에서 전달된 하나의 필드를 deserialize 메서드로 넘겨 객체를 변환하게 할 수 있습니다.

일반적으로 @JsonCreator는 유효성 검사, 예외 처리, 복잡한 변환 로직이 필요한 경우에 사용됩니다.