✍️ 개요
Unity 개발에서 직렬화(Serialization) 라는 개념은 매우 중요합니다. 개발을 하면서 직렬화를 처음으로 접하는 경우는 [Serizable], [SerializedField] Attribute일 겁니다. 하지만 단순히 "이걸 추가했더니 이렇게 동작하구나"라는 접근 보다는 "이 기능이 어떤 원리로 동작하는가"에 대해 이해하는 것이 중요합니다. 그래서 직렬화에 대한 개념과 원리, 쓰임새에 대해 알아보도록 하겠습니다.
📌 직렬화(Serialization)란?
직렬화(Serialization): 객체를 저장하거나 파일로 전송하기 위해 객체를 바이트 스트림(Byte Stream)으로 변환하는 작업
반대로, 바이트 스트림을 객체로 변환하는 과정을 Deserialization이라고 합니다.
그렇다면 직렬화 과정이 왜 필요할까요?
데이터를 저장하거나, 네트워크 통신을 위해 데이터를 전송할 때는 하나로 묶인 바이트 스트림 형태만 가능합니다.
하지만 메모리에 존재하는 객체는 분산되어 저장되기 때문에 직렬화 과정이 필요합니다.
📌 직렬화의 예시
① 직렬화 언어(Language)
XML: 데이터 교환을 목적으로 설계된 마크업 언어입니다. 데이터의 구조와 의미를 정의하며, 주로 웹이나 앱에서 데이터를 공유하거나 교환할 때 사용합니다.
YAML: 설정 파일, 데이터 교환 및 저장 등에 사용하는 데이터 직렬화 언어입니다. Unity에서 씬 혹은 프리팹을 저장할 때 사용합니다.
JSON: Javascript에서 시작된 데이터 직렬화 언어입니다. 처음에는 웹에서 사용되다 점차 범용적으로 사용되기 시작했습니다. Unity 패키지에서도 많이 사용되며, 로컬 데이터를 전송하거나 서버와 클라이언트 통신에서도 많이 사용됩니다.
② MetaFile
Unity 에셋을 살펴보면 모든 에셋들은 .meta 파일이 존재함을 알 수 있습니다.
meta 데이터의 내용은 파일의 종속성 관계를 담고 있으며, 항상 저장되어야 하기에 직렬화가 필요합니다.
meta 데이터에는 GUID(Globally Unique Identifire) 식별자가 존재하는데,
이 데이터를 통해 에셋 파일을 고유하게 나타낼 수 있습니다.
③ Unity 씬 파일
Unity 씬 파일은 YAML 언어로 작성된 파일입니다.
씬에 포함된 모든 GameObject과 Component의 정보가 명시되어 있습니다.
모든 GameObject와 Component는 각자 고유의 file ID가 존재합니다.
fileID 을 통해 특정 GameObject에 연결된 Component를 참고하기 위해 사용되며,
이 데이터들 또한 저장되어야 하기에 직렬화 과정을 거칩니다.
💡 GUID와 fileID의 차이점
- GUID: 에셋의 고유 식별 string
- fileID: 씬에서만 사용되는 고유 식별 number
④ 프리팹(Prefab)
프리팹은 GameObject를 직렬화하여 데이터를 저장한 형태입니다.
Unity 씬 파일처럼 YAML 형태로 저장되며, 내부적으로 fileID와 종속성 관계를 나타냅니다.
⑤ Instantiate 메소드
Instantiate 메소드는 직렬화 데이터인 Prefab을 역직렬화하여 메모리에 로드하는 함수입니다.
이를 통해 미리 저장한 게임 오브젝트를 원하는 시점에 생성할 수 있습니다.
⑥ SO 파일(Scriptable Object)
Scriptable Object는 대량의 데이터를 저장하여 사용하기 위한 데이터 컨테이너입니다.
일반적으로 MonoBehaviour와는 다르게, 씬과 독립적으로 존재하여 에셋 파일로 저장됩니다.
이를 통해 게임 데이터를 쉽고 효율적으로 관리할 수 있습니다.
📌 정리
직렬화(Serialization)는 객체를 저장하거나 파일로 전송하기 위해 객체를 바이트 스트림(Byte Stream)으로 변환하는 작업입니다. 이를 통해 게임 오브젝트, ScriptableObject, 프리팹 등이 파일 형태로 저장되거나 네트워크로 전송될 수 있습니다. 직렬화를 이해하면 데이터 관리와 최적화를 효율적으로 설계할 수 있어 게임 개발의 필수 요소라 할 수 있습니다.
💡 참고 자료
[Unity Korea 유튜브 자료]
'유니티(Unity) > 이론 정리' 카테고리의 다른 글
[Unity] Model이 렌더링(Rendering)되는 과정 (1편) (0) | 2024.11.21 |
---|---|
[Unity] URP란 무엇인가? (0) | 2024.11.20 |
[Unity] Mono & IL2CPP 컴파일 방식의 차이 (0) | 2024.11.18 |
[Unity] .NET이란? (4) | 2024.11.17 |
Unitask의 개념과 사용법 (0) | 2024.11.14 |