Jiseob Kim

iOS Developer

Swift - Alamofire์™€ Codable

21 Jul 2018 » Swift

์š”์ฆ˜ ์‹œ๋Œ€์—” ์•ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ†ต์‹ ์€ ํ•„์ˆ˜์ธ๋“ฏ ํ•˜๋‹ค. ์—ฌ๋Ÿฌ ๊ธฐ๊ธฐ๊ฐ„์˜ ๋™๊ธฐํ™”, ๊ฒฐ์ œ, ๋“ฑ๋“ฑ ํ†ต์‹ ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ถ„์•ผ๊ฐ€ ํ›จ์”ฌ ๋งŽ๋‹ค.

ํ•„์ž๋„ ๋งจ์ฒ˜์Œ ์‹œ์ž‘ํ–ˆ๋˜ Swift ์Šคํ„ฐ๋””์—์„œ ๋กœ์ปฌ ์•ฑ์„ ๋งŒ๋“ค์—ˆ์œผ๋‚˜ ํ†ต์‹ ์˜ ํ•„์š”์„ฑ์„ ๋Š๊ปด์„œ ์กธ์—… ์ž‘ํ’ˆ๋•Œ ํ†ต์‹ ์„ ํ•˜๋Š” ์•ฑ์„ ์‹œ๋„ ํ–ˆ์—ˆ์œผ๋ฉฐ, ์ทจ์—…์— ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์—ฌ๋‹ด์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์„œ html, php, MariaDB, ํฌํŠธํฌ์›Œ๋”ฉ ๋“ฑ๋“ฑ ๋ฐฐ์šฐ๋ ค๋‹ˆ ๋„ˆ๋ฌด ํž˜๋“ค์—ˆ๋˜ ๊ธฐ์–ต์ด ์žˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ง‘์— ์žˆ๋˜ NAS๋ฅผ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋ˆ๊ฐ’ํ•˜๊ฒŒ ์ด์šฉํ–ˆ์—ˆ๋‹ค.

๊ทธ๋•Œ Alamofire ๋ผ๋Š” ํ›Œ๋ฅญํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

CocoaPod์„ ์ด์šฉํ•ด์„œ ์„ค์น˜ํ–ˆ์œผ๋ฉฐ, ์„ค์น˜๋ฒ•์€ ์‹œ๊ฐ„์ด ๋œ๋‹ค๋ฉด ๋‚˜์ค‘์— ๋‹ค๋ค„๋ณด๊ธฐ๋กœโ€ฆ..

๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์‘๋‹ต๊ฐ’์„ ๋จผ์ € ๋ณด์ž. (์‘๋‹ต๊ฐ’) JSON ํ˜•ํƒœ์ด๋ฉฐ, ๊ฐ’์€ ๊ฐ„๋‹จํ•˜๊ฒŒ 3๊ฐœ๊ฐ€ ์˜จ๋‹ค.

  1. hp (String)
  2. name (String)
  3. age (Int)

๊ฐ„๋‹จํ•˜์ง€๋งŒ, ์ด๊ฒƒ์„ ์•ฑ์—์„œ ๋ฐ›์œผ๋ ค๋ฉด ์ฒ˜์Œ ์‚ฌ์šฉ์ž๋Š” ์—„์ฒญ๋‚œ ํ˜ผ๋ž€์ด ์˜จ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ๋žฌ๋‹ค.

Alamofire๋งŒ ์žˆ๋‹ค๋ฉด ์•„์ฃผ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์•ˆ์“ฐ๊ณ  ํ†ต์‹ ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ด๋‹ค๋ฉด ํŽธํ•ด์ง€๋Š”๊ฑด ์‚ฌ์‹ค! ์•„์ง ์‚ฌ์šฉ์„ ์•ˆํ•ด๋ดค๋‹ค๋ฉด ํ•œ๋ฒˆ์ฏค ์จ๋ณด๊ฒŒ ๋œ๋‹ค๋ฉด ์•„~ ์ด๋ ‡๊ฒŒ ์“ฐ๋Š”๊ฑฐ๊ตฐ! ํ•˜๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค.

  • ์ฃผ์˜: Alamofire๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜๋ถ€ํ„ฐ ์ง„ํ–‰

(์•ฑํ™”๋ฉด) ์ฒ˜์Œ ์ด๋ฏธ์ง€์— ๋ณด์•˜๋˜ ์ „ํ™”๋ฒˆํ˜ธ, ์ด๋ฆ„, ๋‚˜์ด๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์„œ ์œ„์˜ ์ด๋ฏธ์ง€์— ์•Œ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ค„ ๊ฒƒ์ด๋‹ค.

์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  1. ํ†ต์‹ ์„ ํ†ตํ•ด ๊ฐ’ ๋ฐ›์•„์˜ค๊ธฐ
  2. ๊ฐ€์ ธ์˜จ ๊ฐ’์—์„œ ํ•„์š”ํ•œ๊ฐ’ ๋นผ๋‚ด์˜ค๊ธฐ
  3. ๋นผ๋‚ด์˜จ๊ฐ’ ํ‘œ์ถœํ•˜๊ธฐ

