์๋
ํ์ญ๋๊น, ๋ฏผํธ์
๋๋ค. ๐
WWDC21 Explore structured concurrency in swift๋ฅผ ๋ณด๊ณ ๋ด์ฉ์ ์ ๋ฆฌํด ๋ณด์์ต๋๋ค.
์์ด ๋ง์์ Part1๊ณผ 2๋ก ๋ถ๋ฆฌํฉ๋๋ค.

๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ
์ด๊ธฐ์ ์ปดํจํฐ๋ฅผ ์ฌ์ฉํ ๋๋ ๋ช ๋ น์ด ์ํธ์ค๋ก ์์ฑ๋์ด ์ ์ด ํ๋ฆ์ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ ์ต๋๋ค. ํ์ง๋ง ์์ฆ์ ์ธ์ด์์ ๊ตฌ์กฐํ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ์ฌ ์ ์ด ํ๋ฆ์ ๊ท ์ผํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ผ์ ๊ฑฐ์ ์์ด์ก์ต๋๋ค.
์๋ฅผ ๋ค์ด if - else๋ฌธ์ ๊ตฌ์กฐํ๋ ์ ์ด ํ๋ฆ์ ์ฌ์ฉํฉ๋๋ค. ์ค์ฒฉ๋ ์ฝ๋ ๋ธ๋ก์ด ์์์ ์๋๋ก ์ด๋ํ๋ ๋์์๋ง ์กฐ๊ฑด๋ถ๋ก ์คํ๋ฉ๋๋ค. ์ด์ฒ๋ผ Swift์์๋ ํด๋น ๋ธ๋ก์ด ์ ์ ๋ฒ์์ธ scoping์ ๋ฐ๋ฆ ๋๋ค. ์ด์ ํด๋น ๋ธ๋ก ๋ด์์ ์ ์๋ ๋ณ์๋ค์ ์๋ช ์ฃผ๊ธฐ๋ ๋ธ๋ก์ ๋ฒ์ด๋ ๋ ๋๋ฉ๋๋ค.
์ด์ฒ๋ผ ์ ์ ๋ฒ์๋ฅผ ๊ฐ์ถ ๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ด ํ๋ฆ๊ณผ ๋ณ์์ ์๋ช ์ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋๋ค. ์ด๋ฅผ ํตํด ์์ฐ์ค๋ฝ๊ฒ ์์๊ฐ ์๊ธฐ๊ณ ์ค์ฒฉ๋์ด ์ฝ๋ ์ ์ฒด๋ฅผ ์์์ ์๋๊น์ง ์์ํ๊ฒ ์ฝ์ ์ ์์ต๋๋ค.
ํ์ง๋ง ๋น๋๊ธฐ์ ์ด๊ณ ๋์์ฑ ์๋ ์ฝ๋๋ฅผ ์์ฑ ํ ๋, ์ด๋ฌํ ๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ์ด ์ ๋๋ก ์ฌ์ฉ๋๊ณ ์์ง ์์์ต๋๋ค. ์ด์ ๊น์ง ์ฌ์ฉํ๋ ์ฝ๋ฐฑ ํจํด์ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ฐํ - ์ ํ์์ ์ด์ฉํฉ๋๋ค. ์ด๋ ์์์ ์๋๋ก ์ฝ๊ณ ์ ํ๋ ๊ตฌ์กฐ์ ์ ์ด ํ๋ฆ์์ ๋ฒ์ด๋ฉ๋๋ค. ๋๋ฌธ์ Swift Concurrency, ์ฆ async/await์์๋ ํ-๋ค์ด ํ์์ผ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ๊ตฌํ๋์์ต๋๋ค.
๋์์ฑ, Task
async/await์ ์ฌ์ฉํ ๋ ์ฒ๋ฆฌํด์ผํ๋ ์์ด ๋ง์์ง๋ค๋ฉด, ์์๋๋ก ํ๋์ฉ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋ ๋ณต์กํ๊ณ ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค. ๋๋ฌธ์ ์ฌ๋ฌ ์์ ์ด ๋ณ๋ ฌ๋ก ์คํ๋ ์ ์๋๋ก ๋์์ฑ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด์๋ ์ถ๊ฐ์ ์ธ Task์ ์์ฑ์ด ํ์ํฉ๋๋ค.
Task๋ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ์๋ก์ด ์คํ context๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ฐ Task๋ ๋ค๋ฅธ ์คํ context์ ๋์์ ์คํ๋ฉ๋๋ค. ํนํ Task๋ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ๋ณ๋ ฌ ์คํ์ด ๊ฐ๋ฅํ ๋ ์๋์ผ๋ก ์คํ๋ฉ๋๋ค.
4๊ฐ์ง ์์ ์ด ์์ต๋๋ค.
1. Structured Concurrency (async - let)
์ผ๋ฐ์ ์ธ let์ =๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์๋ ๋ณ์๋ช , ์ค๋ฅธ์ชฝ์๋ ์ด๊ธฐํ ํํ์์ ์์ฑํฉ๋๋ค. let์ ๋๋ฌ์, ์ด๊ธฐํ ํ๋ก๊ทธ๋จ์ ํ๊ฐํ์ฌ ๊ฐ์ ์์ฑํ๋ ๋ฐฉ์์ ๋๋ค.
let result = URLSession.shared.data()
URL์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆด ์ ์๋๋ฐ, ์ด๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๋ก๋ ๋ ํ ๋ค์์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ , ํด๋น ๊ฐ์ result์ ๋ฐ์ธ๋ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค.

