๊ณต๋ถ€ ์—ฐ์Šต์žฅ :-)

TIL_20180326 ~ 20180331

|

2018.03.26

  • ์žํŒ๊ธฐ 3๋‹จ๊ณ„ ์Šคํ…
    • UserDefaults
    • ์•„์นด์ด๋น™๊ตฌํ˜„: NSCoding
      • NSCodingํ”„๋กœํ† ์ฝœ์„ ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ History๋ฅผ class๋กœ ๋ณ€๊ฒฝํ•จ
      • encoding์ด ํ•„์š”์—†๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ผ๋ฉด NSCoding ํ”„๋กœํ† ์ฝœ ํ•„์ˆ˜ ๋ฉ”์„œ๋“œ๋งŒ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์„ ํ•˜์ง€ ์•Š์•„๋„ ๋จ. (๋””๋ฒ„๊ทธ๋กœ ์ฐ์–ด๋ณด๋ฉด encoding์‹œ๋„๋ฅผ ํ•˜์ง€๋งŒ ๋นˆ ๊ฐ’๋งŒ ๋“ค์–ด๊ฐ€๋Š”๋“ฏ)
  • escaping closure?
  • ์ƒ์† - super.init() : ์Šค์œ„ํ”„ํŠธ์˜ ์ƒ์†๊ด€๊ณ„๋Š” ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์ž๊ธฐ ์ž์‹ ์„ ์ดˆ๊ธฐํ™” ํ•˜๊ณ  super.init()์„ ๋ฐ˜๋“œ์‹œ ์™„๋ฃŒํ•ด์•ผ
  • joined() - flatten: [[Beverage]] ์ด์ค‘๋ฐฐ์—ด์„ reduce()๋ฅผ ํ†ตํ•ด ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋งŒ๋“ค๋ ค๊ณ ํ•˜๋‹ˆ๊นŒ ์ ‘๊ทผ์ด ์•ˆ๋จ (ambiguous ์—๋Ÿฌ) joined()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ผ๋ฐ˜ 1์ฐจ์›๋ฐฐ์—ด๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  reduce()์ ์šฉํ•จ

2018.03.27

  • ์–ด์ œ ํ•œ ๋ถ€๋ถ„ ์ •๋ฆฌ: joined() / flatmap, reduce
    • joined()
      • sequence๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ฝœ๋ ‰์…˜์— ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ
      • ์ˆœ์„œ๋Œ€๋กœ, ์—ฐ์†๋˜๊ฒŒ ์ด์–ด์ง„ ์ฝœ๋ ‰์…˜ ๋ฆฌํ„ด
      • ๋‹ค์ˆ˜์˜ ์ฝœ๋ ‰์…˜์˜ element๋“ค์„ ์—ฐ์†์œผ๋กœ ์ด์–ด์คŒ(?): ์ด์ค‘๋ฐฐ์—ด.joined()๋ฅผ ํ–ˆ๋”๋‹ˆ 1์ฐจ์›๋ฐฐ์—ด๋กœ ๋ฆฌํ„ด๋๋Š”๋ฐ, FlattenBidirectionalCollection<Array<Element>>๊ฐ€ ๋ฆฌํ„ด๋จ.
      • FlattenBidirectionalCollection - Supporting types
  • ์ƒ์†!!!
  • ์•„์นด์ด๋น™ ์ธ์ฝ”๋”ฉ ๋””์ฝ”๋”ฉ ํ•œ ๋ถ€๋ถ„์—์„œ forced unwrapping์—†์• ๊ธฐ
  • DIP ์˜์กด์„ฑ, ์˜์กด์„ฑ์—ญ์ „
  • ์‹ฑ๊ธ€ํ†ค
  • init(): ์ง€์ •์ƒ์„ฑ์ž ๋‚ด์—์„œ ์ง€์ •์ƒ์„ฑ์ž๋ฅผ ๋˜ ํ˜ธ์ถœํ•˜๋ฉด ์ฐธ์กฐ ์—๋Ÿฌ ๋ฐœ์ƒ: ์•„๋ž˜ ์˜ˆ์‹œ์ฝ”๋“œ
