직렬화(Serialization)

CosmoNumb·2024년 8월 13일
0

java

목록 보기
21/24

redis를 학습하는 과정에서, 강의자료의 간단한 예제로 구현하는 redis프로젝트의 item 클래스에 직렬화 클래스를 상속받도록 하여 사유를 파악하고 정리합니다. Redis를 활용하면서 이 개념이 왜 필요한지 이해하려면 먼저 직렬화에 대해 알아보는 것이 중요한 것으로 보입니다. 이것은 자바의 중요한 개념 중 하나입니다.


1. 직렬화(Serialization)란?

직렬화는 자바 객체를 바이트 스트림으로 변환하는 과정입니다. 이렇게 변환된 바이트 스트림은 파일에 저장되거나 네트워크를 통해 전송될 수 있습니다. 역직렬화(Deserialization)는 이 바이트 스트림을 다시 자바 객체로 변환하는 과정입니다.

import java.io.Serializable;

public class Item implements Serializable {
    private String name;
    private int quantity;

    public Item(String name, int quantity) {
        this.name = name;
        this.quantity = quantity;
    }

    // Getters and setters
}

위의 코드에서 Item 클래스는 Serializable 인터페이스를 구현하고 있습니다. 이를 통해 Item 객체는 직렬화될 수 있습니다.

2. 왜 Redis를 배울 때 직렬화가 필요한가?

Redis는 인메모리 데이터베이스로 데이터를 저장할 때 다양한 형식을 지원합니다. 일반적으로 String, List, Set, Hash 등의 기본 데이터 구조를 사용합니다. 그러나 복잡한 객체를 저장하고 싶을 때는 객체를 직렬화하여 Redis에 저장할 수 있습니다.

예를 들어:

  • 자바에서 객체를 Redis에 저장하려면, 그 객체를 직렬화하여 바이트 스트림으로 변환한 후 Redis에 저장할 수 있습니다.
  • 이후 객체가 필요할 때, Redis에서 바이트 스트림을 읽어와 역직렬화하여 자바 객체로 변환합니다.

이 과정에서 직렬화가 필수적입니다. 그렇기 때문에 Serializable 인터페이스를 구현하게 되는 것입니다.

3. Redis에서 객체 저장 예제

다음은 자바 객체를 Redis에 저장하고 다시 읽어오는 예제입니다:

import redis.clients.jedis.Jedis;
import java.io.*;

public class RedisExample {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");

        // 객체 생성
        Item item = new Item("Apple", 10);

        try {
            // 객체를 직렬화하여 바이트 배열로 변환
            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(byteOut);
            out.writeObject(item);
            byte[] itemBytes = byteOut.toByteArray();

            // 바이트 배열을 Redis에 저장
            jedis.set("item1".getBytes(), itemBytes);

            // Redis에서 바이트 배열을 읽어옴
            byte[] retrievedBytes = jedis.get("item1".getBytes());

            // 바이트 배열을 역직렬화하여 객체로 변환
            ByteArrayInputStream byteIn = new ByteArrayInputStream(retrievedBytes);
            ObjectInputStream in = new ObjectInputStream(byteIn);
            Item retrievedItem = (Item) in.readObject();

            System.out.println("Item name: " + retrievedItem.getName());
            System.out.println("Item quantity: " + retrievedItem.getQuantity());

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

이 예제에서:

  • Item 객체는 직렬화되어 Redis에 저장됩니다.
  • 이후 다시 역직렬화하여 Item 객체로 복원합니다.

4. 정리

직렬화는 자바 객체를 Redis와 같은 외부 시스템에 저장하거나 네트워크를 통해 전송할 때 필요한 과정입니다. Redis에서 자바 객체를 저장하려면 객체를 직렬화해야 하며, 이 때문에 Serializable 인터페이스를 구현하게 됩니다.

Redis에서의 직렬화는 꼭 필요한 과정은 아니지만, 복잡한 객체를 저장하거나 Redis를 데이터 캐싱, 세션 관리 등 다양한 용도로 사용할 때 유용하게 사용됩니다. 따라서 Redis를 배우면서 자바의 직렬화 개념을 이해하는 것은 유용합니다.

0개의 댓글