๋ค์ด๋ก๋์ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ผ๋ ๋ฐ์ดํฐ ๋ค์ด๋ก๋๋ฅผ ์์ํ๊ณ ๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก ํ์ํ ๋๊น์ง ๋ค๋ฅธ ์์ ์ ๊ณ์ํ๋๋ก ์ค์ ํ๋ ๊ฒ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ด๋ let ์์ async ํค์๋๋ฅผ ๋ถ์ด๋ฉด ๋ฉ๋๋ค.
async let result = URLSession.shared.data()
์ด๋ ๊ฒ ์์ฑํ๋ฉด ์ค์ ๋ก result๋ฅผ ๋ง๋๊ธฐ ์ ์ ์์ Task๋ฅผ ์์ฑํฉ๋๋ค. ์์ Task๋ ๋ณธ์ธ์ ์์ฑํ Task์ ํ์ Task์ ๋๋ค.

์ด์ ์์ ์์ ๊ทธ๋ฆผ๊ณผ๋ ๋ฌ๋ฆฌ ํ์ดํ๊ฐ ๋๊ฐ ๋์ต๋๋ค. ํ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ํ๋ ์์ Task๋ฅผ, ๋ค๋ฅธ ํ๋๋ ๋ณ์ result๋ฅผ ์๋ฆฌ ํ์์ ๊ฐ์ ๋ฐ์ธ๋ฉํ๋ ๋ถ๋ชจ Task๋ฅผ ์ํ ํ์ดํ์ ๋๋ค.
์ด๋ result์ ์ค์ ๊ฐ์ด ํ์ํ ํํ์์ ๋๋ฌํ๋ฉด, ๋ถ๋ชจ๋ ์์์ด ์์ ์ ์๋ฃํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. ์ดํ ์์์ด ์์ ์ ์๋ฃํ๋ฉด result์ ๋ํ ์๋ฆฌ ํ์์๋ฅผ ์ฑ์ธ ์ ์์ต๋๋ค.
์ด ์ฝ๋์์ URLSession ํธ์ถ์ ์ค๋ฅ๋ฅผ ๋์ง ์๋ ์์ต๋๋ค. ์ฆ, ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆด ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด try ์์ฑ์ด ํ์ํฉ๋๋ค. ์ด๋ result ๊ฐ์ ๋ค์ ์ฝ์ด๋ ํด๋น ๊ฐ์ ๋ค์ ๊ณ์ฐํ์ง๋ ์์ต๋๋ค.
์์ Task๋ค์ ์ค์ ๋ก ์์ ํธ๋ฆฌ๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ณ์ธต ๊ตฌ์กฐ์ ์ผ๋ถ์ ๋๋ค. ์ด ํธ๋ฆฌ๋ ๊ตฌ์กฐํ๋ ๋์์ฑ์ ์ค์ํ ๋ถ๋ถ์ผ๋ก, Task์ ์์ฑ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ทจ์, ์ฐ์ ์์, ์์ ๋ก์ปฌ ๋ณ์ ๋ฑ์ด ์์ต๋๋ค. ํ๋์ async ํจ์์์ ๋ค๋ฅธ async ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋์ผํ Task๊ฐ ํธ์ถ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ ํด๋น ํจ์๋ ๊ทธ Task์ ๋ชจ๋ ์์ฑ์ ์์๋ฐ์ต๋๋ค.
async let์ ์ฌ์ฉํ์ฌ ์๋ก์ด ๊ตฌ์กฐํ๋ Task๋ฅผ ๋ง๋ค ๋, ๊ทธ๊ฒ์ ํ์ฌ ํจ์๊ฐ ์คํ๋๋ Task์ ์์์ด ๋ฉ๋๋ค. ๋ถ๋ชจ Task์ ์์ Task์ ๊ด๊ณ๊ฐ ๋๋ ๊ฒ์ด์ง ํน์ ํจ์์ ์์์ ์๋์ง๋ง, ์๋ช ์ฃผ๊ธฐ๋ ํจ์์ ๋ฒ์๊ฐ ์ง์ ๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ์๊ธฐ๋ ์์ ํธ๋ฆฌ๋ ๊ฐ ๋ถ๋ชจ Task์ ์์ Task ๊ฐ์ ์ฐ๊ฒฐ๋ก ๊ตฌ์ฑ๋๋๋ฐ, ์ด ์ฐ๊ฒฐ์ ๋ถ๋ชจ Task๋ ์์ Task๊ฐ ๋ชจ๋ ๋๋ ํ์๋ง ์์ ์ ๋ง์น ์ ์๋ค๋ ๊ท์น์ ๊ฐ์ ํฉ๋๋ค. ์ด ๊ท์น์ ์์ Task๊ฐ ๊ธฐ๋ค๋ ค์ง์ง ์๋ ๋น์ ์์ ์ธ ์ ์ด ํ๋ฆ์ด ๋ฐ์๋ ๋๋ ์ ์ฉ๋ฉ๋๋ค.

