Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 Jackson 라이브러리로 JSON 필드 무시하는 방법 – @JsonIgnore 어노테이션 활용법

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 응답 최적화 등 다양한 요구사항을 효과적으로 처리할 수 있습니다.