iOS/🍎 Documentation

[iOS] Object Graphs 와 Archives, 그리고 Serialization

woozzang 2021. 5. 24. 18:54

이 글을 톡해 μ•Œκ²Œ λ˜λŠ” 것듀

Apple 곡식 λ¬Έμ„œμ— λ“±μž₯ν•˜λŠ” Object Graph μ΄λž€?

Archives λž€?

Serialization μ΄λž€?


 

κ°œμš”

μ œκ°€ Object Graph λ₯Ό κ²€μƒ‰ν•˜κ²Œ 된 κ³„κΈ°λŠ” NSKeyedArchiver 의 νƒ€μž… λ©”μ„œλ“œμΈ

 

archivedData(withRootObject:requiringSecureCoding:) 의 μ„€λͺ…μ—μ„œObject Graph λΌλŠ” 단어λ₯Ό λ°œκ²¬ν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

이것은 ν”Œλž«νΌμ— 쒅속적인 μš©μ–΄κ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—

μ—¬λŸ¬ 객체 κ°„μ˜ 관계λ₯Ό κ°€λ¦¬ν‚€λŠ” κ°€λ¦¬ν‚€λŠ” κ·Έλž˜ν”„ λΌλŠ” μ •λ„μ˜ λŒ€λž΅μ μΈ κ°œλ…μ€ μ•Œκ³  μžˆμ—ˆμ§€λ§Œ, μ• ν”Œ 곡식 λ¬Έμ„œμ—μ„œ μ„€λͺ…ν•˜λŠ” 자료λ₯Ό μ°Ύκ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

 

마침 그런 λ¬Έμ„œκ°€ μžˆμ—ˆκ³ , 이 λ¬Έμ„œλ₯Ό μ •λ¦¬ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

μΆ”κ°€μ μœΌλ‘œ Archives 와 Serialization λ₯Ό λΉ„κ΅ν•˜λŠ” λ‚΄μš©λ„ 적게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


 

Object Graphs

객체 지ν–₯ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ—°κ΄€λœ 였브젝트 끼리 맀우 λ³΅μž‘ν•œ 관계 (web) 을 이루고 μžˆμŠ΅λ‹ˆλ‹€.

 

μ˜€λΈŒμ νŠΈλ“€μ€ λ‹€λ₯Έ 였브젝트λ₯Ό μ†Œμœ ν•˜κ±°λ‚˜ ν¬ν•¨ν•˜κ³  μžˆκΈ°λ„ ν•˜κ³ , λ˜λŠ” κ·Έ 였브젝트의 μ°Έμ‘°λ₯Ό 가지고 μžˆμœΌλ©΄μ„œ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€. :: 객체듀 간에 생길 수 μžˆλŠ” 관계λ₯Ό μ„€λͺ…

// 였브젝트λ₯Ό μ†Œμœ ν•˜κ³  μžˆλ‹€.
class A {
  var b: B = B()
  
  func call() {
  	print("What's wrong")
  }
}

// 였브젝트의 μ°Έμ‘°λ₯Ό 가지고 μžˆλ‹€.
class B {
  var a: A
  
  init(a: A) {
  	self.a = a
  }
  
  func callA() {
  	a.call() // λ©”μ‹œμ§€ 전달
  }
}

var a = A()

var b = B(a: a)

 

이런 맀우 λ³΅μž‘ν•œ 관계 (web) 을 Object graph 라고 λΆ€λ¦…λ‹ˆλ‹€.

 

적은 수의 μ˜€λΈŒμ νŠΈλ“€μ˜ κ΄€κ³„λ§Œ ν‘œν˜„ν•˜λ”λΌλ„ , ν•˜λ‚˜μ˜ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ Object graph λŠ” 개개인의 μ˜€λΈŒμ νŠΈκ°„μ˜ μˆœν™˜ μ°Έμ‘°λ₯Ό κ°€μ§€κ±°λ‚˜ μ—¬λŸ¬ 개의 μ—°κ²°λ“€λ‘œ μ–½ν˜€ κ΅¬μ„±λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

 