** * ์ฃผ์˜์‚ฌํ•ญ (์•„๋ž˜์„œ ์ถ”๊ฐ€ ์„ค๋ช…) **

  1. Alamofire ํ†ต์‹ ์‹œ ๋น„๋™๊ธฐ๋กœ ์ง„ํ–‰๋จ์„ ์žŠ์œผ๋ฉด ์•ˆ๋œ๋‹ค.
  2. UI ๊ด€๋ จ ์ž‘์—…์€ ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค, Alamofire ํ†ต์‹ ํ•˜์—ฌ UI ๊ด€๋ จ ์ž‘์—…์ด ์ œ๋Œ€๋กœ ์•ˆ๋œ๋‹ค๋ฉด DispatchQueue.main.async๋ฅผ ์ด์šฉํ•ด์„œ ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ์—์„œ ๋น„๋™๊ธฐ๋กœ ์ง„ํ–‰ ์‹œ์ผœ๋ณด์ž.


1. ํ†ต์‹ ์„ ํ†ตํ•ด ๊ฐ’ ๋ฐ›์•„์˜ค๊ธฐ

์šฐ์„  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค์ž, ์ฝ”๋“œ๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•˜๋‹ค. ์‚ฌ์ง„์œผ๋กœ ์ฒจ๋ถ€!

์ฃผ์„์— ๋”ฐ๋ผ ์„ค๋ช…์„ ์ง„ํ–‰!

1. Alamofire importํ•˜๊ธฐ

๊ฐ€์žฅ ์ค‘์š”ํ•œ ์„ค์ •์ธ Alamofire๋ฅผ import ํ•ด์ค˜์•ผํ•œ๋‹ค! ์žŠ์ง€๋ง๊ธฐ

2. URL ์ •์˜

์ด๊ฑด ๋ณ„๋‹ค๋ฅธ ์„ค๋ช…์ด ํ•„์š”ํ•˜์ง€ ์•Š์„๋“ฏ ์‹ถ๋‹ค. ํ†ต์‹ ์„ ํ•˜๊ธฐ์œ„ํ•ด์„  ๋ˆ„๊ตฌ์—๊ฒŒ ์š”์ฒญ์„ ํ• ๊ฒƒ์ธ๊ฐ€๋Š” ๋‹น์—ฐํžˆ ํ•„์š”ํ•˜๊ธฐ์— URL์„ ์ •์˜ํ•ด์•ผํ•œ๋‹ค.

3. ์ „์†ก(request)

๋น„๋ก ํ•œ์ค„์ด์ง€๋งŒ ์ด๋ฒˆ์— ๊ธ€์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค. Alamofire ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์ฃผ๋ฉด ์ €๋ ‡๊ฒŒ ๋‹จ ํ•œ์ค„์— ์š”์ฒญ(request)์„ ํ•  ์ˆ˜์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์š”์ฒญ์ด๋ž€ ์ฃผ์†Œ์ฐฝ์—๋‹ค๊ฐ€ ํ•ด๋‹น URL์„ ์ž…๋ ฅํ–ˆ๋‹ค. ์ •๋„๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

(RESTFull API์˜ ๊ฒฝ์šฐ ์ถ”ํ›„ ๋ณ„๋„ ํฌ์ŠคํŒ… ์˜ˆ์ •)

4. ์‘๋‹ต(response) ์ฒ˜๋ฆฌ

์‘๋‹ต์ด๋ž€ 3์—์„œ ๋งํ•œ URL์„ ์ž…๋ ฅํ–ˆ๋‹ค๊ฐ€ ์ „์†ก(request)์ด๋ผ๋ฉด, ์ž…๋ ฅํ–ˆ์„๋•Œ ๋ฐ˜์‘(response)ํ•œ๊ฒƒ์ด ์‘๋‹ต๊ฐ’์ด๋‹ค.

์ดํ•ด๊ฐ€ ์ž˜์•ˆ๋œ๋‹ค๋ฉด, โ€œ๋‚ด๊ฐ€ ์ฃผ์†Œ์ฐฝ์— URL์„ ์ž…๋ ฅ(์š”์ฒญ)ํ–ˆ๋”๋‹ˆ ์œ„์™€ ๊ฐ™์€ ํ™”๋ฉด(์‘๋‹ต)์ด ๋‚˜์™”๋‹คโ€ ์ •๋„๋กœ?? ์ƒ๊ฐํ•˜์ž.

๊ทธ๋ ‡๋‹ด ์—ฌ๊ธฐ์„œ doNetwork ๋’ค์˜ responseJSON์ด๋ž€ ??

