๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS

[iOS] ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ(View Controller)์˜ ์ƒ๋ช… ์ฃผ๊ธฐ

by ํ‹ด๋”” 2020. 8. 21.
728x90
๋ฐ˜์‘ํ˜•

Animation ๊ณต๋ถ€ํ• ๋ ค๊ณ  ๋ณด๋‹ˆ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋”๋ผ๊ตฌ์š”! ๋ทฐ ๋œจ์ž๋งˆ์ž ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€๋ฐ ์ƒ๋ช… ์ฃผ๊ธฐ ๊ด€๋ จ๋œ ์ฝœ๋ฐฑ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋งŽ์•„์„œ ์–ด๋””์— ๋„ฃ์œผ๋ฉด ์ข‹์„ ๊นŒ ํ•˜๋‹ค๊ฐ€ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ์ •๋ฆฌํ•ด ๋ดค์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค... ์ด์ „์— ์˜ต์ ์”จ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์Šฌ์ฉ ์•Œ๊ณ  ์žˆ๊ธฐ๋Š” ํ•œ๋ฐ ์ •๋ฆฌํ•ด๋‘๋ฉด ๋‚˜์ค‘์— ๊ธฐ์–ต์ด ์•ˆ๋‚ ๋•Œ ์ฐธ๊ณ ํ•˜๋ ค๊ณ  ์ ์–ด๋ด…๋‹ˆ๋‹ค.. 


๐ŸŒต์‹คํ—˜ํ•ด๋ณด๊ธฐ

์Šคํ† ๋ฆฌ ๋ณด๋“œ์— ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋‹ค๋ฅธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ด๋™ํ•˜๋„๋ก ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

(์Šคํ† ๋ฆฌ ๋ณด๋“œ ์‚ฌ์šฉํ•œ์ง€ ์–ผ๋งˆ ์•ˆ๋˜์„œ.. ์Šค๋ฆฐ์ด ์ž…๋‹ˆ๋‹ค)

 

SubViewController.swift ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค

 

์ด๋™ํ•  ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ  ์„ ํƒํ•ด ์ฃผ์‹œ๊ณ 

 

identity ์ธ์ŠคํŽ™ํ„ฐ์—์„œ class๋ฅผ ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ ์Šค์œ„ํ”„ํŠธ ํŒŒ์ผ๊ณผ ๋™์ผํ•œ ํŒŒ์ผ๋ช…์„ ์ ์–ด ์ค๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ปค์Šคํ…€ ํด๋ž˜์Šค๋„ ViewController๋ฅผ ์ ์–ด ์—ฐ๊ฒฐ ์‹œ์ผœ ์ค๋‹ˆ๋‹ค.

import UIKit

class ViewController: UIViewController {
    
    override func loadView() {
        super.loadView()
        print("view load view")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        print("view did load")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("view Will Appear")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("view did appear")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("view will disappear")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("view did disappear")
    }
    
    deinit {
        print("์ฒซ ๋ฒˆ์งธ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ง€ ๋จ")
    }

}

 

ViewController.swift์— ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ์™€ ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š”

๋ฉ”์†Œ๋“œ๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ ์–ด ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

import UIKit

class SubViewController: UIViewController {
    
    override func loadView() {
        super.loadView()
        print("second view load view")
    }
    
    override func viewDidLoad() { 
        super.viewDidLoad()
        print("second view did load")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("second view Will Appear")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("second view did appear")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("second view will disappear")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("second view did disappear")
    }
    
    deinit {
        print("๋‘๋ฒˆ ์งธ ๋ทฐ์ปจ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ง€ ๋จ")
    }

}

  

์‹คํ–‰ํ•˜๊ณ  ๋นŒ๋“œํ•ด์ฃผ์„ธ์š”

 

ViewController ๊ฐ€ ๋กœ๋“œ๋˜๋ฉด

loadView() -> viewDidLoad() -> viewWillAppear() -> viewDidAppear() ์ˆœ์œผ๋กœ ํ˜ธ์ถœ ๋œ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋‘๋ฒˆ์งธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ทฐ๋ฅผ ๋„์šฐ๊ธฐ ์œ„ํ•ด ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ด…๋‹ˆ๋‹ค.

 

์ด ์—ญ์‹œ loadView() -> viewDidLoad() -> viewWillAppear() -> viewDidAppear() ์ˆœ์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค

์ฒซ๋ฒˆ์งธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ deinit์ด ํ˜ธ์ถœ ๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด์•„

ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง„๋‹ค๊ณ  ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ง€๋˜๋Š” ๊ฒƒ์€ ์•„๋‹Œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ฐ‘์œผ๋กœ ๋“œ๋ž˜๊ทธ ํ•ด์„œ ํ™”๋ฉด์—์„œ ๋‚ด๋ฆฌ๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด viewWillDisappear()์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค

