📌 @JsonCreator 어노테이션의 역할
@JsonCreator는 Jackson 라이브러리에서 JSON 데이터를 객체로 변환할 때(역직렬화) 생성자를 통해 매핑할 수 있도록 도와주는 어노테이션입니다.
즉, 클라이언트에서 JSON 요청이 들어올 때 해당 생성자를 사용해서 객체를 만들도록 지정하는 역할을 합니다.
📌 @JsonCreator를 사용하는 이유
✅ 1. 기본 생성자가 없거나, final 필드가 있는 경우
- MemberRegisterRequest 클래스의 모든 필드는 final로 선언되어 있기 때문에 Setter가 없음
- 기본 생성자 없이 Jackson이 자동으로 필드를 매핑할 수 없으므로 @JsonCreator를 사용하여 특정 생성자를 통해 객체를 생성하도록 함
✅ 2. JSON의 키 값과 객체 필드명이 다를 때
- JSON에서 들어오는 데이터의 키 값(email, name, password 등)과
클래스의 필드명(mbEmail, mbName, mbPassword)이 다르기 때문에 - @JsonProperty("JSON의 키값")을 이용하여 Jackson이 올바르게 매핑하도록 함
📌 @JsonCreator와 @JsonProperty를 활용한 JSON 매핑 예제
✅ 1. JSON 요청 예시 (클라이언트 → 서버로 보낼 데이터)
{
"email": "user@example.com",
"name": "홍길동",
"password": "Passw0rd!",
"mobile": "01012345678",
"blogFid": "myblog123"
}
✅ 2. @JsonCreator를 사용한 객체 매핑 과정
- Jackson은 JSON 데이터를 MemberRegisterRequest 객체로 변환(역직렬화)하려고 시도
- @JsonCreator가 붙은 생성자를 찾음
- 각 JSON 필드를 @JsonProperty가 지정한 객체 필드에 매핑
- email → mbEmail
- name → mbName
- password → mbPassword
- mobile → mbMobile
- blogFid → blogFid
✅ 3. 변환된 Java 객체
MemberRegisterRequest request = new MemberRegisterRequest(
"user@example.com",
"홍길동",
"Passw0rd!",
"01012345678",
"myblog123"
);
📌 @JsonCreator가 없으면 어떻게 될까?
❌ 1. 기본 생성자가 없으므로 매핑 실패
Jackson은 기본적으로 기본 생성자 + Setter를 이용하여 객체를 생성하는데,
현재 MemberRegisterRequest에는 기본 생성자가 없고 필드가 final이라 Setter도 없음.
따라서, @JsonCreator 없이 JSON 데이터를 객체로 변환하려고 하면 매핑 오류 발생!
즉, 기본 생성자가 없으면 @JsonCreator를 사용해서 역직렬화할 생성자를 지정해야 한다! 🚀
📌 @JsonCreator가 필요한 경우 vs 필요 없는 경우
| 경우 | @JsonCreator 필요 | 설명 |
| 기본 생성자가 있고 Setter 사용 가능 | ❌ 필요 없음 | Jackson이 기본 생성자 + Setter를 이용하여 자동 매핑 |
| 클래스 필드가 final이거나 Setter가 없음 | ✅ 필요함 | 기본 생성자가 없으므로 @JsonCreator를 사용해 생성자 지정 필요 |
| JSON 키 값과 객체 필드명이 다름 | ✅ 필요함 | @JsonProperty를 사용해 매핑해야 함 |
📌 결론
✅ @JsonCreator는 Jackson이 JSON 데이터를 객체로 변환할 때 사용할 생성자를 지정하는 어노테이션
✅ 모든 필드가 final이거나 Setter가 없는 경우 필수적으로 사용해야 함
✅ JSON의 키와 Java 필드명이 다를 경우 @JsonProperty와 함께 사용하면 정확한 매핑 가능
즉, @JsonCreator가 없으면 역직렬화 시 객체 생성이 불가능하므로 필수적인 어노테이션! 🚀
'Spring > 10. rest-api' 카테고리의 다른 글
| 일반적인 MVC 와 @FeignClient에서 @RequestBody / @PathVariable의 사용법 (0) | 2025.03.18 |
|---|---|
| MSA에서 Security는 어디에 적용해야 할까? (0) | 2025.03.18 |
| Eureka에 프론트엔드 등록 여부 – 꼭 등록해야 할까? (0) | 2025.03.18 |
| MSA 환경에서 프런트 엔드를 위한 서버구조 (0) | 2025.03.18 |
| Controller 와 FeignClient에서의 @PathVariable 역할 (0) | 2025.03.17 |