์œ„์˜ ์ด๋ฏธ์ง€๋Š” JSON ํ˜•ํƒœ๋กœ ์‘๋‹ต์„ ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— responseJSON์„ ์จ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ”๋กœ๋’ค์— ์ค‘๊ด„ํ˜ธ๊ฐ€ ์žˆ๋‹ค. ์ด๊ฑด ํด๋กœ์ ธ ๊ตฌ๋ฌธ์ด๋‹ค. ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜์—๋Š” ์†Œ๊ด„ํ˜ธโ€™()โ€™์•ˆ์— ์ธ์ž๊ฐ’๋“ค์ด ์žˆ๋‹ค. โ€˜inโ€™ ์•ž์— ๋ถ€๋ถ„์ด ์ธ์ž๊ฐ’์ด๋‹ค. ๋‹ค์‹œ๋งํ•ด ์‘๋‹ตํ•œ ๊ฐ’์€ response๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด์•„์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. โ€˜inโ€˜์ดํ›„์— ๋‚˜์˜ค๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜์—์„œ ์ค‘๊ด„ํ˜ธโ€™{}โ€™ ์— ํ•ด๋‹น๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. **

์ด ๋ถ€๋ถ„์€ ์—„๋ฐ€ํžˆ ๋”ฐ์ง€๋ฉด response ๋ฐ์ดํ„ฐ๊ฐ€ ์ € JSON๋งŒ์„ ์˜๋ฏธํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค.

์•„ ๊ทธ๋Ÿฐ๊ฑฐ๊ตฌ๋‚˜ ์ •๋„๋งŒ ์ผ๋‹จ ์ƒ๊ฐํ•˜๊ณ , ์•„๋ž˜์„œ ์ถ”๊ฐ€ ์„ค๋ช…

5. ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ switch๋ฌธ

๋ช…ํ™•ํžˆ ์–˜๊ธฐํ•˜๋ฉด response๋Š” JSON ๋ฌธ๊ตฌ๋ฅผ ์˜๋ฏธํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋‹ค์Œ ํŒ๋ณ„ ํ•ด์•ผํ• ๊ฒƒ์€ ๋‚ด๊ฐ€ ์š”์ฒญํ•œ ํ†ต์‹ ์ด ์„ฑ๊ณต or ์‹คํŒจ๋ฅผ ๋จผ์ € ๋”ฐ์ ธ์•ผํ•œ๋‹ค. ์‹คํŒจ์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค, ์ •ํ™•ํ•˜์ง€์•Š์€ URL, ์ธํ„ฐ๋„ท ๋Š๊น€ ๋“ฑ๋“ฑ?

์„ฑ๊ณต์— ์˜๋ฏธ๋Š” ์œ„์˜ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์™”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ๋ชป๊ฐ€์ ธ ์˜จ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ์‹คํŒจ๋กœ ์ƒ๊ฐํ•˜์ž!

response.result ์— ๋Œ€ํ•ด ์ข€ ๋” ๊นŠ์ˆ™ํžˆ ๋“ค์–ด๊ฐ€๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์šฐ์„  ํƒ€์ž…์€ enum์ด๋‹ค, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ผ€์ด์Šค๋Š” 2๊ฐ€์ง€๋‹ค

  1. success
  2. failure

๊ทธ๋ž˜์„œ ์œ„์—์„œ switch๋ฌธ์„ ์ผ์„๋•Œ 2๊ฐ€์ง€๋งŒ ์จ๋„ โ€œdefault์ผ ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜์„ธ์š”โ€๋ผ๋Š” ๊ฒฝ๊ณ ๋ฅผ ์•ˆ๋„์šด๋‹ค.

  1. isSuccess๋Š” ์„ฑ๊ณต ์—ฌ๋ถ€
  2. isFailur๋Š” ์‹คํŒจ ์—ฌ๋ถ€
  3. value๋Š” ๋ฐ›์•„์˜จ ๊ฐ’
  4. error๋Š” Error ํƒ€์ž…

์ด ๋‘˜์ค‘ ํ•œ๊ฐ€์ง€๋Š” nil์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ต์…”๋„์œผ๋กœ ๊ฐ์‹ธ์ ธ์žˆ๋‹ค.

ํ•„์š”ํ• ๋•Œ ์•Œ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ๊ฑด success์˜ value์ด๋‹ค.

5-1. ํ†ต์‹  ์„ฑ๊ณต

ํƒ€์ž…์„ ๋จผ์ €๋ณด์ž. Any ํ˜•ํƒœ์ด๋‹ค. ์™œ Any์ผ์ง„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ฐ„๋‹จํ•˜๋‹ค.

๊ทธ๋Ÿผ ์‹คํ–‰์„ ํ•ด๋ณด์ž ์ฝ˜์†”์ฐฝ์— ๋ณด๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์™”๋‹ค. ์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ด ๊ฐ’์˜ ํƒ€์ž…์€ Any์ด๋‹ค. NSDictionary๋กœ ์บ์ŠคํŒ…์„ ๋จผ์ €ํ•ด์•ผํ•˜์ž.

