Java 개발을 하다 보면 객체의 특정 필드를 JSON 직렬화나 역직렬화 과정에서 제외해야 하는 경우가 자주 발생합니다. 이럴 때 Jackson 라이브러리가 제공하는 @JsonIgnore 어노테이션을 사용하면 간단하게 해결할 수 있습니다.
@JsonIgnore는 Java 객체의 특정 프로퍼티(property) 또는 필드(field)를 무시하도록 지정하는 어노테이션입니다. 이 어노테이션이 적용된 필드는 두 방향 모두에서 제외됩니다. 즉, JSON을 Java 객체로 읽어올 때(역직렬화)와 Java 객체를 JSON으로 변환할 때(직렬화) 모두 해당 필드가 처리되지 않습니다.
JSON 문자열을 Java 객체로 변환하거나 그 반대 작업을 수행하려면 ObjectMapper 클래스의 readValue() 메서드와 writeValueAsString() 메서드를 활용하면 됩니다.
@JsonIgnore 어노테이션 문법
@Target(value={ANNOTATION_TYPE,METHOD,CONSTRUCTOR,FIELD})
@Retention(value=RUNTIME)
public @interface JsonIgnore사용 예제
아래 예제는 Customer 클래스의 address 필드에 @JsonIgnore를 적용하여, 직렬화 및 역직렬화 시 해당 필드가 어떻게 처리되는지 보여줍니다.
import java.io.*;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
public class JsonIgnoreTest {
public static void main(String[] args) throws IOException {
Customer customer = new Customer("110", "Surya Kiran", "Chennai");
System.out.println(customer);
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(customer);
System.out.println("JSON: " + jsonString);
System.out.println("---------");
jsonString = "{\"id\":\"120\",\"name\":\"Devaraj\", \"address\":\"Banglore\"}";
System.out.println("JSON: " + jsonString);
customer = mapper.readValue(jsonString, Customer.class);
System.out.println(customer);
}
}
// Customer 클래스
class Customer {
private String id;
private String name;
@JsonIgnore
private String address;
public Customer() {
}
public Customer(String id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", address=" + address + "]";
}
}실행 결과
Customer [id=110, name=Surya Kiran, address=Chennai]
JSON: {"id":"110","name":"Surya Kiran"}
---------
JSON: {"id":"120","name":"Devaraj", "address":"Banglore"}
Customer [id=120, name=Devaraj, address=null]결과 분석
위 실행 결과에서 확인할 수 있는 핵심 동작은 다음과 같습니다.
1. 직렬화(Java → JSON): Customer 객체에는 address 값으로 "Chennai"가 저장되어 있지만, 출력된 JSON 문자열에는 id와 name만 포함되고 address 필드는 제외된 것을 볼 수 있습니다.
2. 역직렬화(JSON → Java): 입력 JSON에 address 값인 "Banglore"가 포함되어 있음에도 불구하고, 생성된 Customer 객체의 address 필드는 null로 설정됩니다. @JsonIgnore가 적용된 필드는 역직렬화 과정에서도 무시되기 때문입니다.
참고 사항
@JsonIgnore 외에도 Jackson은 더 세밀한 제어를 위한 어노테이션들을 제공합니다. 직렬화만 무시하고 싶다면 @JsonProperty(access = Access.WRITE_ONLY)를, 역직렬화만 무시하고 싶다면 @JsonIgnoreProperties 또는 @JsonProperty(access = Access.READ_ONLY)를 사용할 수 있습니다. 상황에 맞는 어노테이션을 선택하면 민감한 정보 노출 방지나 API 응답 최적화 등 다양한 요구사항을 효과적으로 처리할 수 있습니다.