์๋ฅผ ๋ค์ด, ์์ ๊ทธ๋ฆผ์์ metadata ์์ ์ ๊ธฐ๋ค๋ฆฐ ํ์ ์ด๋ฏธ์ง data Task๋ฅผ ๊ธฐ๋ค๋ฆฌ๋๋ฐ ์ฒซ ๋ฒ์งธ๋ก ๊ธฐ๋ค๋ฆฐ Task๊ฐ ์ค๋ฅ๋ฅผ ๋์ง๋ฉฐ ๋๋ฌ๋ค๋ฉด fetchOne ํจ์๋ ๊ทธ ์ค๋ฅ๋ฅผ ๋์ง๋ฉฐ ์ฆ์ ์ข ๋ฃํด์ผ ํฉ๋๋ค.
์ด๋ ๋๋ฒ์งธ ๋ค์ด๋ก๋๋ฅผ ์ํํ๋ Task์์๋ Swift๊ฐ ์๋์ผ๋ก ๊ธฐ๋ค๋ฆฌ์ง ์์ Task๋ฅผ ์ทจ์๋ ๊ฒ์ผ๋ก ํ์๋๊ณ , ํจ์๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ์ ๊ทธ Task๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ด Task๋ฅผ ์ทจ์๋ ๊ฒ์ผ๋ก ํ์๋๋ค๊ณ ํด์ Task๊ฐ ์ค์ง๋๋ ๊ฒ์ ์๋๋๋ค. ๊ทธ์ ํด๋น Task์ ๋ํ ๊ฒฐ๊ณผ๊ฐ ๋ ์ด์ ํ์ํ์ง ์๋ค๋ ๊ฒ์ Task์ ์๋ฆฌ๋ ๊ฒ์ด๊ณ , ์ค์ ๋ก ์์ ์ด ์ทจ์๋๋ฉด ๊ทธ ์์ ์ ๋ชจ๋ ํ์ ์์ ๋ ์๋์ผ๋ก ์ทจ์ ์ํ๊ฐ ๋ฉ๋๋ค.
๋๋ฌธ์ ํจ์ fetchOne์ ์์ ์ด ์ง์ ๋๋ ๊ฐ์ ์ ์ผ๋ก ์์ฑํ ๋ชจ๋ ๊ตฌ์กฐํ๋ ์์ ๋ค์ด ์๋ฃ๋ ํ, ์ค๋ฅ๋ฅผ ๋์ง๋ฉฐ ์ข ๋ฃ๋๋๋ฐ ์ด ๋ณด์ฅ์ ๊ตฌ์กฐํ๋ ๋์์ฑ์์ ๋งค์ฐ ์ค์ํ ์์น์ ๋๋ค. ์ด๋ ์์ ์ ์์ ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ๋์์ ์ฃผ์ด, ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฃผ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ARC์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค์๋ก ์์ ์ด ์ ์ถ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
์ทจ์
ํ์ฌ ์์ ์ ์ทจ์ ์ฌ๋ถ ์ํ๋ ๋ชจ๋ ํจ์์์ ํ์ธํ ์ ์๊ณ , ์ฝ๋๋ ์ทจ์๋ฅผ ๋ช ์์ ์ผ๋ก ํ์ธํ๊ณ ์ ์ ํ ๋ฐฉ๋ฒ์ผ๋ก ์คํ์ ์ข ๋ฃํด์ผ ํฉ๋๋ค. ํนํ ๊ธด ์๊ฐ ๋์ ์คํ๋๋ ๊ณ์ฐ์ ํฌํจํ๋ ๊ฒฝ์ฐ, ์ทจ์๋ฅผ ์ผ๋์ ๋๊ณ API๋ฅผ ๊ตฌํํ๋ผ๊ณ ๋งํฉ๋๋ค.
isCancelled๋ฅผ Bool๊ฐ์ผ๋ก ์ป์ ์ ์๊ณ , ์ด๋ฅผ ํตํด ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ๋ถ๋ถ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋ ์๋ ์์ต๋๋ค. ์ทจ์๋ ๊ฒฝ์ฐ์ ์ทจ์๋์ง ์์ ๊ฒฝ์ฐ๋ก ๋๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง ์ทจ์ ์ค์๋ ์ฝ๋๊ฐ ์์ ํ ๊ฒฐ๊ณผ๋ฅผ ์๊ตฌํ๊ธฐ ๋๋ฌธ์ ๋ถ๋ถ์ ์ธ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ ๋ ์ ์์์ ๋ช ์ํ์ง ์๋๋ค๋ฉด, ์์ ์ทจ์๊ฐ ์ฌ์ฉ์์๊ฒ ์น๋ช ์ ์ธ ์ค๋ฅ๋ฅผ ์ผ์ผํฌ ์๋ ์์ต๋๋ค.
2. Group Task
๋ค๋ง async let์ ๋ณ์ ๋ฐ์ธ๋ฉ๊ณผ ๊ฐ์ด ๋ฒ์๊ฐ ์ ํ๋ฉ๋๋ค. async let์ด ๋ถ์ ์์ ๋งํผ ์์๋๊ณ ์๋ฃ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ํ ์ด๋ ๋ค์ ๋ฃจํ ๋ฐ๋ณต์ด ์์๋๊ธฐ ์ ์ ์๋ฃ๋์ด์ผ ํฉ๋๋ค.
์ด๋ Task Group์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋์ ๋์์ฑ ์์ ์ ๊ณตํ๋๋ก ์ค๊ณ๋ ๊ตฌ์กฐ์ ๋์์ฑ์ ํ ํํ๋ก withThrowingTaskGroup ํจ์๋ฅผ ํธ์ถํด ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ํจ์๋ ์ค๋ฅ๋ฅผ ๋์ง ์ ์๋ ์์ task๋ฅผ ์์ฑํ ์ ์๋ ๋ฒ์๊ฐ ์ ํ๋ ๊ทธ๋ฃน ๊ฐ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฃน์ ์ถ๊ฐ๋ ์์ ์ ๊ทธ๋ฃน์ด ์ ์๋ ๋ธ๋ก ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ๋ชปํฉ๋๋ค.
๊ทธ๋ฃน์ ์ถ๊ฐ๋๋ฉด ์์ ์์ ์ ์ฆ์ ์คํ๋๋ฉฐ, ์์๋ ๋ฌด๊ดํฉ๋๋ค. ๊ทธ๋ฃน ๊ฐ์ฒด๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ค๋ฉด, ๊ทธ ์์ ๋ชจ๋ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ์๋ฌต์ ์ผ๋ก ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋๋ฐ ์ด๋ ์์ ์ค๋ช ํ ์์ ํธ๋ฆฌ ๊ท์น์ ๊ฒฐ๊ณผ์ ๋๋ค. ๊ทธ๋ฃน ์์ ๋ ๊ตฌ์กฐํ ๋์ด ์๊ธฐ ๋๋ฌธ์ด์ฃ .