NSDictionary ํƒ€์ž…์œผ๋กœ ์บ์ŠคํŒ… ํ›„ for๋ฌธ์œผ๋กœ ์ถœ๋ ฅํ•ด์ฃผ์—ˆ๋‹ค. ์•„์ฃผ ์ž˜๋‚˜์™”๋‹ค. ๋์ด ๋ณด์ธ๋‹ค.

๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋นผ์˜ค์ž. ๊ฐ๊ฐ ์ „ํ™”๋ฒˆํ˜ธ/์ด๋ฆ„/๋‚˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ฐ•์ œ ํ•ด์ œ (unwrapping) ํ•ด์ฃผ์—ˆ๋‹ค.

์–ด๋ ค์šด๋ง์ด๋‹ค. ์จ๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. ๊ทธ์น˜๋งŒ ํ•˜๋„ ์•ˆ์ผ๋”๋‹ˆ ๋‚˜๋„ ์–ด์ƒ‰ํ•˜๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด if๋ฌธ์„ ์จ์„œ ์•ˆ์ „๋นต์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์„ค์ •ํ•ด์คฌ๋‹ค.

๋‹ค์šด์บ์ŠคํŒ… ํ• ๋•Œ as?์„ ์จ์คŒ์œผ๋กœ์จ ์‹คํŒจ์‹œ nil๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋ ๊ฒƒ์ด๊ณ , ์ด ๊ฒฝ์šฐ์—” swift์—์„  ํ•ด๋‹น ๋ผ์ธ์„ ์‹คํ–‰ ์•ˆํ•œ๋‹ค๊ณ ํ•œ๋‹ค! ํ›Œ๋ฅญํ•ด.

์šฐ์„ , ํ†ต์‹  ํ•˜๊ธฐ์ „ ํ™”๋ฉด์„ ๋ณด์ž ๋ชป์ƒ๊ฒผ๋‹ค.

๊ทธ๋Ÿผ ํ†ต์‹  ํ›„! ๋ฒˆํ˜ธ/์ด๋ฆ„์€ ์ž˜๋“ค์–ด๊ฐ”๋‹ค. ๊ทธ์น˜๋งŒ ๋‚˜์ด๋Š” ์ ์šฉ์ด ์•ˆ๋˜์—ˆ๋‹ค.

ํ•ด๋‹น๋ถ€๋ถ„ ๊ฐ’์„ ์ถœ๋ ฅํ•ด๋ณด์ž.

์ƒˆ๋กœ ๋ฐฐ์šด ๊ธฐ์ˆ ์ด๋‹ค. ๋ธŒ๋ ˆ์ดํฌ ํฌ์ธํŠธ์— lldb(Low Level Debugger) ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด, ํ•ด๋‹น ๋ถ€๋ถ„ ๊ฐ€์„œ ์•Œ์•„์„œ ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์ค€๋‹ค. ํ•ด๋‹น ๋ช…๋ น์–ด ์ž…๋ ฅ๋ถ€๋ถ„ ์•„๋ž˜์— ์˜ต์…˜ ์ฒดํฌ๋ฅผ ํ•ด์ฃผ๋ฉด ์›๋ž˜๋Š” break ๊ฑธ๋ฉด ํ•ด๋‹น ๋ผ์ธ์—์„œ ๋ฉˆ์ถฐ์•ผํ•˜์ง€๋งŒ ๋ช…๋ น์–ด ์‹คํ–‰ ํ›„ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์ง„ํ–‰ํ•œ๋‹ค.

์•„์ง print ์ฐ๋Š”๊ฒŒ ํŽธํ•˜์ง€๋งŒ ์ž์ฃผ ์“ฐ๋Š”๊ณณ์— ๊ฑธ์–ด๋‘๋ฉด ํŽธํ•˜๋‹ค. disable ํ–ˆ๋‹ค๊ฐ€ On/Offํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋‹ˆ๊น!

๊ทธ๊ฒŒ ์ค‘์š”ํ•œ๊ฒŒ ์•„๋‹ˆ๊ณ , ์ฝ˜์†”์ฐฝ์— nil์ด ์ฐํ˜”๋‹ค.

์บ์ŠคํŒ…์ด ์‹คํŒจํ•œ๊ฒƒ์ด๋‹ค. response ์‚ฌ์ง„์„ ๋‹ค์‹œ ๋ณด์ž ์ž์„ธํžˆ๋ณด๋ฉด ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ์—๋Š” ์Œ๋”ฐ์˜ดํ‘œ(โ€œ โ€œ)๊ฐ€ ์žˆ์ง€๋งŒ, ๋‚˜์ด ๋ถ€๋ถ„์—” ์—†๋‹ค. ๋ฌธ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆซ์ž์ด๋‹ค. ์˜ต์…”๋„ ๊ฐ•์ œํ•ด์ œ ์˜€์œผ๋ฉด ์•ฑ์ด ํฌ๋ž˜์‰ฌ ๋‚ฌ์„ ๊ฒƒ์ด๋‹ค.

