JAVA

[JAVA] Jackson 어노테이션 활용법

인생아 2024. 11. 10. 23:56
반응형

[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 커스터마이징이 이루어졌습니다.

참고 사이트

반응형