์์ฆ ์๋์ ์ฑ์ ์ฌ์ฉํ๋ฉด์ ํต์ ์ ํ์์ธ๋ฏ ํ๋ค. ์ฌ๋ฌ ๊ธฐ๊ธฐ๊ฐ์ ๋๊ธฐํ, ๊ฒฐ์ , ๋ฑ๋ฑ ํต์ ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ถ์ผ๊ฐ ํจ์ฌ ๋ง๋ค.
ํ์๋ ๋งจ์ฒ์ ์์ํ๋ Swift ์คํฐ๋์์ ๋ก์ปฌ ์ฑ์ ๋ง๋ค์์ผ๋ ํต์ ์ ํ์์ฑ์ ๋๊ปด์ ์กธ์ ์ํ๋ ํต์ ์ ํ๋ ์ฑ์ ์๋ ํ์์ผ๋ฉฐ, ์ทจ์ ์ ๋ง์ ๋์์ด ๋์๋ ๊ฒ ๊ฐ๋ค.
์ฌ๋ด์ผ๋ก ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ ์ํ์ html, php, MariaDB, ํฌํธํฌ์๋ฉ ๋ฑ๋ฑ ๋ฐฐ์ฐ๋ ค๋ ๋๋ฌด ํ๋ค์๋ ๊ธฐ์ต์ด ์๋ค. ์๋ฒ๋ ์ง์ ์๋ NAS๋ฅผ ์กฐ๊ธ์ด๋๋ง ๋๊ฐํ๊ฒ ์ด์ฉํ์๋ค.
๊ทธ๋ Alamofire ๋ผ๋ ํ๋ฅญํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๊ฒ ๋์๋ค.
CocoaPod์ ์ด์ฉํด์ ์ค์นํ์ผ๋ฉฐ, ์ค์น๋ฒ์ ์๊ฐ์ด ๋๋ค๋ฉด ๋์ค์ ๋ค๋ค๋ณด๊ธฐ๋กโฆ..
๋ก์ปฌ ์๋ฒ๋ฅผ ์ด์ฉํ ์๋ต๊ฐ์ ๋จผ์ ๋ณด์. (์๋ต๊ฐ) JSON ํํ์ด๋ฉฐ, ๊ฐ์ ๊ฐ๋จํ๊ฒ 3๊ฐ๊ฐ ์จ๋ค.
- hp (String)
- name (String)
- age (Int)
๊ฐ๋จํ์ง๋ง, ์ด๊ฒ์ ์ฑ์์ ๋ฐ์ผ๋ ค๋ฉด ์ฒ์ ์ฌ์ฉ์๋ ์์ฒญ๋ ํผ๋์ด ์จ๋ค. ๋ด๊ฐ ๊ทธ๋ฌ๋ค.
Alamofire๋ง ์๋ค๋ฉด ์์ฃผ์์ฃผ ๊ฐ๋จํ๊ฒ ํ ์ ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฐ๊ณ ํต์ ๋ ๊ฐ๋ฅํ์ง๋ง, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๋ค๋ฉด ํธํด์ง๋๊ฑด ์ฌ์ค! ์์ง ์ฌ์ฉ์ ์ํด๋ดค๋ค๋ฉด ํ๋ฒ์ฏค ์จ๋ณด๊ฒ ๋๋ค๋ฉด ์~ ์ด๋ ๊ฒ ์ฐ๋๊ฑฐ๊ตฐ! ํ๊ฒ ๋ ๊ฒ์ด๋ค.
- ์ฃผ์: Alamofire๋ฅผ ์ค์นํ๋ค๋ ๊ฐ์ ํ๋ถํฐ ์งํ
(์ฑํ๋ฉด) ์ฒ์ ์ด๋ฏธ์ง์ ๋ณด์๋ ์ ํ๋ฒํธ, ์ด๋ฆ, ๋์ด๋ฅผ ์๋ฒ๋ก๋ถํฐ ๋ฐ์์ ์์ ์ด๋ฏธ์ง์ ์๋ง๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ค ๊ฒ์ด๋ค.
์์๋ ๋ค์๊ณผ ๊ฐ๋ค
- ํต์ ์ ํตํด ๊ฐ ๋ฐ์์ค๊ธฐ
- ๊ฐ์ ธ์จ ๊ฐ์์ ํ์ํ๊ฐ ๋นผ๋ด์ค๊ธฐ
- ๋นผ๋ด์จ๊ฐ ํ์ถํ๊ธฐ
** * ์ฃผ์์ฌํญ (์๋์ ์ถ๊ฐ ์ค๋ช ) **
- Alamofire ํต์ ์ ๋น๋๊ธฐ๋ก ์งํ๋จ์ ์์ผ๋ฉด ์๋๋ค.
- 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๊ฐ์ง๋ค
- success
- failure
๊ทธ๋์ ์์์ switch๋ฌธ์ ์ผ์๋ 2๊ฐ์ง๋ง ์จ๋ โdefault์ผ ๊ฒฝ์ฐ์ ๋๋นํ์ธ์โ๋ผ๋ ๊ฒฝ๊ณ ๋ฅผ ์๋์ด๋ค.
- isSuccess๋ ์ฑ๊ณต ์ฌ๋ถ
- isFailur๋ ์คํจ ์ฌ๋ถ
- value๋ ๋ฐ์์จ ๊ฐ
- 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์ ์ธ์คํด์ค๋ก ๋ง๋ค์ด์ฃผ๋ฉฐ, ์ฌ์ง์ด ๋ฐ์ดํฐ๋ฅผ ์ด๋ฆ์ ๋ง๊ฒ ๋ฃ์ด์ค๋ค! ์์ฃผ ํ๋ฅญํ๋ค. ์ดํด๋ณด์
์์๋ ๋ค์๊ณผ ๊ฐ๋ค
- Class or Struct ์์ฑ
- response๋ฐ์ ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ๋ณ๊ฒฝ
- 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 ๋ฐ์ดํฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ง ์ธ์คํด์ค๋ฅผ ์ป์ด๋๋ค. ๋น๊ฐ์ ํด์ ๊ฐ์ ์์ ๋ค์ด ์ ํ ํ์์์๋ค. ๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ๊ถ๊ธํ ์๊ฐ ์๋ค.
- ๋ณ์ ์ด๋ฆ์ ๊ฐ์ง๋ง ํ์ ์ด ํ๋ ธ์ ๊ฒฝ์ฐ
- ๋ฐ์ดํฐ๊ฐ ๋น์ด์์ ๊ฒฝ์ฐ
- ์ต์ ๋์ด ์๋๊ฒฝ์ฐ?
๋ณ์ ์ด๋ฆ ๊ฐ์ง๋ง ํ์ ์ด ํ๋ ธ์ ๊ฒฝ์ฐ
์ฝ์์ฐฝ์๋ณด๋ฉด ํ์ ์ด ๋ง์ง ์์ ์ฝ์ด ์ฌ ์ ์๋ค๊ณ ํ๋ค
๋ฐ์ดํฐ๊ฐ ๋น์ด์์ ๊ฒฝ์ฐ
๊ตฌ์กฐ์ฒด์ 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๋ก ๋๋๊ฒ ๊ทธ๋ฌ๋?