본문 바로가기
개발/JAVA

[JAVA] Jackson 직렬화, 역직렬화

by zuzuu 2025. 2. 3.
반응형

Jackson을 통한 직렬화&역직렬화

Java 객체를 JSON 문자열로 변환하거나 객체로 복원하는 것으로 Jackson에서는 ObjectMapper 클래스를 사용하여 객체를 직렬화한다.

사용예제는 아래 포스팅 참고..

https://ynzu-dev.tistory.com/entry/JAVA-VO%EB%A5%BC-JSON-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A1%9C-%EB%B3%80%ED%99%98-java-class-to-json

 

[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);
        
    }
}

 

 

728x90
반응형

댓글