class VendingMachine: NSObject, NSCoding {
    static var sharedInstance = VendingMachine()

    private override init() {
        super.init()
        VendingMachine.sharedInstance = VendingMachine(stockItems: Controller().setVendingMachineStock(unit: 1))
    }
  • Override: NSObject์ƒ์†๋•Œ๋ฌธ์— ํ‚ค์›Œ๋“œ ํ•„์š”, super.init()๋„
  • super.init(): ์Šค์œ„ํ”„ํŠธ ์ƒ์†์—์„œ ์„œ๋ธŒํด๋ž˜์Šค์˜ ์ดˆ๊ธฐํ™”๋Š” ๋ณดํ†ต ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋‹ค ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๋งˆ์ง€๋ง‰์— super.init()์„ ํ•ด์ฃผ๋ฉด ์ƒ์† ๊ด€๊ณ„์—์„œ ๋‚˜ ์ž์‹ (์„œ๋ธŒ)๊ณผ ์Šˆํผ์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๋๋‚˜๊ณ  ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ๋‹ค.
  • sharedInstance๋ณ€์ˆ˜์— VendingMachine()์˜ ์ดˆ๊ธฐํ™”๋ฉ”์„œ๋“œ(private override init())๋ฅผ ํ†ตํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋ ค๊ณ  ํ•˜๋Š”์ค‘์—, (locking์ด ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ธ๊ฒƒ๊ฐ™์Œ) ๊ทธ init()์•ˆ์—์„œ VendingMachine.sharedInstance = VendingMachine(stockItems: Controller().setVendingMachineStock(unit: 1))ํ•˜๋ฉด์„œ VendingMachine์˜ ์ง€์ •์ƒ์„ฑ์ž init(stockItems:)๊ฐ€ ํ˜ธ์ถœ๋˜๋‹ˆ๊นŒ ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋“ฏ. (์—๋Ÿฌ๋ฉ”์‹œ์ง€: Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0))

2018.03.28

  • ์‹ฑ๊ธ€ํ†ค๊ฐ์ฒด ์‚ฌ์šฉํ•˜๊ณ  ์•„์นด์ด๋น™ ์•ˆ๋˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ณ  ์žํŒ๊ธฐ step4 PR
  • ์‹ฑ๊ธ€ํ†ค๊ณผ ์•„์นด์ด๋น™ ๋ฌธ์ œ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ• ์ •๋ฆฌ
  • ์žํŒ๊ธฐ step4 ๋จธ์ง€~!
  • ์˜ต์ €๋ฒ„ํŒจํ„ด ๊ธฐ์ดˆ์ ์ธ ๊ฒƒ ์กฐ์‚ฌํ•จ
    • keyword: addObserver, postNotification