an incomplete object graph for a simple Cocoa application in OS X

 

μœ„ 그림은 Cocoa 기반의 λ§₯용 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ Object graph λ₯Ό 좔상화 ν•œκ²ƒμž…λ‹ˆλ‹€.

 

μš°λ¦¬λŠ” 이런 관계λ₯Ό κ°€μ§€λŠ” κ·Έλž˜ν”„λ₯Ό Object graph 라고 λ‚˜νƒ€λƒ„μ„ μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

그런데 이런 μ˜€λΈŒμ νŠΈλ“€μ˜ 관계λ₯Ό λ³΄μ‘΄ν•œ μ±„λ‘œ νŒŒμΌμ— μ €μž₯ν•  수 μžˆλŠ” ν˜•μ‹μ΄λ‚˜ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ‚˜ 기기에 전달할 수 μžˆλŠ” ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜κ³  싢을 수 μžˆμŠ΅λ‹ˆλ‹€. :: λ‹€λ₯Έ ν˜•μ‹μœΌλ‘œμ˜ λ³€ν™˜μ€ 인코딩, λ””μ½”λ”©κ³Ό κ΄€λ ¨λœ κ°œλ…μ΄μ£ ?

 

예λ₯Ό λ“€μ–΄ Nib 파일과 Property list λŠ” object graph λ₯Ό 파일 ν˜•νƒœλ‘œ μ €μž₯ν•  수 μžˆλŠ” μˆ˜λ‹¨μž…λ‹ˆλ‹€.

:: 그런데 Nib νŒŒμΌμ€ ν˜„μž¬ xib λ‚˜ Storyboard 파일둜 λŒ€μ²΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μˆ˜ν–‰ν•˜λŠ” κΈ°λŠ₯은 μœ μ‚¬ν•©λ‹ˆλ‹€!

 

Nib file λŠ” μ•± UI λ₯Ό κ΅¬μ„±ν•˜λŠ” 였브젝트 κ°„μ˜ λ³΅μž‘ν•œ 관계λ₯Ό ν‘œν˜„ν•  수 μžˆλŠ” μ•„μΉ΄μ΄λΈŒ(archives) μž…λ‹ˆλ‹€.

예λ₯Ό λ“€λ©΄ window 의 λ·° 계측 ꡬ쑰가 μžˆμŠ΅λ‹ˆλ‹€.

 

❗️❗️❗️

μ•„μΉ΄μ΄λΈŒλŠ” μ•„μΉ΄μ΄λΉ™μ˜ 결과물이고, 아카이빙은 λ©”λͺ¨λ¦¬κ°€ μ•„λ‹Œ λ””μŠ€ν¬μ— 파일 ν˜•νƒœλ‘œ μ €μž₯ν•˜λŠ” λ™μž‘μž…λ‹ˆλ‹€.

그리고 μ•„μΉ΄μ΄λΉ™μ—λŠ” λŒ€μƒ 객체의 Encoding 과정이 ν¬ν•¨λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

 

Property list λŠ” serialization μž…λ‹ˆλ‹€. basic value 였브젝트 κ°„μ˜ κ°„λ‹¨ν•œ 계측 관계λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

 

κ΄€λ ¨ 사진:

κ΄€λ ¨ μ„€λͺ… κΈ€:


Archives

μ•„μΉ΄μ΄λΈŒ(archive) λŠ” λ³΅μž‘ν•œ Object grapth λ₯Ό μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ•„μΉ΄μ΄λΈŒλŠ” κ·Έλž˜ν”„ μƒμ˜ λͺ¨λ“  였브젝트의 아이덴티티와 λ‹€λ₯Έ μ˜€λΈŒμ νŠΈμ™€μ˜ 관계λ₯Ό μ „λΆ€ μ €μž₯ν•©λ‹ˆλ‹€.

 

Unarchived  λ  λ•Œ, μž¬κ΅¬μ„±λœ Object graph λŠ” λͺ‡κ°€μ§€ μ˜ˆμ™Έμ‚¬ν•­μ„ μ œμ™Έν•˜κ³  λͺ¨λ“  관계λ₯Ό μ •ν™•νžˆ λ³΄μ‘΄ν•˜κ³  μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.

 

