Jackson을 통한 직렬화&역직렬화
Java 객체를 JSON 문자열로 변환하거나 객체로 복원하는 것으로 Jackson에서는 ObjectMapper 클래스를 사용하여 객체를 직렬화한다.
사용예제는 아래 포스팅 참고..
[JAVA] VO를 JSON 데이터로 변환 (java class to json, vo to json)
먼저 아래 포스팅을 보고 필요한 라이브러리를 추가하자! [JAVA] JSON 데이터를 VO로 파싱, 변환하는 방법 (json to java class) 먼저 jackson-databind 라이브러리를 추가해주어야 한다! spring boot의 경우 'spring
ynzu-dev.tistory.com
직렬화 및 역직렬화 시 필드 접근 방식
- 필드가 public일 경우: 필드가 public이면 Jackson은 이 필드를 직접 접근하여 직렬화 및 역직렬화
- 필드가 private일 경우: 기본적으로 Jackson은 private 필드에 직접 접근하지 않으며, 대신 getter와 setter 메서드를 사용하여 값을 설정하거나 가져옴
public class Person {
private String name;
private int age;
// Getter와 Setter 사용
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Person 클래스에서 name과 age 필드는 private이지만, Jackson은 getter와 setter를 통해 직렬화 및 역직렬화를 처리
getter와 setter 메서드는 public으로 선언되어 있으므로 Jackson은 이를 통해 필드에 접근할 수 있음(getXxxx() 메소드는 'xxxx' 필드와 연결)
주로 private 필드로 설정하고 getter(setter)로 해당 필드에 접근하므로 위 방식으로 직렬화/역직렬화 하게 됨..!
@JsonProperty("name")
private String name;
@JsonProperty("age")
private int age;
@JsonProperty를 선언하면 getter와 setter가 없는 private 필드에 대해서도 직렬화가 가능!
@JsonProperty는 Jackson이 필드나 메서드에 접근할 수 있도록 명시적으로 표시하는 방법이다.
+) @JsonIgnore, @JsonInclude, @JsonFormat 등 다양한 어노테이션을 제공하니.. 상황에 맞게 찾아 쓰자
ObjectMapper.setVisibility
필드나 메서드의 접근성(visibility)을 설정하는 데 사용되는 메서드
이 메서드는 ObjectMapper 객체가 어떤 필드나 메서드를 직렬화하거나 역직렬화할 수 있는지 결정하는 데 중요한 역할을 한다.
기본적으로 Jackson은 getter, setter, public 필드에 접근하지만, 때로는 private 필드나 protected 필드와 같은 비공개 필드에 대해서도 직렬화 및 역직렬화를 허용해야할 때가 있는데, 이때 setVisibility를 사용하여 Jackson의 접근 제어 방식을 조정할 수 있다.
JsonAutoDetect.Visibility: 필드나 메서드가 직렬화 및 역직렬화의 대상이 될 수 있는지에 대한 규칙을 정의
- ANY: 모든 필드나 메서드를 직렬화 및 역직렬화 대상에 포함
- NON_PRIVATE: private이 아닌 필드나 메서드만 직렬화 및 역직렬화 대상에 포함합
- PROTECTED_AND_PUBLIC: protected와 public 필드 및 메서드만 직렬화 및 역직렬화 대상에 포함
- PUBLIC_ONLY: public 필드 및 메서드만 직렬화 및 역직렬화 대상에 포함
- NONE: 해당 필드나 메서드는 직렬화 또는 역직렬화 대상에서 제외
public class VisibilityExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(
objectMapper.getSerializationConfig().getDefaultVisibilityChecker()
.withFieldVisibility(JsonAutoDetect.Visibility.ANY) // 모든 필드에 대해 직렬화/역직렬화 허용
.withGetterVisibility(JsonAutoDetect.Visibility.NONE) // getter 메서드는 직렬화/역직렬화에서 제외
.withSetterVisibility(JsonAutoDetect.Visibility.NONE) // setter 메서드는 직렬화/역직렬화에서 제외
);
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); // 모든 필드에 대해 직렬화/역직렬화 허용
// 예시 객체
Person person = new Person("John", 30);
String json = objectMapper.writeValueAsString(person);
}
}
'개발 > JAVA' 카테고리의 다른 글
JAVA 14 - Record Class (0) | 2025.02.03 |
---|---|
[JAVA] 직렬화(Serialized), 역직렬화(Deserialization) (0) | 2025.02.03 |
[JAVA] 접근제한자가 private인 메소드를 호출하는 방법 (1) | 2022.10.13 |
[JAVA] 배치(bat), 쉘(sh) 실행하기 (1) | 2022.05.18 |
[JAVA] KeyStore에 Root 인증서 등록하기(SSLHandshakeException, PKIXException) (1) | 2022.05.18 |
댓글