본문 바로가기
Spring/10. rest-api

@JsonCreator 사용

by 989898 2025. 3. 18.

📌 @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를 사용한 객체 매핑 과정

  1. Jackson은 JSON 데이터를 MemberRegisterRequest 객체로 변환(역직렬화)하려고 시도
  2. @JsonCreator가 붙은 생성자를 찾음
  3. 각 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가 없으면 역직렬화 시 객체 생성이 불가능하므로 필수적인 어노테이션! 🚀