๊ทธ ํ›„ ์™„์ „ํžˆ ํ™”๋ฉด์—์„œ ๋ณด์ด์ง€ ์•Š๊ฒŒ ๋˜๋ฉด viewDidDisappear() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ง€๋œ๊ฒƒ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค์‹œ ๋ฒ„ํŠผ ๋ˆŒ๋Ÿฌ ๋‘๋ฒˆ์งธ ๋ทฐ ํ™”๋ฉด์— ๋„์šด ๋’ค

 

๋‘๋ฒˆ์งธ ๋ทฐ๋ฅผ ์žก๊ณ  ๋‚ด๋ฆฌ๋‹ค๊ฐ€ ๋‹ค์‹œ ์˜ฌ๋ฆฌ๋ฉด

viewWillDisappear() ํ˜ธ์ถœ๋˜์—ˆ๋‹ค๊ฐ€

viewWillAppear() -> viewDidAppear()์ด ๋‹ค์‹œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ viewDidLoad()๋Š” ์ „์ฒด์— ๊ฑธ์ณ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

๋ฐ˜๋ฉด์— viewWillAppear()๋Š” ๋ทฐ๊ฐ€ ํ™”๋ฉด์— ๋ณด์—ฌ์งˆ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.


๐ŸŽ ์ •๋ฆฌ

๐Ÿ‘‡ ์ถœ์ฒ˜ ๋ฐ ์ฐธ๊ณ  ์‚ฌ์ดํŠธ 

 

์•ฑ ์ƒ๋ช…์ฃผ๊ธฐ(App Lifecycle) vs ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ์ƒ๋ช…์ฃผ๊ธฐ(ViewController Lifecycle) in iOS

iOS ์•ฑ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ์ƒ๋ช…์ฃผ๊ธฐ ์ดํ•ดํ•˜๊ธฐ

medium.com

 

iOS ํ™”๋ฉด ์ „ํ™˜

ํŠน์ดํ•˜๊ฒŒ ์ด ๋ถ€๋ถ„์€ ๊ณต๋ถ€ํ•˜๋”๋ผ๋„ iOS๊ฐœ๋ฐœ์„ ์‰ฌ๋ฉด ๋ฐฑ์ง€ํ™”๋˜๋”๋ผ๊ตฌ์š”. ์ € ์Šค์Šค๋กœ์—๊ฒŒ ๊ฐœ๋…์„ ๋‹ค์‹œ ์ƒˆ๊ธฐ๋ฉฐ ๋˜ ๋ณผ ์ผ์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์„œ ์ด๋ ‡๊ฒŒ ๊ธ€์„ ์”๋‹ˆ๋‹ค.

medium.com

 

Apple Developer Documentation

 

developer.apple.com

 

iOS ํ™”๋ฉด ์ „ํ™˜

ํŠน์ดํ•˜๊ฒŒ ์ด ๋ถ€๋ถ„์€ ๊ณต๋ถ€ํ•˜๋”๋ผ๋„ iOS๊ฐœ๋ฐœ์„ ์‰ฌ๋ฉด ๋ฐฑ์ง€ํ™”๋˜๋”๋ผ๊ตฌ์š”. ์ € ์Šค์Šค๋กœ์—๊ฒŒ ๊ฐœ๋…์„ ๋‹ค์‹œ ์ƒˆ๊ธฐ๋ฉฐ ๋˜ ๋ณผ ์ผ์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์„œ ์ด๋ ‡๊ฒŒ ๊ธ€์„ ์”๋‹ˆ๋‹ค.

medium.com

  loadView()  

- ํ™”๋ฉด์— ๋„์–ด์งˆ view๋ฅผ ๋งŒ๋“œ๋Š” ๋ฉ”์†Œ๋“œ -> nib ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ ์œผ๋กœ ๋ทฐ ๊ณ„์ธต์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ

- ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ view๋ฅผ ๋งŒ๋“œ๋Š” ์‹œ์ ์ด๋ฏ€๋กœ ๋ทฐ์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ์–ป์–ด์˜ฌ ์ˆ˜ ์—†์Œ

 

  viewDidLoad()  

- ๋ทฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ(๋กœ๋“œ)๋œ ์‹œ์  -> ๋ทฐ์— ๋Œ€ํ•ด ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ์–ป์–ด์™€ ์ถ”๊ฐ€์ ์ธ ์ž‘์—… ๊ฐ€๋Šฅ

- ์ƒ๋ช… ์ฃผ๊ธฐ ๋‚ด ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ

- outlet์ด ๋ฉ”๋ชจ๋ฆฌ์— ์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š” ์‹œ์ 

- ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๊ธฐ ์ „์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•ด์ฃผ๋Š” ์ฝ”๋“œ ๊ฐ€๋Šฅ

- ํ™”๋ฉด ๋กœ๋“œ ์ „ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฒ˜๋ฆฌํ•ด์ค„ ์ž‘์—…์„ ์œ„์น˜์‹œํ‚ด

 

  viewWillAppear()  

- ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๊ธฐ ๋ฐ”๋กœ ์ง์ „ -> ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ๋‚˜ํƒ€๋‚˜๊ธฐ ์ง์ „๋งˆ๋‹ค(๋‹ค๋ฅธ ํ™”๋ฉด ๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์˜ฌ ๋•Œ) ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„

- ๋ฐ์ดํ„ฐ์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ง

- window์˜ root view๊ฐ€ ๋ทฐ ๊ณ„์ธต์— ๋”ํ•ด์ง€๊ธฐ ์ง์ „ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ

 

  viewDidAppear()  

- ๋ทฐ๊ฐ€ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์™„์ „ํžˆ ํ‘œํ˜„๋˜๋Š” ์‹œ์ ์ด๋ฉฐ ์ด๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ

- ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ทธ๋ฆฌ๊ฑฐ๋‚˜ API์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋กœ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธ ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์— ๊ตฌํ˜„

- window์˜ root view๊ฐ€ ๋ทฐ ๊ณ„์ธต์— ๋”ํ•ด์ง„ ์ง ํ›„ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ

 

  viewWillDisappear()  

- ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๋ ค๋Š” ์‹œ์ ์— ํ˜ธ์ถœ๋จ

- ๋ทฐ ๊ณ„์ธต์—์„œ root view๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ง ์ „์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ

 

  viewDidDisappear()  

- ๋ทฐ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๊ณ  ๋‚˜์„œ ํ˜ธ์ถœ๋˜๋ฉฐ ๋ทฐ ๊ณ„์ธต์—์„œ ์ œ๊ฑฐ๋œ ์ง ํ›„ ํ˜ธ์ถœ

 

  deinit  

- ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง„๋‹ค๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ง€๋˜๋Š” ๊ฒƒ์€ ์•„๋‹˜

- ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ง€๋œ ์‹œ์ ์—์„œ ํ˜ธ์ถœ

 

๊ฒฐ๋ก  : ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋„ˆ๋ฌด ๋นจ๋ฆฌ ํ˜ธ์ถœ๋˜๋„ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ทฐ๊ฐ€ ํ‘œํ˜„๋˜๋Š” ์‹œ์ ์ธ viewDidAppear()์—์„œ ๋ทฐ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์„ ๋•Œ ๋œจ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค. 


๐ŸŽฎ UIViewController

์ •์˜

UIKit app์—์„œ ๋ทฐ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ

 

View Controller ์˜ ๋ฉ”์ธ ์—ญํ™œ

1. ๋ทฐ ์ปจํ…์ธ  ์—…๋ฐ์ดํŠธ

2. User Interaction์— ์‘๋‹ต

3. ์ „๋ฐ˜์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค ๋ ˆ์ด์•„์›ƒ ๊ด€๋ฆฌ

4. ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์™€์˜ ์กฐ์ •

 

ViewController type

1. Content view controller

    ใ„ด ์•ฑ์˜ ์ปจํ…์ธ  ์ผ๋ถ€๋ถ„์ด๋‚˜ ์ž์‹ ์˜ ๋ชจ๋“  ๋ทฐ๋“ค์„ ๊ด€๋ฆฌ

2. Container view Controller -> navigation view controller, tab bar view controller

   ใ„ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ œ์–ดํ•จ

 

View Management

- ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ทฐ๋Š” ์ง€์—ฐ ๋กœ๋”ฉ -> ํ•„์š”ํ•œ ์‹œ์ ์— ๋กœ๋”ฉ ๋จ

 

Specify the views for a view controller

1. ์Šคํ† ๋ฆฌ ๋ณด๋“œ ์‚ฌ์šฉ

- ์Šคํ† ๋ฆฌ ๋ณด๋“œ์— ์žˆ๋Š” view๋ฅผ ๊ตฌ์ฒดํ™” ํ•˜๋ฉฐ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์™€ ์ปค๋„ฅ์…˜ ๊ฐ€๋Šฅ

- instantiateViewController(withIdentifier:) 

 

2. Nib file ์‚ฌ์šฉ

- nib file์€ ์‹ฑ๊ธ€ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ทฐ ๊ตฌ์ฒดํ™” ๊ฐ€๋Šฅ 

- ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ„์˜ ์„ธ๊ทธ์›จ์ด ์ •์˜๋Š” ๋ถˆ๊ฐ€

- nib(nibName:bundle:) ๋ฉ”์†Œ๋“œ๋กœ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ ์œผ๋กœ ์ƒ์„ฑ ๊ฐ€๋Šฅ

- ๋ทฐ ์š”์ฒญ -> nib ํŒŒ์ผ๋กœ ๋ถ€ํ„ฐ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ๋กœ๋“œ

 

3. loadView() 

- ๋ทฐ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ๊ตฌํ˜„


>>> ํ‹€๋ฆฐ ๋‚ด์šฉ ์žˆ๋‹ค๋ฉด ๊ผญ ์ง€์  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๐Ÿ™

 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€