ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] Object Graphs 와 Archives, 그리고 Serialization
    iOS/🍎 Documentation 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

     

    λŒ“κΈ€

μ–΄μ œλ³΄λ‹€ λ°œμ „ν•œ λ‚˜