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의 상호작용 시 주의사항
- ObjectMapper의 인스턴스 관리: ObjectMapper는 매우 비싼 리소스이므로, 매번 생성하지 않고 @Bean으로 관리해주는 것이 좋습니다.
- Lazy Initialization 사용: 대용량 JSON 처리 시, 성능 최적화를 위해 필요할 때만 Jackson을 초기화하는 것이 좋습니다.
- 필요한 모듈 추가: 특정 기능을 원할 경우(예: Java 8 날짜 지원) 필요한 모듈을 build.gradle이나 pom.xml에 추가하세요.
참고 사이트
- Spring Boot 공식 문서: https://spring.io/projects/spring-boot
- Jackson 공식 문서: https://github.com/FasterXML/jackson
'JAVA' 카테고리의 다른 글
[JAVA] Jackson 자주 발생하는 오류와 해결 방법 (1) | 2024.11.15 |
---|---|
[JAVA] Jackson을 활용한 XML 데이터 처리 (0) | 2024.11.14 |
[JAVA] Jackson의 성능 최적화 전략 (0) | 2024.11.13 |
[JAVA] Jackson 커스텀 모듈 사용하기 (0) | 2024.11.12 |
[JAVA] Jackson과 Java 8 이상 기능 연동 (2) | 2024.11.12 |
[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 |