본문 바로가기
Spring

[Spring; 스프링] 직렬화와 역직렬화: Jackson ObjectMapper와 스프링부트에서의 활용

by daddydontsleep 2024. 9. 23.
728x90
728x90

사진: Unsplash 의 Minh

직렬화와 역직렬화는 데이터 저장 및 전송 시 자주 사용되는 개념입니다. 특히 Java와 같은 언어에서 객체를 효율적으로 다루기 위해 필수적인 기술입니다. 이 글에서는 직렬화와 역직렬화의 기본 개념을 소개하고, ObjectMapper를 활용한 JSON 데이터 변환 예제를 통해 어떻게 활용할 수 있는지 알아보겠습니다. 더 나아가, 스프링부트(Spring Boot) 환경에서 이를 어떻게 활용할 수 있는지 살펴보겠습니다.

1. 직렬화(Serialization)와 역직렬화(Deserialization)란?

1.1 직렬화(Serialization)

직렬화는 객체의 상태를 저장하거나 네트워크로 전송할 수 있는 형식(예: JSON, XML, 바이너리 데이터)으로 변환하는 과정입니다. 이를 통해 메모리에 존재하는 객체를 파일에 저장하거나 네트워크를 통해 전송할 수 있습니다.

예를 들어, Java 객체를 JSON 형식으로 직렬화하면 다음과 같은 JSON 문자열을 얻을 수 있습니다:

{
  "name": "John Doe",
  "age": 30,
  "email": "john.doe@example.com"
}

1.2 역직렬화(Deserialization)

역직렬화는 직렬화된 데이터를 다시 객체로 변환하는 과정입니다. 저장된 파일이나 네트워크를 통해 받은 데이터를 원래의 객체 형태로 복원하여 프로그래밍 언어에서 직접 사용할 수 있도록 합니다.

위의 JSON 문자열을 Java 객체로 역직렬화하면 다음과 같은 객체를 얻을 수 있습니다:

Person person = new Person("John Doe", 30, "john.doe@example.com");

2. 왜 직렬화와 역직렬화가 중요한가?

직렬화와 역직렬화는 다음과 같은 상황에서 유용합니다:

  • 데이터 저장: 객체를 파일 시스템에 저장할 때 객체 상태를 직렬화하여 보관하고, 다시 사용할 때 역직렬화하여 객체로 복원합니다.
  • 네트워크 통신: 서로 다른 시스템 간에 객체 데이터를 주고받기 위해 직렬화된 형태로 전송하고, 수신한 데이터는 역직렬화하여 사용합니다.
  • 캐시 또는 세션 관리: 객체를 캐시에 저장하거나 세션 간 객체 상태를 유지할 때 직렬화를 사용합니다.

3. Jackson ObjectMapper를 이용한 직렬화와 역직렬화 예제

Jackson의 ObjectMapper는 Java 객체와 JSON 간의 변환을 쉽게 처리할 수 있는 라이브러리입니다. ObjectMapper를 사용하여 Java 객체를 JSON으로 변환(직렬화)하고, JSON 데이터를 Java 객체로 변환(역직렬화)하는 방법을 살펴보겠습니다.

3.1 Maven 설정, Gradle 설정

Jackson 라이브러리를 사용하려면 프로젝트의 pom.xml에 Jackson 라이브러리를 추가해야 합니다:

Jackson 라이브러리를 사용하려면 Gradle 프로젝트의 build.gradle 파일에 다음과 같은 의존성을 추가해야 합니다:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>
dependencies {
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'
}

3.2 Java 객체를 JSON 문자열로 직렬화

아래 예제는 Person 클래스를 JSON 문자열로 직렬화하는 코드입니다:

import com.fasterxml.jackson.databind.ObjectMapper;

public class SerializationExample {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();

        Person person = new Person("John Doe", 30, "john.doe@example.com");
        