๋‹น์—ฐํ•œ๊ฑฐ์•„๋‹ˆ์•ผ? ํ• ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์†Œ์†Œํ•˜๊ฒŒ ์‹ค์ˆ˜ํ• ๋•Œ๊ฐ€ ์žˆ์—ˆ์—ˆ๋‹คโ€ฆ. ์‹ฌ์ง€์–ด ์ŠคํŽ ๋ง ํ‹€๋ฆด๊ฒฝ์šฐ๋„ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์žˆ๋‹ค! ํ•˜์ง€๋งŒ Codable๋ฅผ ์•Œ๊ฒŒ๋œ ํ›„๋ก  ์„ธ์ƒ ํŽธํ•ด์กŒ๋‹ค. ๊ถ๊ธˆํ•ด์ง€์ง€ ์•Š๋Š”๊ฐ€ Codable? ๋‚˜๋งŒ ๊ถ๊ธˆํ•œ๊ฐ€.

์ด์œ ๋Š” ์•Œ์•˜์œผ๋‹ˆ ์ผ๋‹จ ๊ณ ์น˜๊ณ 

์‹คํ–‰!

์™„์„ฑ!!

๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋ฌด๋ฆฌ ๋งŽ์•„๋„ ์ด์   ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ํ›จ~์”ฌ ๋งŽ๋‹ค. ์ด๊ฒƒ๋„ ํ•ด๋ณด์ž.

์šฐ์„  UI๋ถ€ํ„ฐ ๋งŒ๋“ค๊ณ ,

์Šฌ์Šฌ ์žฌ์•™์ด ์ผ์–ด๋‚  ๊ฒƒ ๊ฐ™์€ ์˜ˆ๊ฐ์ด ๋“œ๋Š”๊ฐ€?

์ฝ”๋“œ๋ฅผ ๋ณด์ž

์œ„์—์„œ ํ–ˆ๋˜ ๋ฐฉ์‹๋Œ€๋กœ ์ง„ํ–‰ํ•˜๋ฉด ์ด๋ ‡๋‹ค. ํ•˜๋Š”๊ฑด ์‰ฝ๋‹ค. ํ•˜๋Š” ๊ฒƒ๋งŒ ์‰ฝ๋‹ค. ๊ต‰์žฅํžˆ ๋ฐ˜๋ณต์ ์ด๋‹ค. ๋ณ„๋กœ๋‹ค.

๋ฐ์ดํ„ฐ๋Š” ์ž˜์™”๋‚˜?

์ž˜์™”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํž˜๋“ค๋‹ค. ์˜ˆ์‹œ๋กœ ์“ฐ๋Š”๊ฒƒ๋„ ํž˜๋“ค์—ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์“ฐ์ง€๋ง์ž

ํ•˜์ง€๋งŒ, ์‹ค์ œ ์—…๋ฌด์ƒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์ด ์˜ฌ๋•Œ๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์šฐ๋ฆฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผํ•œ๋‹ค.

์ด๋•Œ ์•„์ฃผ ํ›Œ๋ฅญํ•œ Codable์„ ์“ฐ๋ฉด ๋œ๋‹ค.

Codable

Codable์€ Swift4์—์„œ ์ถ”๊ฐ€๋œ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ ์‚ฌ์šฉํ•˜๊ธฐ์ „์—” ์œ„์—์ฒ˜๋Ÿผ ๋น„ํšจ์œจ์ ์ด์ง€๋งŒ ์–ด์ฉ”์ˆ˜์—†์ด ์‚ฌ์šฉ์„ ํ–ˆ์„๊ฒƒ์ด๋‹ค!(์ถ”์ธก), ์ด๊ฒƒ์„ ์•Œ๊ฒŒ๋œ๊ฑด letโ€™s Swift๋ผ๋Š” ์ปจํผ๋Ÿฐ์Šค? ์—์„œ์˜€๋‹ค. ์นด์นด์˜คํ†ก, ๋ผ์ธ, ํ† ์Šค ๋“ฑ๋“ฑ ๊ฐœ๋ฐœ์ž๋“ค์ด ์งง๊ฒŒ 20~30๋ถ„์”ฉ ๊ฐ•์—ฐ๋“ค์„ ํ–ˆ์—ˆ๋˜ ๊ฒƒ์ด์—ˆ๊ณ , ๋‚œ ํ•™์ƒ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๊ฐ’? ์ˆ˜์ค€์œผ๋กœ ๊ฐ”์—ˆ๋˜๊ฒƒ ๊ฐ™๋‹ค. ์ด๋•Œ ์˜†์ž๋ฆฌ๋ถ„์ด ์—ฌ๊ธฐ ์Šฌ๋ž™๋”ฐ๋กœ ์žˆ๋‚˜์š”? ํ–ˆ์„๋•Œ, ๋‹น์‹œ ๋‚˜๋Š” ์Šฌ๋ž™์„ ํ•œ๋ฒˆ๋„ ์•ˆ์จ๋ด์„œ ๋ชป์•Œ์•„ ๋“ค์—ˆ๋˜ ๊ธฐ์–ต์ด ๋‚œ๋‹ค. ๋˜ํ•œ, ํ† ์ŠคํŠธ๋Š” ๋ง›์žˆ์—ˆ๊ณ , ์˜ท๋„ ๋ฐ›๊ณ , ๋ฑƒ์ง€๋„ ๋ฐ›์•˜๋‹ค, ์Šค์œ„ํ”„ํŠธ ๋ฑƒ์ง€๋Š” ๋‚ด ๊ฐ€๋ฐฉ์— ๋‹ฌ๋ ค์žˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๊ฐ•์—ฐ์—๋Š” ์•„์ฃผ์•„์ฃผ ์ŠคํŽ˜์…œํ•œ๋ถ„์ด ๊ฐ•์—ฐ์„ ํ–ˆ์—ˆ๋Š”๋ฐ ๋ณด์•ˆ์ƒ? ๋น„๋ฐ€์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋„ ๋น„๋ฐ€์„ ์œ ์ง€ํ•˜๊ฒ ๋‹ค.

