Jackson은 Java에서 가장 널리 사용되는 JSON 처리 라이브러리 중 하나이다. Java 객체를 JSON 문자열로 변환(Serialization)하거나 JSON 문자열을 Java 객체로 변환하는 등의 작업을 손쉽게 할 수 있게 도와준다.
직렬화(Serialization)는 Java 객체를 JSON 문자열로 변환하는 과정이다. 이 과정에서 get 메서드가 필요하다. 이유는 Java 객체의 필드 값들을 읽어오기 위해서다. get 메서드는 해당 객체의 특정 필드 값을 가져오는 역할을 하며, 이를 통해 JSON 문자열을 만드는 데 필요한 데이터를 얻을 수 있다. 예를 들어, SeonUng 클래스에 getName이라는 get 메서드가 있다면, 직렬화 과정에서 getName 메서드를 호출하여 name 필드의 값을 가져오고, 이를 JSON 문자열에 포함시킨다.
역직렬화(Deserialization)는 JSON 문자열을 Java 객체로 변환하는 과정이다. 이 과정에서 set 메서드가 필요하다. 이유는 JSON 문자열에서 읽어온 데이터를 Java 객체의 필드에 설정하기 위해서다. set 메서드는 해당 객체의 특정 필드 값을 설정하는 역할을 하며, 이를 통해 JSON 문자열에서 가져온 데이터를 Java 객체에 저장할 수 있다. 예를 들어, SeonUng 클래스에 setName이라는 set 메서드가 있다면, 역직렬화 과정에서 JSON 문자열에서 name 값을 가져온 후, setName 메서드를 호출하여 name 필드에 값을 설정한다.
대부분의 라이브러리에서는 set 메서드를 이용해 Java 객체의 필드에 값을 설정하기 때문에 set 메서드가 중요하게 작용한다. 하지만 모든 경우에 set 메서드가 필요한 것은 아니다. 예를 들어, get 메서드만 있는 불변 객체(Immutable Object)도 역직렬화가 가능하다. 이러한 경우 생성자를 통해 필드 값을 설정하게 된다.
Jackson에서는 @JsonProperty 어노테이션을 생성자의 파라미터에 붙여서 이를 가능하게 한다. 이 어노테이션을 사용하면 Jackson은 해당 이름의 JSON 속성 값을 파라미터로 전달하게 되고, 이를 통해 객체를 생성할 수 있다. 이러한 방식은 객체가 불변성을 유지해야 하는 경우에 유용하다.
public class World {
private final String nation;
private final int numberOfNation;
@JsonCreator
public Person(@JsonProperty("nation") String nation, @JsonProperty("numberOfNation") int numberOfNation) {
this.nation = nation;
this.numberOfNation = numberOfNation;
}
public String getNation() {
return nation;
}
public int getNumberOfNation() {
return numberOfNation;
}
}