[Java] Serializable. 직렬화란 무엇일까?

Kai·2023년 1월 8일
1

Java

목록 보기
7/22
post-custom-banner

☕ 시작


이번 글에서는 직렬화란 무엇이고, Java에서 직렬화를 구현할 수 있게 해주는 Serializable에 대해서 알아보겠다.
다른 여러 블로그들을 찾아봤는데, 개인적으로는 내용들이 너무 원론적이고 어렵게 설명이 되어 있는 것 같았다.
그래서 이 글에서는 좀 더 쉽고 직관적으로 이야기해볼까 한다. ㅎㅎ


🧐 직렬화(Serialize)란?


"직렬화" 단어만 들었을 때는 매우 와 닿지 않는다...
하지만 그 뜻은 사실 매우 간단하다.

- Java의 직렬화: 어떤 객체(Class)를 Byte로 변환하는 것
- Java의 역직렬화: 직렬화한 Byte를 다시 객체(Class)로 변환하여 JVM 메모리에 들고 있는 것

이런 직렬화, 역직렬화 기능은 아마 다른 언어들에도 대부분 존재할 것이다.
직렬화를 좀 더 범용적으로 이야기하자면, "각 언어의 코드를 하위 레벨의 문자열로 변환하는 것"이라고 할 수 있겠다.

근데 이런 기술은 왜 필요할까?

🤔 Why?

직렬화를 한다는 것은 Java객체를 JVM에서 뽑아내서 데이터를 파일과 같은 형태로 저장할 수 있음을 의미한다.
이렇게 저장된 Byte를 다른 시스템에서 가져와서 사용할 수도 있게 되는 것이다.
즉, 직렬화를 하는 이유는 현재 구동되고 있는 Java시스템과는 독립적으로 무언가를 저장하고 싶을 때 사용한다.
실제로 사용되는 예시는 아래와 같다.

  • 서블릿 세션: 서블릿의 세션을 직렬화해서 DB나 파일로 저장할 수 있다.
  • 캐시(Cache): Redis와 같은 메모리 서버들에서 사용한다.
  • Java RMI

🧐 어떻게 사용할까?


🔑 직렬화 준비

class HelloSerialize implements Serializable {
	...
}

특정 객체에 Serializable 인터페이스를 상속받아서 구현하면 해당 클래스는 직렬화할 준비가 된 것이 된다.
이 클래스를 직렬화하려면 ObjectOutPutStream클래스를 이용하면 된다.

🔓 직렬화하기

public static void main(String[] args) throws IOException {

	HelloSerialize helloSerialize = new HelloSerialize();
    
	byte[] serialized;
	ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
	ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
	objectOutputStream.writeObject(helloSerialize);
    
	serialized = byteArrayOutputStream.toByteArray();

	System.out.println("serialized = " + Arrays.toString(serialized));
    
}

위와 같이 ByteArrayOutputStreamObjectOutputStream객체를 활용하면, 특정 클래스를 직렬화할 수 있다.

🧐 직접 보기

위의 예시로 코드를 실행해보면, 보는 것과 같이 Java의 클래스가 Byte코드로 직렬화된 것을 확인할 수 있다.
이렇게 만들어진 Byte는 파일로 저장하든, 다른 시스템에 전송하든 다양하게 쓸 수 있을 것이다.


🙏 비슷한 예시


이해를 위해서 예전에 프론트엔드 개발을 할 때에 있었던 비슷한 예시를 이야기해보겠다.
웹 기반의 디자인 툴을 개발할 때였다.

이 때, 디자인 하나에는 매우 방대한 정보를 포함하고 있었다.
폰트, 객체들의 위치와 크기, 색상, 에니메이션 정보등등등...
그리고 이는 모두 프론트엔드(브라우저)에서 일어나는 일이였고, 방대한 정보를 품고있는 하나의 디자인은 json 객체로 만들어졌었다.

당연히 사용자는 이 디자인을 저장할 수 있어야했고, 불러올 수 있어야했다.
그래서 이 json으로 된 디자인 정보를 DB에 저장했어야했는데 여러 이유들 때문에 json 그대로 DB에 저장하기는 부담스러웠다.
그래서 사용자가 디자인을 저장하면, 디자인 객체를 직렬화해서 DB에 저장했고,
사용자가 디자인을 조회하면 DB에 저장된 직렬화된 디자인객체를 역직렬화하여 브라우저 상에서 json형태로 들고 있도록 개발했었다.

이는 Java의 직렬화를 사용했던 경험은 아니지만, javascript에서 제공하는 직렬화 기능을 사용해서 실무에서 적용했던 경험이다. 🤭
혹시나 이렇게 이야기하면 좀 더 와닿을 수도 있는 것들이 있지 않을까 해서 이야기해보았다 ㅎㅎ


참고

post-custom-banner

0개의 댓글