Jackson API는 JSON 데이터를 다루기 위한 다양한 메서드를 제공합니다. Jackson API를 활용하면 Java 객체를 JSON 문자열로 변환하거나, 반대로 JSON 문자열에서 객체를 복원할 수 있습니다.
만약 기본 직렬화 방식이 아닌 나만의 규칙으로 객체를 JSON으로 변환하고 싶다면 사용자 정의 직렬화기(Custom Serializer)를 구현해야 합니다. 이때 StdSerializer 클래스를 상속받고, serialize(T value, JsonGenerator gen, SerializerProvider provider) 메서드를 오버라이드(재정의)하면 됩니다.
serialize 메서드의 각 매개변수는 다음과 같은 역할을 합니다.
- value: 직렬화할 대상 값입니다. (null일 수 없습니다)
- gen: 결과 JSON 콘텐츠를 출력하는 데 사용되는 제너레이터(JsonGenerator)입니다.
- provider: 객체 값을 직렬화할 때 필요한 직렬화기를 얻을 수 있게 해주는 프로바이더(SerializerProvider)입니다.
문법(Syntax)
public abstract void serialize(T value, JsonGenerator gen, SerializerProvider provider) throws IOException
예제 코드
아래 예제에서는 User 클래스를 대상으로 사용자 정의 직렬화기를 만들어 적용하는 과정을 보여줍니다. SimpleModule에 직렬화기를 등록한 후 ObjectMapper에 모듈을 추가하면, 해당 타입의 객체가 직렬화될 때 자동으로 커스텀 로직이 적용됩니다.
import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.*;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class JacksonSerializeTest {
public static void main(String[] args) throws Exception {
JacksonSerializeTest test = new JacksonSerializeTest();
test.serialize();
}
public void serialize() throws Exception {
User user = new User();
user.setFirstName("Raja");
user.setLastName("Ramesh");
ObjectMapper mapper = new ObjectMapper();
// SimpleModule 생성 후 커스텀 직렬화기 등록
SimpleModule module = new SimpleModule();
module.addSerializer(User.class, new UserSerializer());
mapper.registerModule(module);
// pretty print 형식으로 JSON 문자열 출력
String jsonStr = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
System.out.println(jsonStr);
}
}
// User 클래스
class User implements Serializable {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
// UserSerializer 클래스 - StdSerializer 상속
class UserSerializer extends StdSerializer<User> {
public UserSerializer() {
this(null);
}
public UserSerializer(Class<User> t) {
super(t);
}
@Override
public void serialize(User value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeStringField("firstName", value.getFirstName());
jgen.writeStringField("lastName", value.getLastName());
jgen.writeEndObject();
}
}실행 결과(Output)
{
"firstName" : "Raja",
"lastName" : "Ramesh"
}핵심 정리
사용자 정의 직렬화기를 구현하는 절차를 요약하면 다음과 같습니다.
- StdSerializer<T>를 상속받는 새로운 직렬화기 클래스를 작성합니다.
- serialize() 메서드를 오버라이드하여 원하는 JSON 출력 형식을 직접 정의합니다.
- SimpleModule을 생성하고 addSerializer()로 커스텀 직렬화기를 특정 클래스에 매핑합니다.
- ObjectMapper에 해당 모듈을 registerModule()로 등록합니다.
이 방식을 활용하면 날짜 포맷 변환, 필드 이름 변경, 조건부 필드 출력 등 기본 설정으로는 처리하기 어려운 다양한 직렬화 요구 사항을 유연하게 해결할 수 있습니다.