티스토리 뷰

iOS

[iOS] Object Graph와 Archive 정리

Hani_Levenshtein 2021. 12. 8. 00:54

[21.12.07 최종 수정]

 

안녕하세요 Hani입니다.

Core Data를 공부하려다가 꼭 알아야 할 개념 같아서.. 지나칠 수 없었어요. 🥺

 

Object Graph랑 이에 관련된 것들을 몇 가지 알아보려고 합니당.

 


Object Graph란 뭐냐 😡

 

객체 지향 프로그래밍에서는 객체들끼리 간접적이든 직접적이든 참조를 통해 관계를 갖게 되는데

이 관계를 통해 형성된 그룹을 Object Graph라고 합니다.

 

 

그리고 Object Graph의 전체 혹은 일부를 파일로 저장하거나 다른 프로세스로 보내서

재구성할 수 있도록 변환하는 작업을 Archiving이라고 해요. ☺️

 

Archiving에 대하여 좀 더 알아봅시당.


왼쪽 알파벳이 각 객체를 나타내고 굵은 선이 객체들의 관계를 나타내 주고 있어요.

그리고 객체, 객체들의 관계를 통해 형성된 그룹이 Object Graph라고 위에서 말씀드렸습니다. 😎 

 

그리고 Object Graph를 저장하거나 전송할 수 있는 형태로 변환하는 작업이 Archiving이었습니다.

오른쪽 파일이 그 결과물인 archive에요.

 

archive는 객체들의 ID와 값, 그리고 객체들 간의 관계를 기록한 byte stream입니다.

 

 


아니 근데 아카이빙 왜 하는 거야 😡

 

 

Archiving은 객체를 영구적으로 만드는 일반적인 방법을 제공하기 때문이에요.

 

애플리케이션이 객체 데이터를 특별한 형태의 파일 포맷으로 작성하지 않고

객체를 파일로 저장할 수 있도록 archive에 저장합니다.

 

 

archive에 포함되려면 클래스가 반드시 NSCoding 프로토콜을 채택하고

Encoding과 Decoding에 대한 필수 메서드를 구현해야 합니다.

 

기본적인 자료형은 다 NSCoding을 준수하고 있기 때문에 커스텀 클래스를 사용할 때 채택하면 되겠습니당.

 

 

 

조립은 분해의 역순..?

Unarchiving은 Archiving의 과정을 뒤집은 거예요. ☺️ 

archive를 재구성하여 Archiving 하기 전 상태의 Object Graph와 동등하게 만드는 작업입니다.

 


그럼 어떻게 Archiving 하고 Unarchiving 할 수 있는데 😡

 

Foundation 프레임워크는 Object Graph의 Archiving과 Unarchiving을 위한 두 종류의 클래스를 제공하고 있어요.

각각 Archiver와 Unarchiver라는 클래스입니다. 

 

 

그리고 Archiver와 Unarchiver는 두 종류로 또 나뉩니다. 🥺

String Key를 Encode/Decode 할 데이터의 ID로 사용하는 NSKeyedArchiver/NSKeyedUnarchiver.

객체의 상태를 특정 순서대로 Encode/Decode 하는 NSArchiver/NSUnarchiver.

 

하.. 복잡해 보이죠?

 

 

NSArchiver/NSUnarchiver는 옛날 거라 Deprecated 되었어요.

우리는 NSKeyedArchiver/NSKeyedUnarchiver만 알면 됩니당. ☺️

 

 

archive를 생성하기 위해서는 NSKeyedArchiver의 타입 메서드인 

archivedData(withRootObject:requiringSecureCoding:)

 

다시 언아카이빙하여 Object Graph를 얻어오기 위해서는 NSKeyedUnarchiver의 타입 메서드인 

unarchivedObject(ofClass:from:)를 호출하면 됩니다.

 


References

https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/ObjectGraph.html#//apple_ref/doc/uid/TP40008195-CH54-SW1

https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Archiving.html#//apple_ref/doc/uid/TP40008195-CH1-SW1

 

댓글