직렬화

hyunho4562·2023년 8월 28일
1
post-thumbnail

회사 코드를 보다 Serializable 인터페이스를 상속받은 DTO 객체가 있었다.
직렬화에 대해 지식이 부족했던 나는 블로그에 작성하기로 결심했다.


직렬화는 무엇일까?

자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바에서도 사용할 수 있도록 byte 형태로 데이터를 변환한다.


반대로 역직렬화는 무엇일까?

byte로 변환된 데이터를 원래대로 Object나 Data로 변환한다.


직렬화를 사용하는 이유

서비스 객체와 컨트롤러 객체는 직렬화를 사용 안하는데, 왜 DTO 객체에서는 사용을 할까?

  1. DTO 객체를 다른쪽에서 사용할 수 있기 때문이다.
  2. DB 저장 시 직렬화 없이 저장해도 문제가 되지는 않는다.
  3. DB에 있는 내용과 새롭게 변경된 객체의 serialVersionUID가 다르면, 사용할 수 없다.

직렬화의 장점

DTO 객체를 직렬화를 사용하고 싶지는 않을 것이다. 하지만 장점들이 존재한다.


1. 데이터 저장 및 지속성(Persistence)

파일이나 데이터베이스와 같은 영구 저장소에 저장할 수 있다.


2. 데이터 교환과 공유

다른 시스템 간에 교환하거나 공유하는데 유용하다.


3. 네트워크 통신

네트워크 상에서 데이터를 주고 받을 때는 데이터를 바이트 스트림으로 변환하여 전송, 수신 측에서는 이를 역직렬화하여 원래의 데이터 구조로 복원한다.


직렬화를 사용하려면 어떻게 사용해야 할까?

  • java.io.Serializable 인터페이스를 상속받은 객체는 직렬화를 사용한다.
  • java.io.ObjectOutputStream를 사용하여 직렬화를 진행한다.

public class User implements Serializable {
	private String name;
    private String email;
    private String nickname;
    private String hobby;
    
    public User(String name, String email, String nickname, String hobby) {
    	this.name = name;
        this.email = email;
        this.nickname = nickname;
        this.hobby = hobby;
    }
    
    @Override
    public String toString() {
    	return String.format("User={name='%s', email='%s', nickname='%s', hobby='%s'}", name, email, nickname, hobby)
    }
}


public class SerializationExample {
    public static void main(String[] args) {
        User user = new User("John Doe", "john@example.com", "johndoe", "Programming");

        // 직렬화
        try {
            FileOutputStream fileOut = new FileOutputStream("user.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(user);
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved in user.ser");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 역직렬화
        User deserializedUser = null;
        try {
            FileInputStream fileIn = new FileInputStream("user.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            deserializedUser = (User) in.readObject();
            in.close();
            fileIn.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        if (deserializedUser != null) {
            System.out.println("Deserialized User: " + deserializedUser.toString());
        }
    }
}

코드 이해하기

자바 코드를 이해하는 시간을 가져보자.

  1. Serializable 인터페이스를 구현하여 직렬화 가능한 User 클래스를 생성
  2. SerializationExample 클래스는 User 객체를 직렬화하여 파일로 저장.
  3. 역직렬화하여 객체를 복원한다.




직렬화된 데이터를 역직렬화로 변환되는 과정

1. 데이터 읽기

역직렬화로 변환하기 위해 직렬화된 데이터의 바이트 스트림을 읽는다.


2. 클래스 확인

역직렬화하려는 데이터가 어떤 클래스의 인스턴스인지 확인한다.


3. 객체 생성

역직렬화될 데이터를 원래의 클래스의 인스턴스로 생성한다.


4. 데이터 복원

역직렬화된 데이터를 사용하여 객체의 필드나 속성을 복원한다.


5. 객체 반환

역직렬화가 완료되면 복원된 객체가 반환한다.


다른 언어에서는 직렬화를 지원할까?

당연하게도 다른 언어에서도 직렬화를 지원한다.


아래 코드는 자바와 호환이 매우 잘되는 코틀린 프로그래밍 언어로 직렬화를 사용하였다.

import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

@Serializable
data class User(val name: String, val email: String, val age: Int)

fun main() {
    val user = User("John Doe", "john@example.com", 30)

    // 직렬화
    val jsonString = Json.encodeToString(User.serializer(), user)
    println("Serialized JSON: $jsonString")

    // 역직렬화
    val deserializedUser = Json.decodeFromString(User.serializer(), jsonString)
    println("Deserialized User: $deserializedUser")
}

1. 자바 직렬화 라이브러리 활용

코틀린에서도 자바의 직렬화 관련 클래스와 인터페이스를 그대로 사용할 수 있다.


2. Kotlin Serialization 라이브러리

Kotlin Serialization은 코틀린을 위한 공식 직렬화 라이브러리입니다

애노테이션과 확장 함수를 활용하여 코틀린 클래스를 직렬화 및 역직렬화할 수 있습니다.


코드 이해하기

코틀린 코드를 이해하는 시간을 가져보자.

  1. @Serializable 애노테이션을 사용하여 직렬화할 클래스를 표시
  2. encodeToString() 함수와 decodeFromString() 함수를 사용하여 직렬화 및 역직렬화를 수행한다.

결론: 데이터 == 직렬화

직렬화는 간단하지 않을 수 있다.
보안 문제와 호환 문제를 고려해야 하며, 신중하게 데이터를 역직렬화 해야 한다.

더 나아가서, 직렬화에 대한 기본 개념을 이해한 후에도 여전히 배울 것이 상당히 많다.
데이터 압축, 다양한 직렬화 포맷, 더 안전한 역직렬화 방법 등의 주제도 더 탐구할 가치가 있다.


계속 해서 직렬화에 대해 공부하다 보면 미래에 발전하는 데이터 관리와 교환의 핵심 도구로서 직렬화가 기능을 발휘할 것입니다.

profile
유연한 자세

0개의 댓글