iOS๊ฐ๋ฐ์ ์จ๋ฐ์
๋๋ค.
https://www.youtube.com/@allen_ios
์ ๊ฐ ๊ณต๋ถํ๋ฉด์ ๊ฒช์๋ ์ํ์ฐฉ์ค๋ฅผ ์ฝ๊ฒ ํ์ด๋ด์ด
์ง์์ ๊ณต์ ํ ์์๋ ๊ฐ๋ฐ์๊ฐ ๋๊ณ ์ถ์ต๋๋ค.
์ฌ์ด ์ฃผ์ ๋ก ๋น ๋ฅธ ์๊ฐ ์์ ๊ฒํฅ๊ธฐ ์์ผ๋ก ์ฝ๊ฒ๋ง ๊ฐ๋ฅด์น๋ ๊ฐ์๋ฅผ ๋ง๋๋ ๊ฒ์๋ ๊ด์ฌ์ด ์์ต๋๋ค.
๊ทธ๋ฐ ๊ฐ์๋ ์ผ๋ง๋ ์ง ๋น ๋ฅด๊ฒ ์ฐ์ด๋ด๋ฏ ๋ง๋ค ์ ์๊ฒ ์ง๋ง, ๊ฒฐ๊ตญ "์ข์ ๊ฐ๋ฐ์๋ก ์ฑ์ฅ"ํ๋ ๊ฒ์ ๊ทธ๋งํผ ์ด๋ก ์ ์ธ ๊ธฐ๋ฐ์ ๋ฐ๊ฑฐ๋ฆ์ด ํํํด์ผ ํ๋ค๊ณ ๋ฏฟ๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฌ์ด ๊ฐ์๋ณด๋ค๋, ์ข์ ๊ฐ๋ฐ์(๋์์์ด ์ฑ์ฅํ ์ ์๋ ๊ฐ๋ฐ์)๊ฐ ๋๊ธฐ ์ํด
๋ฐ๋์ ์์์ผ ํ๋ ์ด๋ ค์ด ๋ด์ฉ๊น์ง๋ฅผ ์ต๋ํ ์ฝ๊ฒ, ๊ทธ๋ฆฌ๊ณ ์ง๊ด์ ์ผ๋ก ์๋ ค๋๋ฆฌ๋ ๊ฒ.
๊ทธ๋์ ์ ๊ฐ ์๋ ์ฌ๋ฌ๋ถ ์ค์ค๋ก ๊ณ ๋ฏผ/์๊ฐํ ์ ์๋ ๋ฐ๊ฑฐ๋ฆ์ ๋ง๋ค์ด ๋๋ฆฌ๋ ๊ฒ์ ์ ์ ๊ฐ์ ๋ชฉํ๋ก ์ผ๊ณ ์์ต๋๋ค.
์ ์ค์ค๋ก๋ ๋ด์ผ์ ๋ ์ข์ ๊ฐ๋ฐ์๊ฐ ๋์๋ ๋ชจํ ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋งํผ
์ ๊ฐ ๊ณ ๋ฏผ ํ๋ ๋ด์ฉ๋ค์ ๊น์ด์๊ฒ ์ ๋ฌ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.
๐๐ป๋ฌธ์๋ ์๋์ ์ด๋ฉ์ผ๋ก ์ฃผ์๋ฉด ๋ฉ๋๋ค.
we.love.code.allen@gmail.com
์ธ์ด: Swift(์ค์ํํธ), Python, Java, C#
Courses
Reviews
- Alan Swift Concurrency for Swift 6 (Part-1)
- Alan Swift Grammar Master School (Online BootCamp - 2 Month Course)
- Alan Swift Concurrency for Swift 6 (Part-2)
- Alan Swift Grammar Master School (Online BootCamp - 2 Month Course)
- Alan Swift Grammar Master School (Online BootCamp - 2 Month Course)
Posts
Q&A
18๊ฐ ์์ ์์ ์ ๋ฉํ๋ฐ์ดํฐ ์์ ๊ด๋ จ ๊ฐ์ ์๋ฃ ๋ฌธ์
์ ๋ค, ํฐ ์๋ฏธ๊ฐ ์๋ ๊ฒ์ ์๋๊ณ ๊ทธ๋ฅ ๋จ์ํ๊ฒ ๋๊ฐ์ง ์๋ฏธ ๋๋ฌธ์ ์ทจ์์ ์ผ๋ก ํ์ํด ๋์ ๊ฒ์ด๊ธฐ๋ ํ๋ฐ,"๋ฉํ๋ฐ์ดํฐ"๋ผ๋ ๊ฒ์๋ (1) ์ฒซ๋ฒ์งธ๋ก๋ ํ์ฌ ์คํ ์ค์ธ ์กํฐ๊ฐ ์์ ์๋ ์๊ณ ์๋ ์๋ ์์ด์ ์ทจ์์ ์ผ๋ก ํ์ํด๋์ ๊ฒ ์ ๋๋ค. ์ฆ, ๊ตฌ์กฐ์ ๋์์ฑ์ด ์กํฐ ๋ด๋ถ์์ ์คํํ๋ ๊ฒฝ์ฐ - ์กํฐ ์์ํ๊ฒ ๋๊ณ , ์กํฐ ๋ด๋ถ๊ฐ ์๋ ๊ณณ์์ ์คํํ๋ ๊ฒฝ์ฐ - ์์ํ ์กํฐ๊ฐ ์์ด์... ์์ํ ์กํฐ๊ฐ ์๋ ๊ฒฝ์ฐ/์๋ ๊ฒฝ์ฐ ๋๋ฌธ์ ๊ทธ๋ ์ต๋๋ค.(2) (๋ค๋ฅธ ์ธก๋ฉด์์๋) ๊ตฌ์กฐ์ ๋์์ฑ ์์ฒด๊ฐ ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ๋ชฉ์ ์ผ๋ก ํ๋ ๊ฒ์ด๋ผ.. ๋ถ๋ชจ ์์ ์ ๊ฒฝ์ฐ๋ ์กํฐ์์ ์คํ๋ ์ ์์ง๋ง, ํ์(์์) ์์ ๋ค์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋์ด (์กํฐ์ ์๊ด์์ด) ์คํ๋๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฐ ์๋ฏธ์์ ์ด์ง(?) ํ์๋ฅผ ํด๋ ๊ฒ์ด๊ธด ํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 1
- 15
Q&A
withCheckedContinuation ์์ resume ํธ์ถ์ ์์ ์ฑ ๋ณด์ฅ ์ง๋ฌธ
์ ๋ค๋ค, sujinnaljin ๋.๊ฐ์ ๋ด์ฉ์ด ์๋ชป๋ ๊ฒ ๊ฐ๋ค์! ๊ณต์ ๋ฌธ์ ๋ด์ฉ์ ์ ๋ ๋ค์ ํ์ธํด๋ณด๋, ํด๋น ๋ถ๋ถ์ ๋ํ ๋ด์ฉ์ ์ ๊ฐ ์์ธํ๊ฒ ์ฒดํฌํ์ง ๋ชปํ ๋ถ๋ถ์ด ์๋ค์! ๋ง์ํ์ ๋ด์ฉ์ด ๋ง์ต๋๋ค ^^;(์๋ง ์ ๋ ์ด๋ฐ ํ์ต ํ ๋์ ๋ด์ฉ์ ๋ํด ์ถํ์ ์์ธํ๊ฒ ์ดํด๋ณด์ง ์์์ ๋๋ธ ์ฒดํฌ๋ฅผ ๋ชปํ๋ ๋ถ๋ถ์ด๋ค์.) ๊ฐ์ ๋ด์ฉ, ๊ต์ฌ ๋ด์ฉ๋ ์์ ํด ๋์์ผ ๊ฒ ๋ค์!์๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :)
- 0
- 1
- 15
Q&A
์ฐธ๊ณ ์ฝ๋ ์๋ฃ 7-StructuredConcurrency(102, 103์ค) ์คํ?
์, ๋ค ๋ง๋ค์ใ ใ ์คํ๊ฐ ์์๋ค์! ๋ค A์ฝ๋์ ํํ๋ ์๋ชป๋์๊ณ , (์๋์ ๊ฐ์) ์ฌ์ฉํ์ B์ ํํ๊ฐ ์ ํํ ๋ง์ต๋๋ค.(์๋ฃ๋ ์์ ํด ๋๊ฒ ์ต๋๋ค.) /// ๊ตฌ์กฐ์ ๋์์ฑ ์์ ์ ์์ฑ (ํ์ ์์ ์ ์์ฑ) async let image1 = fetchImage(num: 1) async let image2 = fetchImage(num: 2)์ง๋ฌธ์ ์ ํํ ๋ต๋ณ์ ๋๋ฆฌ๊ณ ์ถ์ง๋ง..์ ์๊ฐ์๋ ์๋ชป๋ ์ฝ๋๋ฅผ ๋ถ์ํ๋ค๋๊ฒ ํฌ๊ฒ ์๋ฏธ๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค..ใ ใ ์ด์ฐจํผ A์ฝ๋์ ๊ฐ์ ํํ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, ์๋ชป๋ ์ฝ๋์ผ๋ฟ์ธ ๊ฒ์ด์ฃ . (์๋ชป๋ ์ฝ๋์ธ๋ฐ, ์์ฒด์ ์ผ๋ก ์ปดํ์ผ๋ฌ๊ฐ ์ค๋ฅ๋ฅผ ์ก์์ฃผ์ง ์๋ ๊ฒ์ผ๋ฟ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.) ๊ทธ๋ฅ ๋จ์ํ, ์ง์ง ์ ๊ฐ์ธ์ ์ธ ๋ํผ์ ๋ก๋ ๋ด๋ถ์ ์ผ๋ก B์ฝ๋์ ์์ ํ ๋์ผํ๊ฒ ๋์ํ ๊ฒ ๊ฐ๊ธดํฉ๋๋ค. /// ๊ตฌ์กฐ์ ๋์์ฑ ์์ ์ ์์ฑ (ํ์ ์์ ์ ์์ฑ) async let image1 = try await fetchImage(num: 1) async let image2 = try await fetchImage(num: 2)์๋๋ฉด, ์์ ๊ฐ์ ์ฝ๋์์ ์ปดํ์ผ ๋ ๋, ์ผ์ชฝ์ ์ฝ๋์ธ.. async let์ ์ฝ๋๋ฅผ ๋จผ์ ์ปดํ์ผ ์ํฌ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ค์ async let image1 ์ฝ๋์์ ์ผ๋จ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถ ์ํค๊ณ ๋ค์ ์ค์ ์ฝ๋๋ก ๋์ด๊ฐ๋ ๋์์ผ๋ก async let image2๋ฅผ ์ปดํ์ผ ์ํฌ ๊ฒ ๊ฐ์ต๋๋ค.(๋ค๋ง, ์ธก์ ํ์ ์๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์จ ์ด์ ๋ ์ ๋ง ๋จ์ํ๊ฒ ํ๋ ์ด๊ทธ๋ผ์ด๋ ์คํ ํ๊ฒฝ์ ๋ฌธ์ ์ด์ง ์์๊น ์ถ์ต๋๋ค. ์๋ฐฑ๋ฒ์ ์คํ์ ํด๋ณด๋ฉด ์ผ์ถ ๋น์ทํ๊ฒ ๋์ฌ ๊ฒ ๊ฐ์ต๋๋ค.) ์ฝ๋ ๋ด์ฉ์ ์ฃผ์ ๊น๊ฒ ๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 3
- 27
Q&A
๊ธฐ์ด ์ฑ 4๊ฐ Type Any -> UIButton
๋ค ๊ธฐ์ฐ ๋.๋ํ ์ผํ๊ฒ ์ ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐ Anyํ์ ์ ์ถ์์ ์ธ ํ์ ์ด๊ธฐ ๋๋ฌธ์, ๋ง์ฝ ๊ตฌ์ฒด์ ์ธ ํ์ ์ธ UIButton์ผ๋ก ์ง์ ์ง์ ํด์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ ํ์ ์บ์คํ ์ ํด์ UIButton๋ค์ ์์ฑ์ ์ ๊ทผํ ์ ์๊ณ ,์ง์ UIButton์ ์ค์ ํ๋ ๊ฒฝ์ฐ, ๊ตณ์ด ํ์ ์บ์คํ ์ ํ์ง ์์๋ ๋๋.. ์กฐ๊ธ ๋ ํธํ๊ฒ ์ฌ์ฉํ์ค ์ ์์ต๋๋ค. :)
- 0
- 2
- 23
Q&A
3๊ฐ ์ค๋ ๋ ์ ์ด๊ถ ๊ด๋ฆฌ ์ง๋ฌธ๋๋ฆฝ๋๋ค
๋ค ์๋ ํ์ธ์ ๋ฏธ๋ฝ ๋!1. ๋ค ๋ง์ต๋๋ค. ์ฌ๊ฐ(resume)๋ฅผ ํ๊ฒ ๋๋ฉด, ์๋ณดํ๋ ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋ค์ ๋๋ ค๋ฐ์ ์ผ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค. (์ฐ๋ ๋ ์ ์ด๊ถ์ด๋ ๊ฒ์, "์ง๊ธ ์คํ๋๋ ํจ์"๊ฐ ๊ฐ์ง๊ณ ์์ ์ ๋ฐ์ ์๋ค๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค. ์๋๋ฉด.. ์ฐ๋ ๋ ์ ์ด๊ถ์ ์ฝ๊ฒ ๋งํ์๋ฉด, "CPU๋ฅผ ๋ด๊ฐ ์ฐจ์งํ๊ณ ์ฌ์ฉํ ๊ป"์ ๊ทธ ๋ด๋ถ ์ปจํธ๋กค์ ๊ด๋ฆฌํ๋ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋๊น, ์ฌ๊ธฐ์ func2๋ ๋ค์ ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋๋ ค๋ฐ์์, ํจ์๋ฅผ ์ฌ๊ฐ์ํจ ๊ฒ์ด๋ค๋ผ๋ ์๋ฏธ๋ก ์ค๋ช ๋๋ฆฌ๊ณ ์๋ ๊ฒ์ ๋๋ค.)2. ๋ค ๋ง์ต๋๋ค. func1์์ func2๋ฅผ ํธ์ถํ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ์ค๋ช ๋๋ ธ๊ณ , (func2๊ฐ CPU๋ฅผ ์ฐจ์งํ๊ณ ์ฌ์ฉํ๋ค๊ฐ) func2๊ฐ ์ผ์ฒ๋ฆฌ๊ฐ ๋ค ๋๋์ ๋ฆฌํดํ๊ฒ ๋๋ฉด ("func1์, ์ด์ CPU ๋๊ฐ ์ฐจ์งํ๊ณ ์ฌ์ฉํด๋ ๋ผ"..์ด๋ฐ ๊ฒ์ฒ๋ผ) ์ฐ๋ ๋ ์ ์ด๊ถ์ ์ด์ func1์ ๋๊ธฐ๊ฒ ๋ฉ๋๋ค.3. ๋ค ๋ง์ต๋๋ค. func1 (Caller)์์ func2 (Callee)๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด, func1์ด ๊ฐ์ง๊ณ ์๋ ์ฐ๋ ๋ ์ ์ด๊ถ์ func2์๊ฒ ๋๊ฒผ๋ค๊ฐ ์คํ์ด ๋ค ๋๋๋ฉด func1์ด ๋๋ ค๋ฐ๊ฒ ๋๋๋ฐ, ์ด ๊ฐ๋ ์ GCD๋ Swift Concurrency๋ ๋์ผํฉ๋๋ค. ๋ค๋ง, ์ฐจ์ด๋.. GCD์์๋ (func2์ ์ฅ์์ ๋ณด๋ฉด) func2๋ ์ฐ๋ ๋ ์ ์ด๊ถ์ ์ด์์ฒด์ ์๊ฒ ์๋ณดํ ์ ์๋ ๊ฐ๋ ์ด ์๋๋ฐ, (๊ทธ๋์ func2๋ ํ๋ฒ ์ผ์ ์์ํ๋ฉด ๋ฌด์กฐ๊ฑด ๋๋ ๋๊น์ง ๋์ํ ์ ๋ฐ์ ์๋๋ฐ)Swift Concurrency๋ func2๊ฐ ์ด์์ฒด์ ์๊ฒ ์ ๊น ์ฐ๋ ๋ ์ ์ด๊ถ์ ์๋ณดํด์, (์ค๊ฐ์) ์ด์์ฒด์ ๊ฐ ๋ค๋ฅธ ์ผ์ฒ๋ฆฌ๋ฅผ ํด๋ ๋ ์ ์๊ฒ ๋๋ ๊ฐ๋ ์ ๋๋ค. (์ด์์ฒด์ ๋ ๊ทธ ์๋ณด ๋ฐ์ ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋ ๋ค๋ฅธ ์ด๋ค ํจ์์๊ฒ ์ ๊น ๋น๋ ค์ค์ ์ผ์ ์ํค๊ฒ ์ฃ .)4๊ฐ์์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ์ผ๋ก ์ด๋ป๊ฒ ํจ์๊ฐ ์ ๊น ๋ฉ์ท๋ค๊ฐ ์คํ๋ ์ ์๋์ง์ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ ์ ์๊ฐํด ๋ณด์๋ฉด ๋ง์ ๋์์ด ๋์ค๊บผ์์! ์ดํด๊ฐ ์๋์๋ ๋ถ๋ถ์ด ์์ผ์๋ฉด ์ถ๊ฐ์ ์ผ๋ก ์ง๋ฌธ์ฃผ์ธ์ :) ๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 1
- 36
Q&A
10๋ฒ ๊ฐ์ ๊ด๋ จํ์ฌ ์ง๋ฌธ๋๋ฆฝ๋๋ค.
๋ค ์๋ ํ์ธ์ ๊ฐ๋ฐ์ ๋. ๋ค ๋ง์ต๋๋ค. ์๋ฐํ๊ฒ ๋ฐ์ ธ๋ณด๋ฉด, ๊ฐ๋ฐ์ ๋์ด ๋ง์ํ์ ๊ฒ ๋ง์ต๋๋ค. ์ ๊ต์ฌ 29 ํ์ด์ง์๋ ๋ณด์๋ฉด, ํจ์๊ฐ ์ฌ๊ฐ๊ฐ ๋ ๋๋ ๋ค๋ฅธ ์ฐ๋ ๋์์ ์ฌ๊ฐ๊ฐ ๋ ์ ์๋ค๊ณ ๊ทธ๋ฆผ๊น์ง ๊ทธ๋ ค์ ์ค๋ช ๋๋ฆฌ๊ณ ์๊ธฐ๋ ํ๊ณ ์. ๋ค๋ง, ์ฌ๊ธฐ์ ๊ทธ๋ ๊ฒ ์ค๋ช ๋๋ฆฌ๋ฉด, ์ดํดํ ์ ์์ ์ ๋๋ก ์์ฒญ ๋ณต์กํด ์ง์ง ์์๊น์? ๊ทธ๋์ ํด๋น ์ค๋ช ๋๋ฆฌ๊ณ ์๋ ๋ถ๋ถ์์๋ Task ์์ฒด๊ฐ ํน์ ํ ์ฐ๋ ๋์์๋ง ์คํ๋๋ค๊ณ ๊ฐ์ ์ ํด์ผ, ์ด๋ก ์ ์ผ๋ก ์ดํดํ๋ ์ธก๋ฉด์์ ํจ์ฌ "์ง๊ด์ ์ผ๋ก" ์ดํด๊ฐ ์ฌ์์ง๊ธฐ ๋๋ฌธ์, ๊ทธ๋ ๊ฒ ๊ฐ์ ํ๊ณ ๋ง์๋๋ฆฌ๊ณ ์๋ ๋ถ๋ถ์ด๋.. ๊ฐ์ ๋ด์ฉ์์ ๊ทธ๋ฐ ๋ถ๋ถ์ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค. (์ค์ ๋ก๋ ๋ค๋ฅธ ์ฐ๋ ๋์์ ์ฌ๊ฐ(resume)๋์ด ์คํ๋ ์ ์๋ค๋ ๋ถ๋ถ์ ๋น์ฐํ ์์ ๋ค๋ (์ ๋ถ๋ถ์ ๊ฐ์ ๋ด์ฉ์ ๋ค ์ดํดํ์๊ณ ์๋ค๋) ๊ฐ์ ํ์ ์ต๋ํ ์ง๊ด์ ์ธ ์ค๋ช ์ ์ํ ๊ฐ์ ์ผ ๋ฟ์ ๋๋ค.) ๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 2
- 36
Q&A
ImageProject ๊ด๋ จ ๋ฌธ์
๋ค ์๋ ํ์ธ์ ใ ใ ๋.๊ฒฐ๊ตญ, ํด๋น ์ฝ๋์์๋.. ๋ค๋ฅธ ๊ฐ์ฒด(imageDownloader)๊ฐ ๊ฐ์ง๊ณ ์๋ ์บ์์ URL์ ๊ฐ์ง๊ณ ์๋ ์ฌ๋ถ์ ํ์ธ์ ํ๋ ค๊ณ ํ๋ ๊ฒ์ธ๋ฐ, Swift Concurrency์์๋ ๋ด๋ถ์ ์ผ๋ก await ์ฝ๋์ ์์ ์ ์ฌ์ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ด ๋ฌธ์ ์ฃ .๊ฒฐ๊ตญ "์์ฒญ ์์" ์์ ๋ถํฐ ===> "ํฌํจ ์ฌ๋ถ ํ์ธ ์๋ฃ" ์์ ๊น์ง ์ค๊ฐ์ await ์ฝ๋๊ฐ ํฌํจ๋์ด ์๋์ง์ ์ฌ๋ถ๊ฐ ์ค์ํฉ๋๋ค.1) ๋ฒ์ ๊ฒฝ์ฐlet keys = await imageDownloader.cache.keys if keys.contains(url) { return try await imageDownloader.image(from: url) }์์ฒญ ์์ ==== await (O) ====> ์บ์ ์ ๋ณด(keys) ๊ฐ์ ธ์ด ==== await (X) ====> ํฌํจ ์ฌ๋ถ ์์ฒญ ์์ ์์ ์บ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ ์ฌ๋๊น์ง๋ await ์ฝ๋๊ฐ ์๊ธด ํ์ง๋ง, ์ค์ ์บ์ ์ ๋ณด๋ฅผ ํ์ธํ ์์ ์ดํ์๋ ๊ทธ ์บ์ ์ ๋ณด๊ฐ ๋ฐ๋์ง ์๋๋ค๋ ๊ฒ์ ๊ฐ์ ํ๋ ์ฝ๋๋ผ๊ณ ๋ณด์๋ฉด ๋๊ณ ์. (๋ฐ๋ผ์, ์ผ๋จ ์บ์ ์ ๋ณด์ ์ค๋ ์ท์ ํ์ธํ ์์ ์ดํ ์บ์ ๋ฐ์ดํฐ๋ ๋ณํ ํ์ด ์๋ค๊ณ ๋ณด๋ฉด ๋จ) 2) ๋ฒ์ ๊ฒฝ์ฐif await imageDownloader.cache.keys.contains(url) { return try await imageDownloader.image(from: url) }์์ฒญ ์์ ==== await (O) ====> containsํธ์ถ ์์ ==== await (O) ====> ํฌํจ ์ฌ๋ถ 2๋ฒ์ ๊ฒฝ์ฐ๋.. ์ด๋ป๊ฒ ๋ณด๋ฉด ์์ฒญ ์์ ๋ถํฐ ํ์ธ ์์ ๊น์ง ์ ๊ตฌ๊ฐ์ ๊ฑธ์ณ์, await์ฝ๋๊ฐ ์๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์.. ํด๋น ๊ฐ์ฒด(imageDownloader)์ ์ฌ๋ฌ ์์ฒญ(๋ฉ์๋ ํธ์ถ ๋ฑ)์ด ์๋ค๋ฉด, ์ค์ contains๋ฉ์๋๋ฅผ ํธ์ถํ ์์ ๋ถํฐ๋ ์ฌ์ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ด ๋ฌธ์ ๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค. (์ฝ๊ฒ ๋ง์๋๋ฆฌ๋ฉด.. (์ค์ ์ฝ๋๊ฐ ๊ทธ๋ ๋ค๋๊ฒ ์๋๋ผ) ๋ ผ๋ฆฌ์ ์ผ๋ก ์๋ ์ฝ๋์ ๋น์ทํ๋ค๋ ๋ป์ ๋๋ค.)let keys = await imageDownloader.cache.keys let isCashed = await keys.contains(url) if isCashed { return try await imageDownloader.image(from: url) }๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ์ฌ์ง์ ๋ฌธ์ ์ ๊ด๋ จํด์๋ 1๋ฒ ์ฝ๋๊ฐ ๋ ์์ ์ ์ธ ์ฝ๋๋ผ๊ณ ๋ง์๋๋ฆฌ๊ณ ์๋ ๊ฒ๋๋ค. ๋ค๋ค, lazy var๋ก ์ ์ธํ์๋๋ผ๋ (๊ธ๋ก๋ฒ ์กํฐ๋ก ๊ฒฉ๋ฆฌ๋) DiskStorage ํด๋์ค์ ๊ฒฝ์ฐ, DiskStorageํ์ ์ ์กด์ฌ ์์ฒด๊ฐ ImageDatabase์ ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.ImageDatabase๊ฐ ๋จผ์ ์ด๊ธฐํ ๋์ด์ผ ==> DiskStorage ์กด์ฌ ๊ฐ๋ฅ ==> ์กด์ฌํ๋ ค๋ฉด ImageDatabase ํ์ ์ด๋ฐ์์ผ๋ก ์ํํด์ ์์กด(ํ์)ํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค. lazy๋ก ์ ์ธํ๋ค๊ณ ํด์ ์ด์ฐจํผ ์ปดํ์ผ๋ฌ ์์ฒด๊ฐ ๋ ผ๋ฆฌ์ ์ธ ๋ชจ๋ ์์๋ฅผ ํ์ ํ ์ ์๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์, ์ปดํ์ผ๋ฌ๋ DiskStorage ํ์ ์์ฒด์ ์ด๊ธฐํ ๋ฌธ์ ๋ก ๋ฐ๋ผ๋ณด๊ณ ์๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 1
- 35
Q&A
๋น๋๊ธฐ ๋ฐ๋ณต๋ฌธ์ ํ๋์ thread์์๋ง ๋์ํ๊ฒ ๋๋์??
๋ค, ์๋ ํ์ธ์ ์๋ ๋! ์ ๊ฐ ์ดํดํ ๋ฐ๋ก๋ 'Swift Concurrency๋ thread๊ด์ ์์ ๋ฒ์ด๋์, Task๋ผ๋ ์์ ์ ๋จ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋น๋๊ธฐ ๊ด๋ฆฌ๋ฅผ ํ๋ค' ๋ผ๊ณ ์ดํดํ๊ณ ์์ต๋๋ค.==> ๋ค, Task๋ผ๋ ์์ ์ ๋จ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ด๋ฆฌํ๋ค๋ ๋ง์ ๋ง์ง๋ง, ๊ฒฐ๊ตญ ๊ทธ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ ํ๊ณ ๋ค์ด๊ฐ๋ณด๋ฉด Task ๋ด๋ถ์์๋ 1๊ฐ์ ์ฐ๋ ๋(1๊ฐ์ CPU)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. (์์ ์์ ๊ทธ๋ ค๋๋ฆฐ ๊ทธ๋ฆผ์ ์ ์ฐธ๊ณ ํด๋ณด์๋ฉด ์ข๊ณ ์.) ๊ทธ๋ฆฌ๊ณ Swift Concurrency ์์ฒด๋ ๋ด๋ถ์ ์ผ๋ก (์ด์์ฒด์ ์์.. ํ์ฌ ์ฌ์ฉํ๊ณ ์์ง ์์ ์ฐ๋ ๋๋ฅผ ์๋ณดํ๋) ํ๋ ฅ์ Thread Pool ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. (๊ธฐ์กด์ GCD์์ Swift Concurrency๊ฐ ๋์ ๋ ๊ฒ์.. ์ด ํ๋ ฅ์ Thread Pool ๋ฐฉ์(์ฐ๋ ๋๋ฅผ ์๋ณดํ๋)์ด ํจ์ฌ ๋ด๋ถ์ ์ผ๋ก ํจ์จ์ ์ผ๋ก ๋์ํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋ถ๋ถ์ด ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ์์ด ๋์ ๋ ๊ฒ์ ๋๋ค. ์ด ๋ถ๋ถ์ ์กฐ๊ธ ๋ ์์ธํ๊ฒ ์ค๋ช ๋๋ฆฌ๋ ค๋ฉด.. ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด์ง๊ธฐ ๋๋ฌธ์.. Part2๊ฐ์์ CS๋ถ๋ถ์ ์ฐธ๊ณ ํ์๋ฉด ๋ง์ ๋์์ด ๋์ค ๊ฒ ๊ฐ๊ธด ํฉ๋๋ค. ์ฐ๋ ๋๋ ํธํ๊ฒ CPU 1๊ฐ๋ผ๊ณ ์๊ฐํ์ ๋ ๋ฉ๋๋ค.) ๊ทธ๋์ Task๋ ๋ง ๊ทธ๋๋ก.. "์ผ"์ ๋จ์ ์ ๋๋ก ์๊ฐํ์๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์ (Task)์ ์ธ์ ๋ ์ง ์์ฑ, ์๋ฉธ ๊ฐ์ ์ผ์ด ๋ฐ์ํ ์ ์๋ ๊ฒ์ด๊ณ , ๊ทธ ์์์ ๊ฒฐ๊ตญ ์ด์์ฒด์ ๊ฐ ์์ฑํ Thread๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ ๊ฒ์ ๋๋ค. ์ต๋ํ ์ง๊ด์ ์ผ๋ก, TaskGroup์ด๋ผ๋ ์์ฒด๊ฐ ๋์ ๋ ์ด์ ๋ฅผ ๋ฌด์์ผ๊น?๋ฅผ ์๊ฐํด๋ณด์๋ฉด.. ๊ฒฐ๊ตญ ์ด๋ฌํ ์ฌ๋ฌ๊ฐ์ Task๊ฐ (์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋(CPU)๋ฅผ ์ฌ์ฉํด) ๋์์ ์ผ์ ์ํค๋๋ก ๋ง๋ค๊ณ , ๋ง์ง๋ง์๋.. ๊ทธ๋ฌํ ์์ ๋ค์ ํ๋ฐ ๋ชจ์์ ์ฒ๋ฆฌํ๋ ค๋ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์ค๊ณ๋ ๊ฒ์ด TaskGroup์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค. (์ฌ์ด ๋ณ๋ ฌ ์์ ๊ณผ, ๋ง์ง๋ง์๋ Thread-safeํ ์ง๋ ฌ์ด ํ์ํ ๊ฒ์ด์ฃ .) ๋ง์ฝ ํ๋์ thread์ ๊ณ ์ ๋์ด ์๋ค๋ฉด, group์ ํตํด์ ๊ฒฐ๊ณผ๊ฐ ๋์ด์ค๊ฒ ๋ ๋, ์์ Task์ค ๊ณผ๋ํ๊ฒ ์ค๋๊ฑธ๋ฆฌ๋ ์์ ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋น๋๊ธฐ ๋ฐ๋ณต๋ฌธ์ด ์คํ๋๋ ํน์ thread๊ฐ ๊ณ์ blocking๋๋๊ฑด๊ฐ? ํ๋ ์๋ฌธ์ด ๋ค์ด์์==> ๊ฒฐ๋ก ์ ์ผ๋ก๋ Non-Blocking๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ์ค๋๊ฑธ๋ฆฌ๋ ์์ ์ด ์๋ค๊ณ ํ๋๋ผ๋, blocking๋์ง ์์ต๋๋ค. ์ฌ์ค ์ด ๋ถ๋ถ์ด Non-Blocking ๋ฐฉ์์ ์ฅ์ ์ธ๋ฐ, (์ถํ์ Part2์ CS๋ถ๋ถ๊น์ง ํ์ตํ๊ฒ๋์๋ฉด ๋ด๋ถ์ ์ธ ๋ฉ์ปค๋์ฆ์ ๋ ์ ํํ๊ฒ ์๊ฒ ๋์คํ ๋ฐ..) ๋ฌดํผ ์ต๋ํ ์ง๊ด์ ์ผ๋ก ์ค๋ช ๋๋ฆฌ๋ฉด, ์ ๊ฐ Non-blocking์ ์ค๋ช ๋๋ฆฌ๋ฉด์ ๊ทธ๋ ค๋๋ ธ๋.. ์๋์ ๊ฐ์ ๊ทธ๋ฆผ์ ๋ ์ฌ๋ ค๋ณด์๋ฉด ์ข์ต๋๋ค. ์ค๋๊ฑธ๋ฆฌ๋ ์์ ์ด ์๋ค๊ณ ํ๋๋ผ๋ (์ผ์ ์ํ๋ ๋์์) ์ฐ๋ ๋๋ฅผ ์๋ณดํ๊ธฐ ๋๋ฌธ์ Blocking์ด ์ผ์ด๋ ์ผ์ด ์์ต๋๋ค. (๊ทธ๊ฒ ์ฌ์ฉํ์ง ์๋ ๋์์ ์ฐ๋ ๋๋ฅผ ์๋ณดํ๋ ํ๋ ฅ์ Thread Pool์ด ๋์ํ๋ ๋ฐฉ์์ด์ Swift Concurrency์ ์ฅ์ ์ด์ฃ .)(์ฌ์ง) ๊ทธ๋ฆฌ๊ณ ์ด ๋ถ๋ถ์ ์ต๋ํ ์ง๊ด์ ์ผ๋ก ์ดํดํ์๊ธฐ ์ข๊ฒ.. ์ ๊ฐ ์ด๊ฑธ TaskGroup์ ์ ์ฉํด์ (์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ด ์๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ทธ๋ฆผ์ ๊ทธ๋ ค์ ๋ณด์ฌ๋๋ฆฌ๋ฉด..)(์ฌ์ง) ์ด๋ฐ์์ผ๋ก ํ์ ์์ ์์ ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ด ์๋ค๊ณ ํ๋๋ผ๋ ๊ฒฐ๊ตญ ๋ถ๋ชจ์์ ์กฐ์ฐจ๋ ์๊ธฐ๊ฐ ๋์ํ์ง ์๋ ๋์์ ์ฐ๋ ๋๋ฅผ ์๋ณดํ๊ฒ ๋ฉ๋๋ค. (Non-Blocking ๋ฐฉ์) ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Thread์์ Blocking์ด ์ผ์ด๋ ์ ์์ต๋๋ค. ๋ญ ๊ทธ๋ ๋ค๋ฉด ํ๊ฐ์ง ์๋ฌธ์ด ๋์ค ์๋ ์๋๋ฐ์.. ๊ทธ๋ ๋ค๋ฉด, ๋ถ๋ชจ์์ ์ด ๋ฐ๋์ 2๋ฒ ์ฐ๋ ๋์์๋ง ๋์ํ๋ ๊ฒ์ด๋? ์ด๋ ๊ฒ ์๋ฌธ์ ๊ฐ์ง์ค ์๋ ์๋๋ฐ.. ๋ฌผ๋ก (์๋ฐํ๊ฒ ๋ฐ์ง๋ฉด) ๊ทธ๋ ์ง๋ ์์ต๋๋ค. ๋ถ๋ชจ์์ ๋ด๋ถ์ ์ผ๋ก (์์ ์ฌ๊ฐ๋ฅผ ํ ๋) 2๋ฒ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ ์๋ ์๊ณ , 3๋ฒ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ ์๋ ์๋๋ฐ.. ์ฌ์ค, ๊ทธ๊ฑด ์ฐ๋ฆฌ์๊ฒ ์ค์ํ ๊ด์ฌ์ฌ๋ ์๋๋๋ค. ์๋๋ฉด, (2๋ฒ ์ฐ๋ ๋์ด๋, 3๋ฒ ์ฐ๋ ๋์ด๋, 4๋ฒ์ฐ๋ ๋์ด๋..) (๋์์ ๋์ํ๋ ์ผ์ ์ ๋ ๋ฐ์ํ์ง ์๊ณ ) ์์ฐจ์ ์ผ๋ก(๋ฌด์กฐ๊ฑด ์ฐจ๋ก ์ฐจ๋ก) 1๊ฐ์ ํน์ ์ฐ๋ ๋์์๋ง (์ง๋ ฌ๋ฐฉ์์ผ๋ก) ์ผ์ ํ๋ฉด์ Thread-safeํ๊ฒ ์ผ์ ํ๊ฒ ๋๊ธฐ ๋๋ฌธ์.. ๊ทธ๊ฒ (๋ด๋ถ์ ์ผ๋ก ๊ผญ ์ ํด์ง ํน์ ์ฐ๋ ๋์ธ) 2, 3, 4๋ฒ ์ด๋ ๊ฐ์ ๊ทธ๊ฒ ์ค์ํ ๊ฒ์ ์๋๋ผ๋ ๊ฒ์ด์ฃ . ๋ค๋ง, ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ๋ ์ต๋ํ ์ง๊ด์ ์ผ๋ก ์๊ฐํ์๊ธฐ ํธํ๊ฒ.. ๋ถ๋ชจ ์์ ์ "ํน์ " 2๋ฒ ์ฐ๋ ๋์์๋ง ๋์ํ๊ฒ ๋๋ค๋ผ๊ณ ์ค๋ช ๋๋ฆฐ ๊ฒ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค. ์ถ๊ฐ์ ์ผ๋ก ๊ถ๊ธํ์ ๋ถ๋ถ ์์ผ์๋ฉด ๋ ์ง๋ฌธ ์ฃผ์ธ์. ๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 2
- 52
Q&A
34๊ฐ ์ ์ฉํ ์ฑ ์ถ์ฒ์ ๋์ค๋ UIKitViewer์ ๋ํด์ ์ง๋ฌธ์ด ์์ต๋๋ค
์ ๋ค,UIKit Box ๋ผ๋ ์ฑ์ด ๋น์ทํฉ๋๋ค ๐ UIKit Lab์ด๋ผ๋ ์ฑ๋ ๋์์ด ๋์ค ์ ์๊ณ ์ !
- 0
- 1
- 39
Q&A
10๊ฐ ๋ด์ฉ ๋ฌธ์๋๋ฆฝ๋๋ค.
๋ค ์๋ ํ์ธ์!์ง๊ธ ์ผ๋จ ์ง๋ฌธ์ฃผ์ ๋ด์ฉ์์๋, ์ 1๋ฒ์ฐ๋ ๋๋ผ๊ณ ์ฐํ๋ ์ง๋ฅผ ์ ํํ๊ฒ ์ดํดํ๊ณ ๊ณ์ญ๋๋ค.์ ๊ฐ ๋ง์๋๋ฆฐ... Task ๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ '๋์ผ ์์ ์ ์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋์์ ์ ๊ทผ/์ฌ์ฉ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์' Race Condition์ด ๋ฐ์ํ ์ ์๋ค๊ณ ์ค๋ช ๋๋ฆฐ ๊ฒ์, Task๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ ์ผ๋ฐ์ ์ธ ์ํฉ์ ๋ง์๋๋ฆฐ ๊ฒ์ด์์. ์ฆ, ์๋ ์ฝ๋์ ๊ฐ์ด ์กํฐ ๋ด๋ถ์ ๋ฉ์๋๊ฐ ์๋, ์ผ๋ฐ ํจ์ ๋๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด ๋ฑ์ ๋ฉ์๋๋ก ๊ตฌํํ์ ๋ค๋ฉด.. ์๋ฅผ ๋ค์ด, 2๋ฒ ์ฐ๋ ๋ / 3๋ฒ ์ฐ๋ ๋๋ก ๋์ํ๊ฒ ๋๋.. ๊ฐ๊ฐ์ Task ๋ด๋ถ์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ฒ ๋๋ฉด ๋น์ฐํ ๋์ ์ ๊ทผ์ด ์ผ์ด๋ ์ ์์ต๋๋ค.func test() { Task { // 2๋ฒ ์ฐ๋ ๋ } Task { // 3๋ฒ ์ฐ๋ ๋ } } ๋ค๋ง, ์ง๊ธ ์ค์ข ๋๊ป์ ๋ง๋์ ์ฝ๋์ ๊ฒฝ์ฐ, ์ค์ํํธUI ๋ทฐ ๋ด๋ถ์ ๋ฉ์๋๋ก ๋ง๋์ จ๊ธฐ ๋๋ฌธ์.. ์ง๊ธ ๋ง๋์ test( ) ๋ฉ์๋ ์์ฒด๊ฐ @MainActor๋ฅผ ์ฑํํ๊ฒ ๋ฉ๋๋ค. https://developer.apple.com/documentation/swiftui/view Viewํ๋กํ ์ฝ ๊ณต์๋ฌธ์์ ๋ค์ด๊ฐ๋ณด์๋ฉด ํ๋กํ ์ฝ ์์ @MainActor ๋ผ๊ณ ๋ถ์ด์๊ณ , ๊ทธ ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ContentView ๋ด๋ถ์ ๋ฉ์๋๋ค์ด ๋ชจ๋ @MainActor(1๋ฒ ์ฐ๋ ๋)์์ ์คํ๋๊ฒ ๋ฉ๋๋ค. (์ฝ๊ฒ ์ง๊ด์ ์ผ๋ก ์๊ฐํด๋ณด์๋ฉด.. ์ค์ํํธUI์์ ๋ทฐ ๊ด๋ จ ์ฝ๋์ด๋, 1๋ฒ ์ฐ๋ ๋์์ ์คํ๋๋ ๊ฒ์ด์์.)์ฆ, ์ค์ข ๋๊ป์ ๋ง์ํ์ ๋๋ก.. Task ๋ ์กํฐ๋ด๋ถ์์ ์คํ๋๋ค๋ฉด, ํด๋น (์คํ)์กํฐ์ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์์ ๋ฐ๊ฒ ๋๊ธฐ ๋๋ฌธ์, ์ง๊ธ ํ์ฌ ContentView ์์์ test( ) ๋ฉ์๋๋ฅผ ๊ตฌํํ์๋ฉด ๊ฒฐ๊ตญ @MainActor๊ฐ ๋ถ์ด์๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ ๊ฒ๊ณผ ์์ ํ ๋์ผํ ๊ฒ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.@MainActor func test() { Task { // 1๋ฒ ์ฐ๋ ๋ (๋ฉํ ๋ฐ์ดํฐ ์์) } Task { // 1๋ฒ ์ฐ๋ ๋ (๋ฉํ ๋ฐ์ดํฐ ์์) } } ๊ทธ๋์ ๋น์ฐํ ๊ฒฐ๊ณผ๋ 1๋ฒ ์ฐ๋ ๋๋ผ๊ณ ์ฐํ๊ณ ์๋ ๊ฒ์ด๊ณ ์. ๊ทธ๋์ ์กํฐ ๋ด๋ถ์ ๋ฉ์๋๋ก ๊ตฌํํ์๊ณ ๊ทธ ์์์ Task๋ฅผ ์ฌ์ฉํ์๋ฉด, ๊ทธ๊ฑด ๋น์ฐํ ์กํฐ์ ์คํ ์ปจํ ์คํธ๋ฅผ ๋ฌผ๋ ค ๋ฐ์์(์ฝ๊ฒ ๋งํด ์ฐ๋ ๋๋ฅผ ๋ฌผ๋ ค ๋ฐ๊ธฐ ๋๋ฌธ์) ๊ทธ๋ ๊ฒ ํ์๋ฉด ์๋๊ณ .. ์กํฐ ๋ด๋ถ์ ๋ฉ์๋๊ฐ ์๋ ์ผ๋ฐ์ ์ธ ๋ฉ์๋๋ ํจ์๋ก ๊ตฌํํ์๋ฉด.. ๋น์ฐํ ์ผ๋ฐ์ ์ธ ๋น๋๊ธฐ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ์ฐ๋ ๋์์ ๋์์ ์ ๊ทผํ๋ ์ํฉ์ด ๋ฉ๋๋ค. (๋ฌผ๋ก ๋น์ฐํ ์๊ณ ๊ณ์๊ฒ ์ง๋ง, async/await์ ์ฌ์ฉํ๋ ์ผ๋ฐ์ ์ธ ๋น๋๊ธฐ ์ํฉ์.. ๋๋ถ๋ถ ์กํฐ ๋ด๋ถ์ ๋ฉ์๋๊ฐ ์๋๊ป๋๋ค.) ์, ๊ทธ๋ฆฌ๊ณ ํ๋กํ ์ฝ ์ฑํ ๊ท์น๊ณผ ๊ด๋ จํด์๋.. ๊ต์ฌ p.285 ๋ด์ฉ ๋ฐ ๊ฐ์ 60๊ฐ์์ ์ค๋ช ๋๋ฆฌ๊ณ ์์ต๋๋ค. ์ฐธ๊ณ ํ์๋ฉด ๋ ๊ฒ ๊ฐ์์ ! ๊ถ๊ธํ์ ๋ด์ฉ์ด ํด๊ฒฐ๋์ จ๊ธธ ๋ฐ๋ผ์! ๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 2
- 48