2018.03.29

  • ์งˆ๋ฌธ๊ฑฐ๋ฆฌ: ํƒ€์ž…๋ฉ”์†Œ๋“œ์˜ ์œ ํšจ ์‹œ์ , ์–ด๋–ค ๊ฒƒ ์ƒ์„ฑ ํ›„๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ •ํ™•ํ•œ ๋œป
  • ์•ฑ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๋ณ€์ˆ˜ ์ƒ์„ฑ์‹œ์ ๊ณผ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์˜ viewDidLoad์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ ‘๊ทผํ• ๋•Œ์˜ ์‹œ์  ์ฐจ์ด. appDelegate์—์„œ๋Š” ๋กœ๋“œ๋  ์žํŒ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋กœ ์‹ฑ๊ธ€ํ†ค๊ฐ์ฒด๋ฅผ ๋ฐ”๊ฟ”์คฌ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ viewDidLoad์—์„œ ์ ‘๊ทผํ•œ appDelegate๋ณ€์ˆ˜๋Š” ์ดˆ๊ธฐ ๋นˆ ์žํŒ๊ธฐ ๊ฐ’์ด์—ˆ์Œ.

  • ์‹ฑ๊ธ€ํ†ค ์ ์šฉํ•˜๋ฉด์„œ ์ฒซ๋ฒˆ์งธ ์ฝ”๋ฉ˜ํŠธ์งˆ๋ฌธ๊ฑฐ๋ฆฌ JKโ€™s comment: ์œ„์—์„œ sharedInstance๋กœ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์•„๋ž˜ DataStorage์—์„œ loadํ•ด์„œ self.vending ๋งŒ ๋ฐ”๊พธ๋ฉด ๋‹ค๋ฅธ ๊ณณ์—์„œ sharedInstance์— ์ ‘๊ทผํ•˜๋ฉด ์•ˆ๋˜์ง€ ์•Š๋‚˜์š”? ์‹ฑ๊ธ€ํ†ค ์˜๋ฏธ๊ฐ€ ์žˆ๋‚˜์š”?
  • ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ ‘๊ทผ ํ•œ๋‹ค: ์‹ฑ๊ธ€ํ†คํŒจํ„ด์€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ธ๋ฐ, AppDelegate๊ฐ์ฒด(์™ธ๋ถ€)์—์„œ VendingMachine.sharedInstance = loadData์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ’์„ ์ง์ ‘ ๋ฐ”๊พธ๋Š”๊ฒƒ์ด ๋ฌธ์ œ?

  • ํ•˜์ง€๋งŒ static์ด๋ผ๋Š”๋œป์€ ์ „์—ญ๋ณ€์ˆ˜, ๋ชจ๋“  ๊ฐ์ฒด๋“ค์ด ๊ทธ ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ฐ”๋ผ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ(?)๋งŒ๋“ค์–ด๋†“๊ณ  ์ •์ž‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ํ•ด์•ผํ•œ๋‹ค๋Š” ๋œป์ด๋ž€?ใ… ใ… 
  • ์ „์—ญ๋ณ€์ˆ˜ ์Šค์Šค๋กœ load๋œ ์žํŒ๊ธฐ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐํ•˜๋Š” ๊ฒƒ๊ณผ appDelegate๊ฐ์ฒด์—์„œ ์„ ์–ธ๋œ self.vending = sharedInstance์˜ self.vending์„ ๋ฐ”๊ฟ”์น˜๊ธฐํ•˜๋Š” ๊ฒƒ์˜ ์ •ํ™•ํ•œ ์ฐจ์ด

TIL

  • ์˜ต์ €๋ฒ„ํŒจํ„ด ๊ตฌํ˜„

  • ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ• ๋•Œ sharedInstance๊ฐ€ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด์ธ์ค„ ์•Œ๊ณ  ์กฐ๊ธˆ ํ—ค๋งธ๋Š”๋ฐ ๊ทธ๋ƒฅ ๋ณ€์ˆ˜๋ž‘ ๋˜‘๊ฐ™์ด ์–ด๋–ค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋‹ˆ๊นŒ ์ดํ•ดํ•˜๊ธฐ ํŽธํ–ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์–ด๋””์— ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ์ฐธ์กฐํ•ด๋†“๊ณ  ๋˜ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์— ์ฐธ์กฐํ•ด์„œ ์“ฐ๊ณ ์žˆ์œผ๋‹ˆ๊นŒ ๋‹ค๋ฅธ ์žํŒ๊ธฐ ๊ฐ์ฒด๋ฅผ ๋‘๊ฐœ ๋งŒ๋“ค๊ณ  ๋”ฐ๋กœ ์ž‘์—…ํ•˜๊ณ  ๋”ฐ๋กœ ์ €์žฅํ•˜๊ณ ์žˆ์—ˆ์Œ..
  • static๋ณ€์ˆ˜๋„ ์ฐธ์กฐ๋ฅผ ํ•˜๋Š” ๋ณ€์ˆ˜์ผ๋ฟ์ด๋‹ค!
  • ์žํŒ๊ธฐ ์˜ต์ €๋ฒ„ํŒจํ„ด pr๋ณด๋ƒ„

