JAVA

[JAVA] Jackson과 Spring Boot 통합

인생아 2024. 11. 15. 16:24
반응형

Spring Boot와 Jackson을 함께 사용하면 JSON 데이터를 쉽게 직렬화하고 역직렬화할 수 있어 RESTful 웹 서비스 구축에 매우 유용합니다. Spring Boot는 기본적으로 Jackson을 사용하여 JSON 데이터를 처리하며, @RestController와 결합하여 JSON 데이터를 자동으로 변환해줍니다.

Spring Boot에서 Jackson 설정 및 활용법

Spring Boot는 내장된 Jackson 라이브러리를 통해 JSON 데이터를 자동으로 직렬화 및 역직렬화합니다. @RestController에서 객체를 반환하면 Spring Boot가 이를 JSON 형식으로 변환해 클라이언트에 응답합니다. 예를 들어, 사용자 정보를 반환하는 API를 다음과 같이 구현할 수 있습니다.

예제: JSON 데이터 자동 변환

먼저, UserController를 작성하여 사용자 정보를 JSON으로 반환해봅시다.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/user")
public class UserController {

    @GetMapping
    public User getUser() {
        User user = new User("김철수", "서울", 30);
        return user;
    }
}

class User {
    private String name;
    private String city;
    private int age;

    public User(String name, String city, int age) {
        this.name = name;
        this.city = city;
        this.age = age;
    }

    // Getters and Setters
}

위의 코드에서 UserController는 /api/user 경로로 들어오는 GET 요청을 처리하며, User 객체를 반환합니다. Spring Boot는 이 User 객체를 자동으로 JSON 형식으로 변환하여 클라이언트에 전달합니다. 예를 들어, 클라이언트에서 /api/user 엔드포인트에 요청을 보내면 다음과 같은 JSON 데이터를 받게 됩니다:

{
    "name": "김철수",
    "city": "서울",
    "age": 30
}

Spring Boot에서의 기본 Jackson 설정 커스터마이징

Spring Boot는 기본적으로 Jackson 설정을 제공하지만, 필요에 따라 커스터마이징이 가능합니다. 예를 들어, JSON 필드의 네이밍 전략을 변경하거나 날짜 형식을 지정하는 등 다양한 옵션을 설정할 수 있습니다. 이러한 Jackson 설정은 application.properties 또는 Jackson 설정 클래스를 통해 변경할 수 있습니다.

application.properties를 통한 설정

application.properties 파일에 Jackson의 네이밍 전략을 설정할 수 있습니다. 기본적으로 Camel Case를 사용하지만, 이를 Snake Case로 변경할 수 있습니다.

spring.jackson.property-naming-strategy=SNAKE_CASE

위와 같이 설정하면 User 객체의 필드명이 name, city, age에서 name, city, age가 아닌 name, city, age로 변환됩니다. 클라이언트에서 요청 시 Snake Case 형식의 JSON 데이터로 받을 수 있습니다.

Jackson 설정 클래스를 통한 커스터마이징

커스터마이징이 더 필요한 경우 Jackson 설정 클래스를 만들어 Spring 컨텍스트에 등록할 수 있습니다. 예를 들어, 날짜 형식을 ISO 8601 형식으로 설정하거나, 특정 직렬화 기능을 추가할 수 있습니다.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        return objectMapper;
    }
}

위 설정에서는 WRITE_DATES_AS_TIMESTAMPS를 false로 설정하여 날짜를 타임스탬프 대신 ISO 8601 형식으로 직렬화하도록 합니다.

예제: 커스텀 JSON 응답 생성

이제 JacksonConfig 설정에 따라 날짜 형식이 적용되는 예제를 살펴보겠습니다. OrderController를 만들어 Order 객체를 반환합니다.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;

@RestController
@RequestMapping("/api/order")
public class OrderController {

    @GetMapping
    public Order getOrder() {
        Order order = new Order("12345", LocalDate.now(), "김영희");
        return order;
    }
}

class Order {
    private String orderId;
    private LocalDate orderDate;
    private String customerName;

    public Order(String orderId, LocalDate orderDate, String customerName) {
        this.orderId = orderId;
        this.orderDate = orderDate;
        this.customerName = customerName;
    }

    // Getters and Setters
}

이 경우, orderDate는 Jackson 설정에 따라 ISO 8601 형식으로 직렬화됩니다.

반응형

@RestController와 Jackson의 상호작용 (JSON 데이터 자동 변환)

@RestController는 Jackson과 통합되어 JSON 데이터로 자동 변환을 지원합니다. Spring Boot는 @RestController를 사용하여 컨트롤러 메서드의 반환 값을 JSON으로 변환하고, 클라이언트가 요청한 형식에 따라 응답을 제공합니다. 이로 인해 JSON 데이터를 직접 다룰 필요 없이, 객체를 반환하기만 하면 됩니다.

예제: @ResponseBody와의 차이점

기본적으로 @RestController는 모든 메서드에 @ResponseBody가 적용된 것과 같습니다. @Controller와 @ResponseBody를 결합하여 사용할 수도 있지만, @RestController는 이를 더 간결하게 만들어줍니다.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/product")
public class ProductController {

    @GetMapping
    public Product getProduct() {
        return new Product("노트북", "삼성", 1500000);
    }
}

class Product {
    private String productName;
    private String brand;
    private int price;

    public Product(String productName, String brand, int price) {
        this.productName = productName;
        this.brand = brand;
        this.price = price;
    }

    // Getters and Setters
}

이 예제에서 /api/product 엔드포인트는 Product 객체를 JSON으로 변환해 반환합니다. 클라이언트는 다음과 같은 JSON 데이터를 받게 됩니다.

{
    "productName": "노트북",
    "brand": "삼성",
    "price": 1500000
}

Jackson과 Spring Boot의 상호작용 시 주의사항

  1. ObjectMapper의 인스턴스 관리: ObjectMapper는 매우 비싼 리소스이므로, 매번 생성하지 않고 @Bean으로 관리해주는 것이 좋습니다.
  2. Lazy Initialization 사용: 대용량 JSON 처리 시, 성능 최적화를 위해 필요할 때만 Jackson을 초기화하는 것이 좋습니다.
  3. 필요한 모듈 추가: 특정 기능을 원할 경우(예: Java 8 날짜 지원) 필요한 모듈을 build.gradle이나 pom.xml에 추가하세요.

참고 사이트

반응형