JVM

[JVM] Jackson의 ObjectMapper: 객체 생성 방식과 필드 바인딩

kyoulho 2024. 8. 10. 22:57

Jackson과 ObjectMapper

  • Jackson은 Java에서 가장 널리 사용되는 JSON 처리 라이브러리 중 하나이다.
  • ObjectMapper는 Jackson 라이브러리의 핵심 클래스 중 하나로, JSON 데이터를 Java 객체로 변환하거나 Java 객체를 JSON으로 직렬화할 때 사용된다.

 

ObjectMapper의 객체 생성 방식

1. 기본 생성자의 필요성

  • ObjectMapper는 JSON 데이터를 Java 객체로 변환할 때 기본 생성자를 사용하여 객체를 생성한다.
  • 기본 생성자가 없으면 ObjectMapper는 객체를 생성할 수 없으므로, 기본 생성자를 추가해야 한다.

2. 매개변수가 있는 생성자 사용

  • 매개변수가 있는 생성자를 사용해 객체를 생성하고자 할 때는 @JsonCreator를 사용해 ObjectMapper가 해당 생성자를 사용할 수 있도록 지정할 수 있다.
  • 이 방법은 필드의 불변성을 유지하면서 객체를 생성할 수 있는 좋은 방법이다.

 

필드 바인딩 방식

1. Setter를 통한 바인딩

  • 기본적으로 ObjectMapper는 JSON 데이터를 객체의 필드에 바인딩할 때 Setter 메서드를 사용한다.
  • Setter 메서드를 통해 값을 설정함으로써 객체의 상태를 관리할 수 있다.

2. 리플렉션을 통한 필드 바인딩

  • 객체에 Setter 메서드가 없더라도, ObjectMapper는 리플렉션을 사용해 필드에 직접 접근할 수 있다.

 

@JsonProperty로 바인딩 제어

@JsonProperty의 역할

  • @JsonProperty 애노테이션은 객체의 필드를 JSON 속성과 연결할 때 필드 이름이나 접근 방식을 명시적으로 지정할 수 있는 기능을 제공한다.
  • 이 애노테이션을 사용하면 필드 이름과 JSON 속성 이름이 다를 때에도 매핑이 가능하다.

기본 사용:

@JsonProperty("user_id")를 사용하여 id 필드가 JSON의 "user_id" 속성과 매핑되도록 한다. 이를 통해 JSON 데이터가 "user_id" 속성을 포함하고 있을 때, 해당 값이 id 필드에 바인딩된다.

public class User {
    @JsonProperty("user_id")
    private String id;
    private String name;

    // Constructors, Getters, and Setters
}

JSON 직렬화/역직렬화 제어

  • READ_ONLY: 필드는 JSON 직렬화(쓰기) 시에는 포함되지 않지만, JSON 역직렬화(읽기) 시에는 사용된다.
  • WRITE_ONLY: 필드는 JSON 직렬화 시에는 포함되지만, JSON 역직렬화 시에는 무시된다.
  • 이 설정을 통해 민감한 데이터(예: 비밀번호)를 처리할 때 데이터 보안을 강화할 수 있다.
public class User {
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private String id;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;

    // Constructors, Getters, and Setters
}

커스터마이징 가능한 필드 접근자

getFormattedPrice 메서드는 formattedPrice로 직렬화되며, JSON에서 price 속성을 읽을 때만 값이 설정된다. 이를 통해 JSON 바인딩 시 더 많은 유연성을 제공할 수 있다.

public class Product {
    private double price;

    @JsonProperty("formattedPrice")
    public String getFormattedPrice() {
        return String.format("$%.2f", price);
    }

    @JsonProperty("price")
    public void setPrice(double price) {
        this.price = price;
    }
}

 

728x90

'JVM' 카테고리의 다른 글

[JVM] JDBC 쿼리 및 메서드 실행 로깅  (0) 2024.08.17
[JVM] MockServer  (0) 2024.07.29
BDDMockito  (0) 2024.07.28
JUnit  (0) 2024.07.28
테스트 커버리지와 JaCoCo  (0) 2024.07.27