        try {
            // Java 객체를 JSON 문자열로 직렬화
            String jsonString = objectMapper.writeValueAsString(person);
            System.out.println("Serialized JSON: " + jsonString);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Person {
    private String name;
    private int age;
    private String email;

    public Person() { }

    public Person(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    // Getters and Setters 생략
}

출력 결과:

Serialized JSON: {"name":"John Doe","age":30,"email":"john.doe@example.com"}

3.3 JSON 문자열을 Java 객체로 역직렬화

이제 JSON 문자열을 Java 객체로 역직렬화하는 예제를 살펴보겠습니다:

import com.fasterxml.jackson.databind.ObjectMapper;

public class DeserializationExample {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();

        String jsonString = "{\"name\":\"John Doe\",\"age\":30,\"email\":\"john.doe@example.com\"}";

        try {
            // JSON 문자열을 Java 객체로 역직렬화
            Person person = objectMapper.readValue(jsonString, Person.class);
            System.out.println("Deserialized Object: " + person);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

출력 결과:

Deserialized Object: Person{name='John Doe', age=30, email='john.doe@example.com'}

4. 스프링부트에서의 직렬화와 역직렬화

스프링부트(Spring Boot)는 Jackson 라이브러리를 내장하고 있어, JSON 데이터와 Java 객체 간의 변환을 매우 쉽게 처리할 수 있습니다. 스프링부트에서 ObjectMapper를 활용하는 방법과 RESTful API에서의 활용 예제를 알아보겠습니다.

4.1 스프링부트 프로젝트 설정

스프링부트 프로젝트의 build.gradle 파일에 필요한 의존성을 추가합니다:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.fasterxml.jackson.core:jackson-databind'
}

spring-boot-starter-web 의존성은 스프링부트의 웹 기능을 활성화하며, Jackson 라이브러리가 기본적으로 포함되어 있습니다.

4.2 @RestController와 JSON 자동 변환

스프링부트에서는 @RestController를 사용하여 JSON 데이터를 자동으로 Java 객체로 변환하고, Java 객체를 JSON으로 변환할 수 있습니다. 예를 들어, 다음과 같은 컨트롤러를 정의할 수 있습니다:

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class PersonController {

    @GetMapping("/person")
    public Person getPerson() {
        // Java 객체를 JSON으로 변환하여 응답
        return new Person("Jane Doe", 25, "jane.doe@example.com");
    }

    @PostMapping("/person")
    public String createPerson(@RequestBody Person person) {
        // JSON 요청 본문을 Java 객체로 변환하여 사용
        return "Received person: " + person.toString();
    }
}

4.3 스프링부트에서 ObjectMapper 직접 사용

스프링부트에서 ObjectMapper를 직접 사용하여 JSON 데이터를 처리할 수 있습니다. ObjectMapper는 @Autowired를 통해 쉽게 주입할 수 있습니다:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/objectmapper")
public class ObjectMapperController {

    @Autowired
    private ObjectMapper objectMapper;

    @GetMapping("/serialize")
    public String serializePerson() {
        Person person = new Person("John Smith", 40, "john.smith@example.com");
        try {
            // Java 객체를 JSON 문자열로 직렬화
            return objectMapper.writeValueAsString(person);
        } catch (Exception e) {
            return "Error: " + e.getMessage();
        }
    }

    @PostMapping("/deserialize")
    public String deserializePerson(@RequestBody String jsonString) {
        try {
            // JSON 문자열을 Java 객체로 역직렬화
            Person person = objectMapper.readValue(jsonString, Person.class);
            return "Deserialized person: " + person.toString();
        } catch (Exception e) {
            return "Error: " + e.getMessage();
        }
    }
}

위의 예제에서 /serialize 엔드포인트는 Person 객체를 JSON 문자열로 변환하여 응답하고, /deserialize 엔드포인트는 JSON 문자열을 받아 Person 객체로 변환하여 응답합니다.

5. 결론

직렬화와 역직렬화는 Java 프로그램에서 데이터 저장 및 전송을 위해 중요한 역할을 합니다. Jackson의 ObjectMapper는 이러한 작업을 손쉽게 처리할 수 있도록 도와주는 유용한 도구입니다. 이 글에서는 ObjectMapper를 사용하여 JSON 데이터를 직렬화하고 역직렬화하는 기본적인 예제와, 스프링부트 환경에서 이를 활용하는 방법을 소개했습니다. 또한, Gradle 설정을 통해 필요한 Jackson 라이브러리를 프로젝트에 추가하는 방법도 설명했습니다. 이를 바탕으로 다양한 응용 프로그램에서 데이터를 효율적으로 관리할 수 있을 것입니다.

이제 여러분도 ObjectMapper와 스프링부트를 활용하여 JSON 데이터를 다뤄보세요! 직렬화와 역직렬화의 개념을 이해하고 나면, 데이터 처리에 대한 자신감이 더욱 높아질 것입니다.

끝.

728x90
300x250