우리의 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ•„μΉ΄μ΄λΈŒλ₯Ό 데이터 λͺ¨λΈμ˜ μ €μž₯μ†Œλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

 

μš°λ¦¬λŠ” λ°μ΄ν„°μ˜ μ €μž₯을 μœ„ν•œ νŠΉλ³„ν•œ ν˜•μ‹μ„ 직접 λ”°λ‘œ 섀계할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

 

λŒ€μ‹  Cocoa μ—μ„œ 이미 κ΅¬ν˜„ν•΄λ†“μ€ 도ꡬ듀을 μ‚¬μš©ν•˜μ—¬ μ˜€λΈŒμ νŠΈλ“€μ„ λ°”λ‘œ 아카이빙 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

아카이빙을 μ§€μ›ν•˜κΈ° μœ„ν•΄μ„œ, μ˜€λΈŒμ νŠΈλŠ” NSCoding ν”„λ‘œν† μ½œμ„ μ±„μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

이 ν”„λ‘œν† μ½œμ€ 이전 κΈ€μ—μ„œ μžμ„Έν•˜κ²Œ μ„€λͺ…ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

:: 이전 κΈ€ : [iOS] NSCoding μ΄λž€?

 

Foundation 의 λͺ¨λ“  value objects (NSString, NSArray, NSNumber, and so on) λŠ” NSCoding 을 μ±„νƒν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ’‘μ°Έκ³ 

μžμ„Ένžˆ μ•Œ ν•„μš”λŠ” μ—†μ§€λ§Œ, value object λž€ string, number, date 와 같은 λ‹¨μˆœν•œ νƒ€μž…μ„ 클래슀둜 λž˜ν•‘ν•œ ν˜•μ‹ 이라고 ν•©λ‹ˆλ‹€. Objective-C의 κ°œλ…μž…λ‹ˆλ‹€. (μ•ŒκΈ°λ‘œ Obj-C μ—λŠ” ꡬ쑰체가 μ—†μŒ)


 

Serializations ( 잘 이해 가지 μ•ŠλŠ” 뢀뢄이 있음 πŸ€”)

Serialization 은 value object의 λ‹¨μˆœν•œ κ³„μΈ΅λ§Œ μ €μž₯을 ν•˜λŠ”λ°, 였브젝트의 κ°’κ³Ό κ³„μΈ΅μ—μ„œμ˜ μœ„μΉ˜λ§Œ μ €μž₯ν•©λ‹ˆλ‹€.

 

Array 와 Dictionary 같은 λ‹¨μˆœν•œ 계측 ꡬ쑰, Propery List λŠ” 이 두 개의 μ»¬λ ‰μ…˜μ„ ν¬ν•¨ν•˜μ—¬  Bool, Data, Date, String, Number ν˜•μ‹λ§Œ μΆ”κ°€ κ°€λŠ₯ν•˜λ‹€. μ„ ν˜• μˆœν™˜ λ“±μ˜ λ³΅μž‘ν•œ 계측 ꡬ쑰가 λ‚˜μ˜¬ 수 μ—†μŒ.

 

Serialization 의 λŒ€ν‘œμ μΈ μ˜ˆλ‘œλŠ” Property lists κ°€ μžˆμŠ΅λ‹ˆλ‹€.

 

info.plist

예λ₯Ό λ“€μ–΄ μ•±μ˜ 속성은 Info.plist 에 μ €μž₯되고, μ‚¬μš©μžμ˜ μ„€μ •λ‚΄μš© 같은 것은 property lists 에 μ €μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Multiple references to the same value object might result in multiple objects when deserialized.

 

가변성은 μ €μž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

 

 

끝!


πŸ€–πŸŸ’[우짱의 iOS λΈ”λ‘œκ·Έ]πŸ”΅πŸ’»

iOSλ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

참고 자료: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Archiving/Articles/objectgraphs.html