์ด์ฒ๋ผ ํ๋ก๊ทธ๋จ์์ ๋์์ฑ ์์ ์ฆ๊ฐ์ํฌ ๋ ๋ฐ์ํ ์ ์๋ ์ค์๊ฐ ์์ต๋๋ค. ์ฐ์ฐํ๊ฒ ๋ฐ์๋๋ Data Race์ ๋๋ค. WWDC ๋ด์ ์์ ์์๋ ์ด๋ฅผ ํผํ๊ธฐ ์ํด์ ๊ฐ ์์ ์์ ์ด ๊ฐ์ ๋ฐํํ๊ฒ ํ๊ณ , ๋ถ๋ชจ ์์ ์ด ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฑ ์์ ์ง๋๋ก ๊ตฌํํ์ต๋๋ค.
๊ทธ๋ฃน์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ณตํ๋ ์ค, ์ค๋ฅ๊ฐ ๋ฐ์ํ ์์ ์์
์ ๋ง๋์ ๊ทธ ์ค๋ฅ๊ฐ ๊ทธ๋ฃน ๋ธ๋ก์์ ๋์ ธ์ง๋ฉด ๊ทธ๋ฃน ๋ด์ ๋ชจ๋ ์์
์ ์๋ฌต์ ์ผ๋ก ์ทจ์๋๊ณ ๋ชจ๋ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ฉ๋๋ค. ์ด๋ async let๊ณผ ๋์ผํ๊ฒ ๋์ํ์ง๋ง, ๊ทธ๋ฃน์ด ๋ธ๋ก์์ ์ ์์ ์ผ๋ก ์ข
๋ฃ๋์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ ์ฐจ์ด์ ์ด ๋ํ๋ฉ๋๋ค. ์์
๋ค์ด ์ทจ์๋์ง ์๊ณ ๋๊ธฐ๋ง ํ๊ธฐ ๋๋ฌธ์ ์์
์ ์ฒ๋ฆฌํด์ฃผ์ด์ผ ํฉ๋๋ค. ๋ธ๋ก์ ์ข
๋ฃํ๊ธฐ ์ ์ ๊ทธ๋ฃน์ cancelAll ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์์
์ ์๋์ผ๋ก ์ทจ์ํ ์๋ ์์ต๋๋ค.
๋ค์ ๊ธ์ ๊ณ์...
'๐ ๊ฐ๋ฐ > ๐ ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Network] TLS/SSL (1) | 2024.10.28 |
---|---|
[ํจ๋ฌ๋ค์] ํจ์ํ ํ๋ก๊ทธ๋๋ฐ (1) | 2024.10.23 |
[iOS]Unit Test์ ์ฌ์ฉ (0) | 2024.02.05 |
[๋์์ธ ํจํด]Delegate Pattern (2) | 2024.01.27 |
[๋์์ธ ํจํด]Observer Pattern (1) | 2024.01.27 |