본문 바로가기

Study Information Technology

Spring Boot에서 JSON 직렬화 이해하기

728x90
반응형

Spring Boot에서 JSON 직렬화 이해하기

Overview

Spring Boot에서 JSON 직렬화는 애플리케이션이 Java 객체를 JSON 형식으로 변환하는 과정입니다. 이 과정은 웹 API를 구축할 때 클라이언트와 서버 간의 데이터 교환에 매우 중요합니다. JSON(JavaScript Object Notation)은 경량의 데이터 교환 형식으로, 사람이 읽기 쉽고 기계가 구문 분석하고 생성하기 쉬운 구조를 가지고 있습니다.

Spring Boot는 Jackson 라이브러리를 사용하여 JSON 직렬화를 처리합니다. Jackson은 JSON을 Java 객체로 변환하거나 그 반대의 작업을 수행하는 데 필요한 많은 기능을 제공합니다. 이 글에서는 Spring Boot에서 JSON 직렬화의 원리, 설정 방법, 그리고 실제 사용 예제에 대해 상세히 설명하겠습니다.

JSON 직렬화란 무엇인가?

JSON 직렬화는 Java 객체를 JSON 형식으로 변환하는 과정입니다. 직렬화는 데이터의 구조와 내용을 JSON으로 변환하여 데이터 교환을 가능하게 합니다. 반대로, JSON 역직렬화는 JSON 형식의 데이터를 Java 객체로 변환하는 과정입니다. 이 두 과정은 API에서 데이터를 송수신할 때 필수적입니다.

JSON 직렬화의 필요성

  • 데이터 교환: JSON 직렬화는 서버와 클라이언트 간의 데이터 교환을 용이하게 합니다.
  • 프론트엔드와 백엔드의 호환성: 다양한 클라이언트 애플리케이션이 동일한 형식의 데이터를 쉽게 처리할 수 있습니다.
  • 인간 가독성: JSON은 간결하고 읽기 쉬운 데이터 형식을 제공하여 디버깅과 데이터 분석이 용이합니다.

Spring Boot에서 JSON 직렬화 설정하기

Spring Boot는 기본적으로 Jackson 라이브러리를 통해 JSON 직렬화를 지원합니다. Jackson은 ObjectMapper라는 클래스를 제공하여 Java 객체와 JSON 간의 변환을 처리합니다. Spring Boot는 spring-boot-starter-web 의존성을 통해 Jackson을 자동으로 포함시킵니다.

1. Spring Boot 프로젝트에 Jackson 의존성 추가

Spring Boot에서 Jackson을 사용하기 위해 별도로 의존성을 추가할 필요는 없지만, 필요한 경우 build.gradle 또는 pom.xml에 아래와 같이 명시할 수 있습니다.

Gradle

dependencies {
implementation 'com.fasterxml.jackson.core:jackson-databind'
}

Maven

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
</dependency>

2. 기본 설정

Spring Boot는 기본적으로 ObjectMapper를 설정하여 JSON 직렬화를 처리합니다. @RestController 또는 @Controller로 정의된 클래스에서 반환하는 객체는 자동으로 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")
public class SampleController {

@GetMapping("/user")
public User getUser() {
return new User("John", "Doe", 30);
}
}

User 클래스

public class User {
private String firstName;
private String lastName;
private int age;

// Constructor, getters, and setters
public User(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

위의 예제에서 User 객체는 JSON 형식으로 변환되어 클라이언트에게 응답됩니다.

3. 커스터마이징 직렬화

Jackson의 ObjectMapper를 커스터마이징하여 직렬화 방식이나 JSON 형식의 설정을 조정할 수 있습니다.

예제: 날짜 형식 설정

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

@Configuration
public class JacksonConfig {

@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
return mapper;
}
}

이 설정을 통해 날짜는 yyyy-MM-dd 형식으로 직렬화됩니다.

4. 직렬화 및 역직렬화 예제

직렬화 예제

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class SerializationExample {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
User user = new User("Jane", "Doe", 25);

try {
String json = mapper.writeValueAsString(user);
System.out.println("Serialized JSON: " + json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}

역직렬화 예제

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class DeserializationExample {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
String json = "{\"firstName\":\"Jane\",\"lastName\":\"Doe\",\"age\":25}";

try {
User user = mapper.readValue(json, User.class);
System.out.println("Deserialized User: " + user.getFirstName() + " " + user.getLastName() + ", Age: " + user.getAge());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}

에러 및 해결 방법

JSON 직렬화 에러

  • JsonProcessingException: JSON 처리 중 에러 발생. 예를 들어, 잘못된 JSON 구조나 직렬화할 수 없는 객체가 있을 때 발생합니다.

해결 방법

  1. 객체의 모든 필드에 대해 Getter/Setter 제공: Jackson은 기본적으로 필드에 접근할 수 있어야 합니다.
  2. 필드에 대해 @JsonIgnore 사용: 직렬화에서 제외할 필드가 있을 경우 @JsonIgnore를 사용합니다.

예제 에러 메시지

  • 에러 메시지: "Can not construct instance of 'User' (no Creators, like default constructor, exist): Cannot deserialize instance of User out of START_ARRAY token"

원인

  • 원인: JSON 구조가 User 클래스와 맞지 않음. 예를 들어, JSON 배열을 User 객체로 변환하려는 경우 발생합니다.

해결 방법

  • JSON 형식과 클래스의 필드가 일치하는지 확인합니다.

참고문서

위의 내용으로 Spring Boot에서 JSON 직렬화의 기본적인 이해와 설정 방법에 대해 자세히 설명했습니다. JSON 직렬화는 현대 웹 애플리케이션에서 데이터를 교환하는 데 중요한 역할을 하며, Spring Boot와 Jackson을 통해 이를 간편하게 처리할 수 있습니다.

728x90
반응형