[Jackson] 어노테이션 활용법을 알아보겠습니다. Jackson 라이브러리는 JSON 데이터를 다루는 데 매우 유용하며, ObjectMapper를 통해 다양한 방식으로 JSON과 Java 객체 간의 변환을 지원합니다. 특히, Jackson 어노테이션을 사용하면 JSON 데이터를 커스터마이징할 수 있어 복잡한 JSON 구조를 쉽게 다룰 수 있습니다. 이번 글에서는 자주 사용하는 @JsonProperty, @JsonIgnore, @JsonInclude 어노테이션에 대해 설명하고 각 어노테이션의 특징을 활용한 예제를 소개하겠습니다.
주요 Jackson 어노테이션 소개
Jackson에서 제공하는 어노테이션은 JSON 필드와 Java 필드를 유연하게 매핑할 수 있도록 해줍니다. 이를 통해 특정 필드를 제외하거나 이름을 변경하고, null 값을 처리하는 등 다양한 기능을 구현할 수 있습니다. 다음은 대표적인 Jackson 어노테이션입니다.
- @JsonProperty: JSON 필드명과 Java 필드명을 매핑하여 커스텀 필드명 설정이 가능합니다.
- @JsonIgnore: JSON 변환 시 특정 필드를 제외할 때 사용합니다.
- @JsonInclude: null 값을 포함하거나 제외하는 등 필터링 규칙을 설정할 수 있습니다.
@JsonProperty를 활용한 커스텀 필드명 매핑
@JsonProperty 어노테이션은 JSON 필드명을 Java 필드와 다르게 설정하고 싶을 때 유용하게 사용됩니다. 예를 들어, JSON 데이터에서 "name" 필드를 Java 클래스의 "userName" 필드와 매핑하고 싶다면 @JsonProperty 어노테이션을 활용할 수 있습니다.
예제 코드: @JsonProperty를 활용한 커스텀 필드명 매핑
아래는 JSON의 "이름" 필드를 Java의 "name" 필드와 매핑하는 예제입니다.
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
class Person {
@JsonProperty("이름")
private String name;
private int age;
private String city;
// 기본 생성자와 Getter, Setter 추가
public Person() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
public class Main {
public static void main(String[] args) {
String jsonString = "{\"이름\":\"홍길동\", \"age\":30, \"city\":\"서울\"}";
ObjectMapper objectMapper = new ObjectMapper();
try {
Person person = objectMapper.readValue(jsonString, Person.class);
System.out.println("이름: " + person.getName());
System.out.println("나이: " + person.getAge());
System.out.println("도시: " + person.getCity());
} catch (Exception e) {
e.printStackTrace();
}
}
}
이 예제에서는 JSON의 이름 필드를 Java의 name 필드로 매핑하여 데이터에 접근할 수 있습니다. 이처럼 @JsonProperty를 사용하면 JSON 구조와 Java 객체의 필드명이 다를 경우 매핑을 유연하게 변경할 수 있습니다.
@JsonIgnore를 통한 필드 제외
@JsonIgnore 어노테이션은 JSON 변환 과정에서 특정 필드를 무시하고 싶을 때 사용합니다. 예를 들어, 민감한 정보가 담긴 필드나 JSON에 포함되지 않아야 하는 필드를 제외할 때 유용합니다.
예제 코드: @JsonIgnore를 통한 필드 제외
아래는 password 필드를 JSON 변환 시 제외하는 예제입니다.
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
class User {
private String name;
private int age;
@JsonIgnore
private String password;
private String city;
// 기본 생성자와 Getter, Setter 추가
public User() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
public class Main {
public static void main(String[] args) {
User user = new User();
user.setName("이순신");
user.setAge(45);
user.setPassword("mySecretPassword");
user.setCity("부산");
ObjectMapper objectMapper = new ObjectMapper();
try {
String jsonString = objectMapper.writeValueAsString(user);
System.out.println("JSON 출력: " + jsonString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
이 예제에서 password 필드는 @JsonIgnore 어노테이션으로 인해 JSON 출력에 포함되지 않습니다. 이처럼 특정 필드를 JSON 변환 시 제외할 수 있습니다.
@JsonInclude를 통한 null 값 관리 및 필터링
@JsonInclude 어노테이션은 null 값 처리와 관련된 설정을 제공합니다. 기본적으로 null 값을 JSON에 포함할 수도 있고, null 값이 있는 필드를 제외할 수도 있습니다.
예제 코드: @JsonInclude를 통한 null 값 필터링
아래 예제에서는 null 값을 포함하지 않는 JSON 출력을 생성합니다.
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
@JsonInclude(JsonInclude.Include.NON_NULL)
class Product {
private String name;
private Double price;
private String description;
// 기본 생성자와 Getter, Setter 추가
public Product() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
public class Main {
public static void main(String[] args) {
Product product = new Product();
product.setName("노트북");
product.setPrice(1500.0);
// description 필드는 null 상태
ObjectMapper objectMapper = new ObjectMapper();
try {
String jsonString = objectMapper.writeValueAsString(product);
System.out.println("JSON 출력: " + jsonString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@JsonInclude(JsonInclude.Include.NON_NULL) 설정으로 인해 null 상태인 description 필드는 JSON 출력에 포함되지 않습니다. 이는 JSON 데이터의 크기를 줄일 수 있어 API 응답을 최적화하는 데 유용합니다.
다양한 Jackson 어노테이션을 활용한 데이터 커스터마이징
Jackson 어노테이션을 조합하여 더욱 복잡한 데이터 커스터마이징을 할 수 있습니다. 다음은 여러 어노테이션을 함께 사용해 데이터를 커스터마이징하는 예제입니다.
다양한 Jackson 어노테이션을 활용한 데이터 커스터마이징
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
@JsonInclude(JsonInclude.Include.NON_NULL)
class Employee {
@JsonProperty("직원명")
private String name;
private int age;
@JsonIgnore
private String socialSecurityNumber;
private String department;
// 기본 생성자와 Getter, Setter 추가
public Employee() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSocialSecurityNumber() {
return socialSecurityNumber;
}
public void setSocialSecurityNumber(String socialSecurityNumber) {
this.socialSecurityNumber = socialSecurityNumber;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
public class Main {
public static void main(String[] args) {
Employee employee = new Employee();
employee.setName("김영희");
employee.setAge(35);
employee.setSocialSecurityNumber("123-45-6789");
employee.setDepartment(null);
ObjectMapper objectMapper = new ObjectMapper();
try {
String jsonString = objectMapper.writeValueAsString(employee);
System.out.println("JSON 출력: " + jsonString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
위 예제에서는 @JsonProperty, @JsonIgnore, @JsonInclude 어노테이션을 결합하여 직원명 필드명 변경, 사회보장번호 필드 제외, 부서 필드의 null 값 미포함 등 다양한 JSON 커스터마이징이 이루어졌습니다.
참고 사이트
'JAVA' 카테고리의 다른 글
[JAVA] Jackson의 Data Binding API와 Tree Model API 차이점 (0) | 2024.11.12 |
---|---|
[JAVA] Jackson Tree Model API 활용하기 (1) | 2024.11.12 |
[JAVA] Jackson 컬렉션 및 배열 데이터 처리 (1) | 2024.11.12 |
[JAVA] Jackson 고급 직렬화와 역직렬화 설정 (0) | 2024.11.11 |
[JAVA] Jackson ObjectMapper란? (1) | 2024.11.09 |
[JAVA] Jackson 환경 설정 (1) | 2024.11.08 |
[JAVA] Jackson 이란? (0) | 2024.11.07 |
[JAVA] Map과 JSON 데이터 변환 (0) | 2024.11.06 |