2018.03.30

  • ์žํŒ๊ธฐ step5 ์˜ต์ €๋ฒ„ํŒจํ„ด ๊ตฌํ˜„์ค‘~_~
  • MVC๋ฅผ ์ž˜ ๋ถ„๋ฆฌํ•˜๊ณ  ์˜ต์ €๋ฒ„ํŒจํ„ด์ ์šฉํ•˜๋Š” ๊ตฌ์กฐ์งœ๊ธฐ
  • ์˜ต์ €๋ฒ„ ํŒจํ„ด ์—ฌ๋Ÿฌ ์˜ˆ์‹œ ์ฐพ๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์กฐ์‚ฌ
  • AdminModeํ”„๋กœํ† ์ฝœ๊ณผ UserModeํ”„๋กœํ† ์ฝœ ๋‘˜๋‹ค ๋งŒ์กฑํ•˜๋Š” ํ”„๋กœํ† ์ฝœ ๋งŒ๋“ค๊ธฐ
    • ํ˜„์žฌ๋Š” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋‘ ๋ชจ๋“œ ๋‹ค ์„ž์—ฌ์žˆ๋Š” ๋ฐฉ์‹์ธ๋ฐ, ์ถ”ํ›„ admin๊ณผ UserMode๋ฅผ ๋ถ„๋ฆฌํ•œ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ• ๊ฒƒ์ž„
    • AdminMode ์ „์šฉ ๋™์ž‘์„ ๊ตฌํ˜„ํ•œ ํ”„๋กœํ† ์ฝœ
    • UserMode ์ „์šฉ ๋™์ž‘์„ ๊ตฌํ˜„ํ•œ ํ”„๋กœํ† ์ฝœ
    • ๋‘ ํ”„๋กœํ† ์ฝœ์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ์ƒ์œ„ํ”„๋กœํ† ์ฝœ
    • ๊ทธ ์ƒ์œ„ ํ”„๋กœํ† ์ฝœ์„ ๋งŒ์กฑํ•˜๋Š” VendingMachine
    • ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์— ์žˆ๋Š” vendingMachine์„ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ์ƒ์œ„ํ”„๋กœํ† ์ฝœํƒ€์ž…์œผ๋กœ ์„ ์–ธ
    • ์•ฑ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ์—์„œ ์„ ํƒํ•œ ๋ชจ๋“œ์— ๋งž๋Š” ํ”„๋กœํ† ์ฝœ์„ VendingMachine์„ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์ง€์ •ํ•ด์คŒ

