@JsonCreator는 Jackson 라이브러리에서 객체를 JSON으로부터 역직렬화(JSON -> Java 객체)할 때 특정한 생성자나 메서드를 사용하여 객체를 생성하도록 지시하는 어노테이션입니다. 이를 통해 복잡한 객체의 필드 매핑을 손쉽게 할 수 있고, JSON 데이터의 특정 값을 이용해 객체를 생성할 수 있습니다.
@JsonCreator가 필요한 이유
1. 복잡한 객체 변환: JSON 데이터가 객체의 생성자나 필드와 직접 매핑되지 않을 때, 원하는 방식으로 매핑하기 위해 사용합니다.
2. 유효성 검사와 예외 처리: JSON 데이터가 정확한 형태인지 확인하거나, 값이 유효하지 않을 때 예외를 던질 수 있도록 정적 팩토리 메서드와 함께 사용합니다.
사용 예시
JobType이라는 열거형(ENUM)이 있고, JobType에는 DEVELOPER와 ENGINEER라는 두 가지 값이 있습니다. 이 값들은 각각 이름과 세부 역할 목록을 가지고 있습니다. 예를 들어, "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는 유효성 검사, 예외 처리, 복잡한 변환 로직이 필요한 경우에 사용됩니다.
'spring' 카테고리의 다른 글
[Spring] RuntimeException을 통한 CustomException (0) | 2024.10.31 |
---|---|
[Spring] @RestControllerAdvice와 @ExceptionHandler를 통한 예외처리 (0) | 2024.10.31 |
[Spring] CustomError 작성법 (0) | 2024.10.20 |
[Spring] 주요 Annotation (3) | 2024.10.19 |
[Spring] Bean (1) | 2024.10.12 |