Info
나는 사이드 프로젝트 중 Clean Architecture로 레이어를 나눠 개발 중이였다.
현 상황은 UI레이어에서는 Domain의 Book이란 객체를 사용하고 있었다.
JetPack Navigation을 이용해 이전화면에서 데이터를 넘김과 동시에 화면을 이동하려 하는데 Serializable 이나 Parcelabe이 아니면 객체를 넘기지 못했다.
이런 상황에서 Domain은 순수한 객체여야 하기에 Parcelabe 는 Android SDK 인터페이스이기에 사용하지 못한다. 그렇기에 이 상황을 넘김과 동시에 직렬화에 대해 좀더 이해하기 위해 이 글을 작성한다.
직렬화란?
- 직렬화는 메모리 내에 존재하는 정보를 보다 쉽게 전송 및 전달하기 위해 byte 코드 형태로 나열하는 것이다. 여기서 메모리 내에 존재하는 정보는 즉 객체를 말한다.
- JVM(Java Virtual Machine)의 메모리에 상주 되어있는 객체 데이터를 바이트 형태로 변환하는 기술
따라서 직렬화는 주로 객체들을 통째로 파일로 저장하거나 전송하고 싶을 때 사용한다. 나는 안드로이드 앱 개발을 할 때 액티비티간의 데이터를 전달할 때 인텐트를 사용하고 이 인텐트에 전달할 데이터를 추가한다.
복잡한 클래스의 객체를 이동하려는 경우에는 직렬화하여 인텐트에 추가해서 데이터를 이동하면 된다.
intent 데이터 이동시 객체를 직렬화 해야 하는 이유는 intent는 기본적으로 값의 복사본을 생성하여 넘기게 된다. 그러므로 기본 데이터 타입은 바이트 크기가 정해져 있으므로 직렬화가 필요없지만 객체는 바이트 크기를 알 수 없으므로 직렬화를 해주어야 한다.
역직렬화란?
- byte로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술을 역직렬화라고 한다.
- 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태
우리는 안드로이드에서 직렬화를 할때는 Serializable 또는 Parcelable로 구현해야된다.
Serializable
- Java에서 제공하는 인터페이스로, 객체를 직렬화하여 전달하기 위해 사용된다.
- 객체를 바이트 스트림으로 변환하여 전달할 수 있다.
- Gson 라이브러리 사용
- Serializable 인터페이스를 구현한 객체는 Java에서 제공하는 ObjectOutputStream을 사용하여 전달할 수 있다.
- Serializable은 해당 클래스가 직렬화 대상이라고 알려주기만 할 뿐 어떠한 메소드도 가지지 않는 단순한 마커 인터페이스이다.
코드로 보면 다음과 같다.
import java.io.Serializable
data class Employee(val name: String, val age: Int) : Serializable
그런데 Serializable은 내부에서 Reflection을 사용하여 직렬화를 처리한다. Reflection 은 프로그램 런타임에 데이터를 직렬화/역직렬화하는 과정에 많은 객체를 생성하고 덕분에 GC가 할일이 늘어나게 된다. 그래서 CPU에 부하가 간다. 프로젝트의 사이즈가 커져서 Serializable을 사용하는 객체가 많아지면 많아질수록 성능에는 안좋은 영향을 미치게 된다.
Parcelable
- 안드로이드 SDK가 포함하고 있는 인터페이스
- serializable에 비해 속도가 빠르다고 한다
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class Employee(val name: String, val age: Int) : Parcelable
그래서
import kotlinx.serialization.Serializable
@Serializable
data class Employee(val name: String, val age: Int)
참고
- https://woovictory.github.io/2019/01/03/Android-What-is-serialization/
- https://blacktrees.tistory.com/entry/Android-Parcelable%EA%B3%BC-Serializable%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
- https://gus0000123.medium.com/android%EC%97%90%EC%84%9C-parcelable-serializable-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-ce77ab82f27f
'Android > 기타' 카테고리의 다른 글
Bitrise를 도입해 보자! (0) | 2024.03.23 |
---|---|
하나의 프로젝트에서 여러 다른 버전의 앱을 만들어 보자!(1) - BuildType, productFlavors (0) | 2024.01.28 |
Image Loader (0) | 2023.10.22 |
하나의 프로젝트에서 여러 다른 버전의 앱을 만들어 보자!(2) - 딥링크, 앱링크 (0) | 2023.07.19 |
딥링크와 앱링크 (0) | 2023.07.19 |