티스토리 뷰
자바 객체를 영속화하는 방법의 하나로 자바 직렬화를 사용할 수 있습니다. 단순하게는 Serializable 인터페이스를 구현하거나 더 확장성 있는 방법으로는 Externalizable 인터페이스를 구현하는 것을 선택할 수 있고, 자바 직렬화에 종속되지 않는 다른 방법을 선택할 수도 있습니다.
직렬화란?
자바 시스템 내부에서 사용되는 객체와 데이터를 외부에서도 사용가능하도록 바이트 형태로 데이터를 변환하는 기술입니다. 바이트로 변환된 데이터를 다시 객체로 변화는 것은 역직렬화라고 합니다.
자바는 JVM에 의해 관리가 되는데, 메모리에서 힙 또는 스택 영역에 저장되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환하여 JVM에 상주시키는 형태를 이야기하곤 합니다.
그럼 직렬화를 왜 쓰는 걸까요? 자바는 참조 형식 데이터로 구성되어 있기 때문에 실제 데이터 값이 아닙니다. 이게 무슨말이냐면, 이해를 쉽게 돕기 위해 음식과 그릇에 비유를 하고자 합니다. 우리가 보통 식당에 가서 음식을 먹기전에 음식이 어디있는지를 찾아보면 음식은 보통 우리가 앉아있는 식탁위에 있는 음식을 먹을 수 있습니다. 하지만 음식이 나오지 않고 주문을 한 상태에서 주방에서 조리중인 상태인 것은 음식이 아닙니다. 그리고 막상 주방에서 음식이 나온다고 하더라도 우리는 우리 앞까지 음식을 가져다 주어야만 음식을 먹을 수가 있습니다.
즉, 우리는 참조형태로 되어 있는 것이 아닌 구체적인 형태로 되어야 하는 것을 먹습니다. '음식이 저기 있어'라고 가리키는 것으로는 음식을 먹는 행위가 불가능합니다. 자바에서는 주소를 참조하여 데이터를 가져오기 때문에 데이터가 담겨있는 그릇을 통으로 가져와서 보여주는 방식이 아닌, 데이터가 담긴 그릇의 위치만을 보여줍니다. 그래서 우리는 이걸 직접 가져와야하는 방법을 찾다가 직렬화라는 것으로 구체화해주는 것입니다.
이는 네트워크 상으로도 문제가 됩니다. 서버에서 저장된 데이터를 다른 서버에서 확인할 수가 없기 때문에 우리는 이 데이터를 패킷이라는 네트워크 단위에 담아서 보내주게 됩니다. 패킷에 담기 전에 JVM이 직렬화를 시도하고, 직렬화가 된 데이터만 전송이 가능합니다.
직렬화를 사용하는 방법
Serializable 인터페이스를 구현한 클래스의 인스턴스가 외부 저장소에 영속화되면 호환성을 유지하면서 해당 클래스의 필드를 수정하기는 어렵습니다. Serializable 인터페이스를 들어가보면 저장되어 있는 내용이 크게 없지만 중요한 내용은 이 객체들이 버전에 따라 관리된다는 점입니다.
구현을 하는 방법과 사용 방법, 자바 내에서 직렬화를 사용하는 곳은 아래의 링크의 글에서 더 자세히 다루고 있습니다.
직렬화는 중요한 것일까
Author: 니용 안녕하세요! 이번 글에서는 Java에서 종종 보게 되는 직렬화에 대해 알아보고자 합니다. 직렬이라고 하면 학창시절 과학시간에 전지가 일렬로 놓여져 있는 것을 종종 보셨을텐데, 그
abbo.tistory.com
2023-01-29 업데이트
아래는 글을 찾다보다가 안드로이드 앱에서 기본적인 Serialize 를 사용하는 것이 아닌 외부 라이브러리인 Parcelable 을 사용하는 것이 더 바람직하다는 내용을 찾게 되어 링크를 남기게 되었습니다.
https://www.charlezz.com/?p=823
Parcelable과 Serializable 비교 | 찰스의 안드로이드
Serializable은 분명히 개발자 입장에서는 편합니다. 인터페이스 구현만 하면되니까요. 하지만 앱 사용자에게는 퍼포먼스저하와 베터리 드래인이라는 큰 단점을 안겨 줍니다. 조금은 귀찮더라도 Se
www.charlezz.com
이전에 제가 작성한 '유연성 더하기'에 원문 링크입니다.
출처: https://prostars.tistory.com/317
자바 직렬화(Java Object Serialization)에 유연성 더하기
자바 객체를 영속화하는 방법의 하나로 자바 직렬화를 사용할 수 있다. 단순하게는 Serializable 인터페이스를 구현하거나 더 확장성 있는 방법으로는 Externalizable 인터페이스를 구현하는 것을 선택
prostars.net
Externalizable 인터페이스
이제 Serializable 인터페이스를 확장하는 개념인 Externalizable 인터페이스에 대해 알아보려 합니다. 인터페이스 내는 심플하게 2가지의 메소드로 구현되어 있습니다.
public interface Externalizable extends java.io.Serializable {
void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}
Externalizable 클래스는 Object 안에 있는 모든 변수들이 직렬화 대상이 되는 (primitive type 포함) Serializable 과는 다릅니다. 제외되는 대상에 transient 키워드를 붙여 제외시킬 수 있습니다. 아래 예시를 확인해보겠습니다.
Member.java
public class Memeber implements Externalizable {
private long id;
private String name;
transient private String job; // Serializable 사용 불가
}
아무래도 데이터를 전송함에 있어서 모든 데이터를 주고 받는 것보다 필요한 데이터를 주고 받는 것이 더 좋을 것입니다. 여기서는 writeExternal과 readExternal 의 구현체가 따로 빠져있지만, 개발시에는 구현해주어야 합니다.
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeUTF(this.id);
out.writeUTF(this.name);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFOundException {
this.id = in.readUTF();
this.name = in.readUTF();
}
job 컬럼의 경우 직렬화 대상에서 제외되었기 때문에 구현체에서 사용하지 못할 뿐더러 transient 라는 키워드로 컨트롤이 가능한 이점이 있습니다.
'Server' 카테고리의 다른 글
[Java] Java 14 Record, Entity Class로 사용 가능할까? (0) | 2023.02.02 |
---|---|
[Java] 함수형 인터페이스에 대해 알아보기 (0) | 2023.02.01 |
[Spring] Security 를 사용했을 때 세션의 만료 체크하기 (0) | 2023.01.31 |
[Java] 보일러플레이트 코드와 실제 적용 후기 (0) | 2023.01.29 |
[Refactor] 자바 코드 리팩터링하기 - 3부 (0) | 2023.01.27 |
[Refactor] 자바 코드 리팩터링하기 - 2부 (0) | 2023.01.26 |