2018.03.31

  • ๋ฌธ์ œ: ์žํŒ๊ธฐ ๊ตฌ๋งค๋™์ž‘์ด ์•„์˜ˆ ์•ˆ๋˜๋Š” ๋ฌธ์ œ
    • ์›์ธ: vending๋ถ€ํ„ฐ stockController, shelf๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ.
    • ํ•ด๊ฒฐ: shelf๊ฐ€ ์•„์นด์ด๋น™์ด ๋”ฐ๋กœ ์•ˆ๋จ. ๋””์ฝ”๋”ฉ ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„์˜ˆ ๋น„์–ด์žˆ์—ˆ์Œ. ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์žํŒ๊ธฐ ์ง„์—ด ์ˆœ์„œ๋Œ€๋กœ itemTags๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์คŒ
  • ๋ฌธ์ œ: ๊ตฌ๋งค๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋Š”๋ฐ ๋‹ค๋ฅธ ์Œ๋ฃŒ๊ฐ€ ๊ตฌ๋งค๋˜๋Š” ๋ฌธ์ œ;;
    • ์›์ธ: ๋””์ฝ”๋”ฉํ•˜๋ฉด์„œ shelf๊ฐ€ ๊ฐ€์ง„ itemTags๊ฐ€ viewController์— ์žˆ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€์•Š๊ณ  stock์ด ์ดˆ๊ธฐํ™”๋˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€œ. ์ฆ‰ shelf๊ฐ€ ์•„๋‹ˆ๋ผ stock์˜ ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ’ ์ˆœ์„œ๊ฐ€ ์ ์šฉ๋ผ์„œ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ˆœ์„œ์™€ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ์Œ๋ฃŒ๊ฐ€ ๋ฆฌํ„ด๋œ ๊ฒƒ
    • ํ•ด๊ฒฐ : add๋‚˜ buy์ฒ˜๋Ÿผ ์žฌ๊ณ ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๋™์ž‘ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์— self.inventory = self.inventory.update(other: newItemSet) ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด ๋งค๋ฒˆ stock์— ์žˆ๋Š” inventory์ˆœ์„œ๋Œ€๋กœ shelf ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด์„œ, ๋””์ฝ”๋”ฉํ• ๋•Œ ์ง€์ •ํ•ด์ค€ itemtags๊ฐ€ ๊ณ„์† ์—…๋ฐ์ดํŠธ ๋œ ๋ฌธ์ œ๋กœ, ์ผ๋‹จ update๋ ๋•Œ๋งˆ๋‹ค shelf๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜์ง€ ์•Š๊ธฐ๋กœํ•จ
    • ๊ณ ๋ฏผํ•  ๋ฌธ์ œ:
      • ์ฝ˜์†”์—์„œ๋Š” stock์ด๋‚˜ shelf๋ฅผ ์ดˆ๊ธฐํ™”ํ• ๋•Œ ๋จผ์ € [Beverage]๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์ดˆ๊ธฐํ™”๋ฉ”์„œ๋“œ์—์„œ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ”๊พผํ›„ shelf๊นŒ์ง€ ์ดˆ๊ธฐํ™”ํ–ˆ๊ธฐ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋ ๋•Œ๋‚˜ ํ•œ ์•„์ดํ…œ shelf๊ฐ€ ์•„์˜ˆ ๋น„์–ด๋ฒ„๋ ธ์„๋•Œ ์•„์ดํ…œ ์ง„์—ด ์ˆœ์„œ(key)๊ฐ€ ๋ฐ”๋€Œ์—ˆ์—ˆ๋Š”๋ฐ ์ง€๊ธˆ์€ viewController์—์„œ ์ง€์ •ํ•ด๋†“์€ ์ˆœ์„œ๊ฐ€ ์žˆ์œผ๋‹ˆ ์ง€์ •ํ•œ ์ˆœ์„œ๋Œ€๋กœ๋งŒ ๋”•์…”๋„ˆ๋ฆฌ์™€ shelf๊ฐ€ ๊ตฌ์„ฑ๋˜๊ฒŒ ๋ฐ”๊ฟ”์•ผํ• ๋“ฏ
      • ์ด๋ ‡๊ฒŒ๋˜๋ฉด shelf๋ฅผ ๋””์ฝ”๋”ฉํ•˜๊ฑฐ๋‚˜ ์ดˆ๊ธฐํ™”ํ• ๋•Œ ํ•˜๋“œ์ฝ”๋”ฉ์„ ์•ˆํ•ด๋„๋ ๋“ฏ
      • ๋˜ํ•œ ์žฌ๊ณ ๊ฐ€ 0๊ฐœ์ธ ์•„์ดํ…œ key๋ฅผ ์ง€์šฐ๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ key๋Š” ๋†”๋‘๊ณ  ์žฌ๊ณ ๊ฐ€ 0์ธ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ• ๋“ฏ
  • ์งˆ๋ฌธ๊ฑฐ๋ฆฌ

Comments