Jackson이 JSON 직렬화하는 방식
getter 없는 응답 객체가 빈 JSON이나 406을 뱉는 이유를 Jackson의 직렬화 우선순위(게터 우선, 그다음 public 필드)로 짚은 짧은 정리.
작성날짜: 25.07.14
Spring Boot에서 사용하는 Jackson 라이브러리는 기본적으로 다음 순서로 객체를 JSON으로 변환합니다:
- Getter 메서드를 우선적으로 사용 🔥
- Public 필드가 있으면 직접 접근
- 둘 다 없으면 직렬화 실패
// 1. Getter가 없는 경우 (직렬화 실패)
public class BadExample {
private String name;
private int age;
// getter 없음 → Jackson이 JSON으로 변환 불가능
// 결과: 406 Not Acceptable 또는 빈 JSON {}
}
// 2. Getter가 있는 경우 (직렬화 성공)
public class GoodExample {
private String name;
private int age;
// Jackson이 이 getter들을 통해 JSON 생성
public String getName() { return name; }
public int getAge() { return age; }
// 결과: {"name":"John","age":25}
}
// 3. Public 필드인 경우 (직렬화 성공)
public class PublicFieldExample {
public String name; // public이므로 직접 접근 가능
public int age;
// getter 없어도 Jackson이 직접 필드에 접근
// 결과: {"name":"John","age":25}
}
// 4. JsonProperty 어노테이션 사용
public class AnnotationExample {
@JsonProperty("userName")
private String name;
@JsonProperty("userAge")
private int age;
// getter 없어도 어노테이션으로 직렬화 가능
// 결과: {"userName":"John","userAge":25}
}