과정을 즐기자

직렬화는 무엇이고 왜 필요한 것일까? 본문

Java

직렬화는 무엇이고 왜 필요한 것일까?

320Hwany 2023. 11. 8. 15:09

개발을 하다보면 직렬화라는 단어를 종종 듣게됩니다. JSON, XML, 프로토콜 버퍼, Java Serialization... 등등

그렇다면 이러한 직렬화는 정확히 무엇이고 왜 사용하는 것일까요? 이번 글에서는 직렬화에 대해 알아보겠습니다.

직렬화란?

직렬화는 현재 데이터 구조나 오브젝트 상태를 영속적으로 저장하거나 다른 환경으로 전달하기 위해 어떠한 정해진 포맷으로

변환하는 과정입니다. 반대로 역직렬화는 직렬화된 포맷을 원래의 데이터 구조나 오브젝트 상태로 복구하는 과정입니다.

그렇다면 이러한 직렬화는 왜 필요한 것일까요? 이를 알아보기 전에 먼저 스택, 힙과 관련된 메모리에 대한 이해가 필요합니다.

스택, 힙

자바를 예시로 들겠습니다. 정수형의 데이터 a, b가 있을 때 이 값들은 모두 스택에 저장되어 있습니다.

DB에 저장을 하거나 네트워크 통신을 할 때 이 값들 자체를 그대로 보낼 수 있습니다.

 

문제는 레퍼런스 타입인 객체를 저장할 때 발생합니다. 자바는 Call By Value 이므로 Heap 메모리에 바로 접근하지 않습니다.

스택에 객체의 주소 값을 저장하고 이를 참조하여 Heap에 접근하는 방식입니다. 

이때 만약에 컴퓨터를 종료를 했다고 가정하겠습니다.

만약 디스크에 객체에 대한 정보를 미리 저장했다고 하더라도 그것은 참조할 Heap의 주소 값을 저장한 것이지 

객체에 대한 정보를 저장한 것이 아닙니다. 컴퓨터는 이미 종료되어 메모리에 데이터가 사라졌으므로 객체를 참조할 주소 값을

알고 있다고 하더라도 객체에 대한 정보는 찾을 수 없는 것입니다.

 

네트워크 통신을 할 때도 문제가 발생할 수 있습니다. 컴퓨터 A에서 가리키는 주소 값에 대한 객체가 컴퓨터 B에서 가리키는

주소 값에 대한 객체가 같지 않기 때문에 단순히 주소 값을 전달한다면 문제가 발생할 수 있습니다. 

이러한 문제가 있기 때문에 현재 객체의 상태를 영속적으로 저장하거나 네트워크 통신을 통해 전달을 할 때 특정한 

데이터 포맷으로 변경하여 전달해야 합니다.

직렬화 예시

JSON

가장 대표적인 예로는 네트워크 통신을 할 때 사용하는 JSON 입니다.

아래와 같이 Member라는 객체를 만들었고 객체의 데이터를 다른 서버로 전달한다고 해보겠습니다.

public class Member {
    
    private String name;
    private int age;
    
    ...
}

 

이때 위에서 말한 것처럼 단순히 스택의 주소 값을 전송하면 안됩니다. 따라서 생성한 데이터를 JSON 형식 변환하여 (직렬화)

다음과 같은 형식으로 전달해야 합니다.

{
    "name" : "이름",
    "age": 25
}

그러면 JSON 데이터를 받은 서버는 다시 JSON 형식에서 원래의 객체 상태로 되돌립니다. (역직렬화)

이러한 과정을 통해 네트워크 통신을 할 수 있게 됩니다.

 

DB에 저장할 때도 JSON 직렬화를 사용할 수 있습니다. 일반적인 경우에 RDB를 사용한다면 객체 자체를 저장하지 않고

각 필들르 간단한 데이터 타입으로 저장하지만 NoSQL을 사용해야 하는 경우라면 JSON 직렬화를 사용하여 저장할 수 있습니다.

프로토콜 버퍼

또 다른 예시로 구글에서 개발한 프로토콜 버퍼가 있습니다. 마찬가지로 데이터 영속 저장, 네트워크 통신을 위해 사용합니다.

JSON과 다른 특징이 있다면 JSON은 사람이 읽을 수 있는 텍스트인데 프로토콜 버퍼는 바이트 스트림입니다.

따라서 프로토콜 버퍼의 장점으로는 직렬화, 역직렬화 속도가 빠르며 대용량 데이터를 처리할 때 성능이 더 좋습니다.

 

최근에는 구글이 개발한 오픈 소스 원격 프로시저 호출 시스템인 gRPC를 사용할 때 프로토콜 버퍼를 이용합니다.

gRPC는 HTTP/2 기반으로 프로토콜 버퍼를 사용하여 직렬화하여 데이터를 주고 받아 대용량, 실시간 데이터 처리에 용이합니다.

Java Serialization

자바 직렬화는 자바 고유의 기술인 만큼 자바 시스템 개발에 최적화되어 있습니다. 자바의 레퍼런스 타입에 대해 제약 없이

외부로 내보낼 수 있다는 장점이 있습니다. 직렬화의 기본 조건만 지킨다면 별도의 파싱 작업없이 간편하게 사용가능합니다.

하지만 자바 직렬화는 용량이 큼, 보안 문제 발생, 릴리즈 후 수정이 어려움, 캡슐화 깨짐 등등 

여러 단점이 있어 권장되지 않는 직렬화 방식입니다.

public class MemberSession implements Serializable {

    private long id;

    private String nickname;

    private String email;

    private String password;

	...
}

 

참고한 자료

 

데이터 직렬화(serialization)는 무엇이고 왜 필요한가?

우선 이 글은 구글링에서 나오는 여러 가지 직렬화에 대한 글들과 설명들을 읽고 제 나름대로 한번 더 이해하기 편하도록 정리한 글입니다. 데이터 직렬화(serialization), 역직렬화(deserialization)는

hub1234.tistory.com

 

프로토콜 버퍼란 무엇인가(Protocol Buffer) 서버, 클라이언트 예제와 함께 feat. express & Vue

회사에서 주로 mfc를 다루다가 최근 웹프론트엔드 파트 업무를 맡게 되면서 한꺼번에 html, css, javascript, vue를 접하게 되었다...혼돈... 틀린 부분이 있다면 알려주시면 감사하겠습니다(❁´◡\`❁)

velog.io

이펙티브 자바 3판