์•„๋ฌดํŠผ ๊ทธ๋•Œ, ์ฒซ๋ฒˆ์งธ ๊ฐ•์—ฐํ•˜์‹ ๋ถ„๊ป˜์„œ Swift4์˜ ์ƒˆ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ ์†Œ๊ฐœ๋ฅผ ํ•˜์…จ๊ณ , ๊ทธ๋•Œ ์กธ์ž‘์œผ๋กœ ํ•œ์ฐฝ ํ†ต์‹ ์— ๊ด€ํ•ด์„œ ์‹œ์ž‘ํ•˜๋ฉฐ ์‚ฝ์งˆํ•˜๋˜ ๋‚˜์—๊ฒŒ ๋‹จ๋น„๊ฐ™์€ Codable์„ ์†Œ๊ฐœํ•ด์ฃผ์…จ๋‹ค. ๋•๋ถ„์— ์•„์ฃผ ์ž˜์“ฐ๊ณ  ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๋‚˜๋„ ๊ธฐ๋Šฅ์˜ ์ „์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง„ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘” Struct ํ˜น์€ Class์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉฐ, ์‹ฌ์ง€์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฆ„์— ๋งž๊ฒŒ ๋„ฃ์–ด์ค€๋‹ค! ์•„์ฃผ ํ›Œ๋ฅญํ•˜๋‹ค. ์‚ดํŽด๋ณด์ž

์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  1. Class or Struct ์ƒ์„ฑ
  2. response๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ๋ณ€๊ฒฝ
  3. Codable ์ด์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
  • ์ธ์Šคํ„ด์Šค๋ž€? Class์™€ Struct๋Š” ์‹ค์งˆ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ตฌ์กฐ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์„ค๊ณ„๋„, ์ฃผํ‹€ ๋“ฑ๋“ฑ์œผ๋กœ ์„ค๋ช…์„ ํ•ด์ค€๋‹ค. ์„ค๊ณ„๋„๋กœ ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด, ๊ฐ€์ •์ง‘ ์„ค๊ณ„๋„(ํด๋ž˜์Šคor๊ตฌ์กฐ์ฒด)๊ฐ€ ์žˆ๋‹ค ๊ฐ€์ •ํ•˜์ž. ํ™”์žฅ์‹ค, ๋ฐฉ์ด ๊ทธ๋ ค์ ธ์žˆ๋‹ค. ๋‚ด๊ฐ€ ์ด ์„ค๊ณ„๋„์˜ ํ™”์žฅ์‹ค์— ๋“ค์–ด๊ฐ€๋Š” ํ–‰์œ„๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์™œ๋ƒ? ์ด๊ฑด ์„ค๊ณ„๋„์ง€ ์ง„์งœ ๋ฌด์—‡์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‚ด๊ฐ€ ์ด ์„ค๊ณ„๋„๋กœ A ์•„ํŒŒํŠธ๋ฅผ ์ง€์—ˆ๋‹ค. ์ด A์•„ํŒŒํŠธ๊ฐ€ ์ธ์Šคํ„ด์Šค๋‹ค! ์ด A์•„ํŒŒํŠธ์— ๋‚ด๊ฐ€ ํ™”์žฅ์‹ค์„ ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ ๋ฐฉ์— ๋“ค์–ด๊ฐ€๋Š” ํ–‰์œ„ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค! ์ด๊ฒƒ์ด ์ธ์Šคํ„ด์Šค.

1. Class or Struct ์ƒ์„ฑ

๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค ์ฐธ์กฐ์— ์˜ํ•œ ์‚ฌ์šฉ์€ ํ•„์š”์—†์œผ๋‹ˆ๊น! (๋‹ค๋ฅธ ์ด์œ ๋„ ๋”์ฐพ์•„๋ด์•ผํ•˜๋Š”๋ฐ..)

์ผ๋ฐ˜์ ์ธ๊ฒƒ๋“ค๊ณผ ์ฐจ์ด๋Š” ์—†์ง€๋งŒ, ํ•˜๋‚˜ ์žˆ๋‹ค๋ฉด Codable!

Codable์„ ์ข€๋” ๋“ค์–ด๊ฐ€๋ณด์ž

์กฐ๊ธˆ ์ƒ์†Œํ•œ typealias๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๋‹ค. ์•Œ๊ธฐ๋งŒํ•˜๊ณ  ์•„์ง ์ ์ ˆํ•œ๊ณณ์„ ๋ชป์ฐพ์•„์„œ ํ•„์ž๋„ ์จ๋ณธ์ ์ด ์—†์ง€๋งŒ, ํƒ€์ž…์˜ ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š”๊ฒƒ์ด๋‹ค. ์‚ฌ๋žŒ ์ด๋ฆ„์œผ๋กœ ์น˜๋ฉด ๊ฐœ๋ช…์ •๋„? ๋‹ค๋งŒ ๋ณธ๋ช…, ๊ฐœ๋ช… ๋‘˜๋‹ค ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. ์œ„์˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด Encodable ๊ณผ Decodable์„ ๋ฌถ์€ ๊ฒƒ์˜ ๋ช…์นญ์„ Codable์ด๋ผ๊ณ  ํ•ด์ค€๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ์ด๋ ‡๊ฒŒ๋ณด๋‹ˆ ์“ธ๋งŒํ•œ ์‚ฌ์šฉ๋ฒ•์„ ์ฐพ์€๊ฒƒ ๊ฐ™๋‹ค. ๋‘๊ฐ€์ง€ ํ”„๋กœํ† ์ฝœ์„ ํ•ฉ์ณ์ฃผ๋‹ค๋‹ˆ! ๋” ํ™•์ธ ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

๊ทธ๋ ‡๋‹ด ์ƒˆ๋กœ๋‚˜์˜จ Decodable๊ณผ Encodable์ด๋ž€?

๋‘๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ๋ฐ˜๋Œ€์ด๋‹ˆ ํ•œ๊ฐœ๋งŒ ๋ณด์ž ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  Decodable

์„ค๋ช…์ด ์•„์ฃผ ์นœ์ ˆํ•˜๋‹ค

๋””์ฝ”๋”ฉํ•ด์„œ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค!
๋””์ฝ”๋”๊ฐ€ ์ฝ๊ธฐ๋ฅผ ์‹คํŒจํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๊ฐ€ ์†์ƒ ํ˜น์€ ์œ ํšจํ•˜์ง€ ์•Š์„๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ ๋˜์ง„๋‹ค.

์•Œ์•„์„œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋„ ํ•ด์ค€๋‹ค ์ข‹๋‹ค!

response๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ๋ณ€๊ฒฝ

์ฒ˜์Œ์— ์‚ฌ์šฉํ• ๋•Œ ์—ฌ๊ธฐ์„œ ์‚ฝ์งˆ์„ ๋งŽ์ด ํ–ˆ๋‹ค. ์‚ฌ์ง„์„ ๋ณด์ž. do,catch ๊ตฌ๋ฌธ์„ ์จ์„œ ์˜ค๋ฅ˜์— ๋Œ€๋น„๋ฅผ ํ•ด์ฃผ์ž ์™œ๋ƒ? ์œ„์— ๋งํ–ˆ๋“ฏ์ด Decodable์€ ์‹คํŒจ์‹œ ์—๋Ÿฌ๋ฅผ ๋˜์ ธ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—!

Swift๋Š” ์ฝ๊ธฐ๋„ ์ฐธ ์ข‹๋‹ค! ํšŒ์ƒ‰ ์ฑ„์›Œ์•ผํ•  ๋ถ€๋ถ„์„ ๋ณด์ž

JSONDecoder()๋ฅผ ์‚ฌ์šฉํ• ๊ฑฐ๊ณ , ๋ฐ์ดํ„ฐ(from ์ธ์ž)๋ฅผ ํŠน์ • ํƒ€์ž…(type ์ธ์ž)์œผ๋กœ ๋””์ฝ”๋”ฉํ•œ๋‹ค

์ฝ๊ธฐ ์‰ฝ๋‹ค. ์—ฌ๊ธฐ์„œ ํƒ€์ž…์€ ์•„๊นŒ ๋งŒ๋“  Class or Struct์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ , data๋Š” ํ†ต์‹ ํ•ด์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋‹ค!

์ฑ„์›Œ๋ณด์ž

let getInstanceData = try JSONDecoder().decode(UserData.self, from: obj)

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ ๊นŒ?

