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 |