Gson 라이브러리는 Java 객체를 JSON으로 변환할 때 기본 동작만으로는 부족한 경우, GsonBuilder에 사용자 정의 직렬화기(custom serializer)를 등록하여 원하는 방식으로 변환할 수 있도록 지원합니다. 사용자 정의 직렬화기는 com.google.gson.JsonSerializer 인터페이스의 serialize() 메서드를 오버라이드(재정의)하여 손쉽게 만들 수 있습니다.
예를 들어 비밀번호처럼 특별한 처리 규칙이 필요한 필드가 있거나, 객체를 특정 포맷의 문자열로 출력해야 하는 경우에 유용합니다. 아래 예제에서는 Password 객체를 JSON으로 직렬화할 때 별도의 직렬화기를 적용하는 방법을 보여줍니다.
예제 코드
import java.lang.reflect.Type;
import com.google.gson.*;
public class CustomJSONSerializerTest {
public static void main(String[] args) {
Gson gson = new GsonBuilder().registerTypeAdapter(Password.class, new PasswordSerializer())
.setPrettyPrinting().create();
Student student = new Student("Adithya", "Jai", 25, "Chennai");
student.setPassword(new Password("admin@123"));
System.out.println(gson.toJson(student));
}
}
class PasswordSerializer implements JsonSerializer {
@Override
public JsonElement serialize(Password src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(new StringBuffer(src.getPassword()).toString());
}
}
// Student 클래스
class Student {
private String firstName;
private String lastName;
private int age;
private String address;
private Password password;
public Student(String firstName, String lastName, int age, String address) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.address = address;
}
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Password getPassword() {
return password;
}
public void setPassword(Password password) {
this.password = password;
}
public String toString() {
return "Student[ " +
"firstName = " + firstName +
", lastName = " + lastName +
", age = " + age +
", address = " + address +
" ]";
}
}
// Password 클래스
class Password {
private String password;
public Password(String password) {
super();
this.password = password;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}코드 설명
PasswordSerializer 클래스는 JsonSerializer 인터페이스를 구현하며, serialize() 메서드 안에서 Password 객체를 어떤 JSON 요소로 변환할지 결정합니다. 그런 다음 GsonBuilder의 registerTypeAdapter() 메서드를 사용해 Password 타입과 직렬화기를 연결하면, 해당 타입이 직렬화될 때마다 등록된 로직이 자동으로 적용됩니다. 또한 setPrettyPrinting()을 호출하여 들여쓰기가 적용된 가독성 좋은 JSON을 출력하고 있습니다.
실행 결과
{
"firstName": "Adithya",
"lastName": "Jai",
"age": 25,
"address": "Chennai",
"password": "admin@123"
}실행 결과를 보면 Student 객체의 모든 필드가 JSON으로 변환되었고, password 필드는 등록한 PasswordSerializer를 통해 처리되어 정상적으로 출력된 것을 확인할 수 있습니다. 이처럼 Gson의 사용자 정의 직렬화기를 활용하면 날짜 포맷 변환, 민감 정보 마스킹, 특정 데이터 구조 변환 등 다양한 요구 사항을 유연하게 대응할 수 있습니다.