์•ˆ๋œ๋‹ค. ํƒ€์ž…์ด ์•ˆ๋งž๋‹ค๊ณ  ํ•œ๋‹ค. ์™œ๋ƒ? ์•„๊นŒ๋„ ํ™•์ธ ํ–ˆ์ง€๋งŒ obj๋Š” ํƒ€์ž…์ด Any ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด Data ํƒ€์ž…์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด๋ ๊นŒ? ์•„๋‹ˆ๋‹ค,

try ๋’ค์— ์จ์žˆ๋“ฏ JSON์„ ๋””์ฝ”๋” ํ•ด์•ผํ•˜๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” JSON ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค

obj๋ฅผ JSON์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์ž

try JSONSerialization.data(withJSONObject: obj, options: .prettyPrinted)

๊ฐ„๋‹จํ•˜๋‹ค! ๊ทธ๋ ‡๋‹ค๋ฉด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ถœ๋ ฅ๊นŒ์ง€ ํ•ด๋ณด์ž

์‹ค์งˆ์ ์œผ๋กœ do, catch ๋ถ€๋ถ„ ๋นผ๋ฉด ๋‹จ 2์ค„๋งŒ์— JSON ๋ฐ์ดํ„ฐ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์–ด๋ƒˆ๋‹ค. ๋น„๊ฐ•์ œํ•ด์ œ ๊ฐ™์€ ์ž‘์—…๋“ค์ด ์ „ํ˜€ ํ•„์š”์—†์—ˆ๋‹ค. ๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๊ถ๊ธˆํ• ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

  1. ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๊ฐ™์ง€๋งŒ ํƒ€์ž…์ด ํ‹€๋ ธ์„ ๊ฒฝ์šฐ
  2. ๋ฐ์ดํ„ฐ๊ฐ€ ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ
  3. ์˜ต์…”๋„์ด ์•„๋‹๊ฒฝ์šฐ?

๋ณ€์ˆ˜ ์ด๋ฆ„ ๊ฐ™์ง€๋งŒ ํƒ€์ž…์ด ํ‹€๋ ธ์„ ๊ฒฝ์šฐ

์ฝ˜์†”์ฐฝ์—๋ณด๋ฉด ํƒ€์ž…์ด ๋งž์ง€ ์•Š์•„ ์ฝ์–ด ์˜ฌ ์ˆ˜ ์—†๋‹ค๊ณ  ํ•œ๋‹ค

๋ฐ์ดํ„ฐ๊ฐ€ ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ

๊ตฌ์กฐ์ฒด์— test๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์›น ์‘๋‹ต๊ฐ’์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ฒฐ๊ณผ์ฐฝ์„ ๋ณด๋ฉด nil๋กœ ๋“ค์–ด๊ฐ€์žˆ๋‹ค. ํƒ€์ž…์ด ์˜ต์…”๋„ ์ŠคํŠธ๋ง์ด๊ธฐ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค!

์˜ต์…”๋„์ด ์•„๋‹๊ฒฝ์šฐ

์šฐ์„  ๊ตฌ์กฐ์ฒด ์ •๋ณด์™€ ์›น ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•  ๊ฒฝ์šฐ๋ฅผ ๋ณด์ž

์‚ฌ์šฉํ• ๋•Œ !๋‚˜ ? ๋ถ™์—ฌ์ฃผ์ง€ ์•Š๋Š”๋‹ค๋Š” ์  ์™ธ์—” ๋ณด๋‹ค์‹ถํžˆ ๊ฒฐ๊ณผ๋Š” ๋˜‘๊ฐ™๋‹ค

ํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜ ํƒ€์ž…์ด ํ‹€๋ ธ์„ ๊ฒฝ์šฐ์—”?

1. ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ (์˜ต์…”๋„x)
- The data couldnโ€™t be read because it is missing.
2. ํƒ€์ž…์ด ํ‹€๋ฆด ๊ฒฝ์šฐ (์˜ต์…”๋„x)
- The data couldnโ€™t be read because it isnโ€™t in the correct format.

์ด์™€ ๊ฐ™์ด ์ฝ˜์†”์ฐฝ์— ์ฐํžˆ๊ฒŒ ๋œ๋‹ค. 1๋ฒˆ์˜ ๊ฒฝ์šฐ ์˜ต์…”๋„์ด์—ˆ์„๋• nil๋กœ ์ฐํ˜”๋‹ค. ๋”ฐ๋ผ์„œ, ์˜ต์…”๋„๋กœ ๊ฐ€๋Š”๊ฒŒ ์—ฌ๋Ÿฌ๋ชจ๋กœ ์žฅ์ ์ด ๋” ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๋งˆ๋ฌด๋ฆฌ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ž

ps.

์–˜๊ธฐ๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ๊ธธ์–ด์กŒ๋‹ค, Part1,2๋กœ ๋‚˜๋ˆŒ๊ฒƒ ๊ทธ๋žฌ๋‚˜?