Concurrent ?
ํ๋ก์ธ์ค, ์ค๋ ๋, ์ฝ๋ฃจํด
์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ ๋ ์ด์์ฒด์ ๋ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ ์ฌ๊ธฐ์ ์ค๋ ๋๋ฅผ ์ฐ๊ฒฐํ ๋ค์, ๋ฉ์ธ ์ค๋ ๋(main thread)๋ก ์๋ ค์ง ํด๋น ์ค๋ ๋๋ฅผ ์์ํ๋ค.
ํ๋ก์ธ์ค
ํ๋ก์ธ์ค๋ ์คํ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ธ์คํด์ค๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ก ๊ตฌ์ฑ๋ ์ ์๋ค.
์ค๋ ๋
์คํ ์ค๋ ๋๋ ํ๋ก์ธ์ค๊ฐ ์คํํ ์ผ๋ จ์ ๋ช ๋ น์ ํฌํจํ๋ค. ์ค๋ ๋๊ฐ ๋๋๋ฉด ํ๋ก์ธ์ค์ ๋ค๋ฅธ ์ค๋ ๋์ ์๊ด์์ด ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๋ค.
๊ธฐ๋ณธ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ฉด main() ํจ์์ ๋ช ๋ น ์งํฉ์ด ํฌํจ๋ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์์ฑ๋๋ค. doWork()์ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋๋ฏ๋ก doWork()์ด ์ข ๋ฃ๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์ด ์ข ๋ฃ๋๋ค.
์ค๋ ๋ ์์์ ๋ช ๋ น์ ํ ๋ฒ์ ๋๋ผ์ฉ ์คํ๋ผ ์ค๋ ๋๊ฐ ๋ธ๋ก(block)๋๋ฉด ๋ธ๋ก์ด ๋๋ ๋๊น์ง ๊ฐ์ ์ค๋ ๋์์ ๋ค๋ฅธ ๋ช ๋ น์ ์คํํ ์ ์๋ค. ๊ทธ๋ฌ๋ ๋ง์ ์ค๋ ๋๊ฐ ๊ฐ์ ํ๋ก์ธ์ค์์ ์์ฑ๋ ์ ์์ผ๋ฉฐ ์๋ก ํต์ ํ ์ ์๋ค.
์ฝํ๋ฆฐ์ด ๋์์ฑ์ ๊ตฌํํ ๋ฐฉ์์ ๋ณด๋ฉด ์ฌ๋ฌ๋ถ์ด ์ง์ ์ค๋ ๋๋ฅผ ์์ํ๊ฑฐ๋ ์ค์งํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋๋ค. ํ๋ ์ค์ ์ฝ๋๋ก ์ฝํ๋ฆฐ์ด ํน์ ์ค๋ ๋๋ ์ค๋ ๋ ํ์ ์์ฑํด์ ์ฝ๋ฃจํด์ ์คํํ๋๋ก ์ง์ํ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ์ค๋ ๋์ ๊ด๋ จ๋ ๋๋จธ์ง ์ฒ๋ฆฌ๋ ํ๋ ์์ํฌ์ ์ํด ์ํ๋๋ค.
์ฝ๋ฃจํด
์ฝํ๋ฆฐ ๋ฌธ์์์๋ ์ฝ๋ฃจํด์ ๊ฒฝ๋ ์ค๋ ๋๋ผ๊ณ ๋ ํ๋ค. ๋๋ถ๋ถ์ ์ค๋ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฝ๋ฃจํด์ด ํ๋ก์ธ์๊ฐ ์คํํ ๋ช ๋ น์ด ์งํฉ์ ์คํ์ ์ ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ ์ฝ๋ฃจํด์ ์ค๋ ๋์ ๋น์ทํ ๋ผ์ดํ ์ฌ์ดํด์ ๊ฐ๊ณ ์๋ค.
์ฝ๋ฃจํด์ ์ค๋ ๋ ์์์ ์คํ๋๋ค. ์ค๋ ๋ ํ๋์ ๋ง์ ์ฝ๋ฃจํด์ด ์์ ์ ์์ง๋ง ์ฃผ์ด์ง ์๊ฐ์ ํ๋์ ์ค๋ ๋์์ ํ๋์ ๋ช ๋ น๋ง์ด ์คํ๋ ์ ์๋ค. ์ฆ ๊ฐ์ ์ค๋ ๋์ 10๊ฐ์ ์ฝ๋ฃจํด์ด ์๋ค๋ฉด ํด๋น ์์ ์๋ ํ๋์ ์ฝ๋ฃจํด๋ง ์คํ๋๋ค. ์ค๋ ๋์ ์ฝ๋ฃจํด์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์ฝ๋ฃจํด์ด ๋น ๋ฅด๊ณ ์ ์ ๋น์ฉ์ผ๋ก ์์ฑํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์์ฒ ๊ฐ์ ์ฝ๋ฃจํด๋ ์ฝ๊ฒ ์์ฑํ ์ ์์ผ๋ฉฐ, ์์ฒ ๊ฐ์ ์ค๋ ๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๋น ๋ฅด๊ณ ์์๋ ํจ์ฌ ์ ๊ฒ ์ฌ์ฉํ๋ค.
๋ค์ ํจ์๋ ํ๋ผ๋ฏธํฐ amount์ ์ง์ ๋ ์๋งํผ ์ฝ๋ฃจํด์ ์์ฑํด ๊ฐ ์ฝ๋ฃจํด์ 1์ด ๊ฐ ์ง์ฐ์ํจ ํ ๋ชจ๋ ์ฝ๋ฃจํด์ด ์ข ๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ฐํํ๋ค.
ํ ์คํธ ํ๊ฒฝ์์ amount๋ฅผ 10,000์ผ๋ก ์คํํ ๋ ์ฝ 1,160ms๊ฐ ๊ฑธ๋ฆฌ๋๋ฐ ๋ฐํด 100,000์ผ๋ก ์คํํ๋ ๋ฐ 1,649ms๊ฐ ์์๋๋ค. ์ฝํ๋ฆฐ์ ๊ณ ์ ๋ ํฌ๊ธฐ์ ์ค๋ ๋ ํ์ ์ฌ์ฉํ๊ณ ์ฝ๋ฃจํด์ ์ค๋ ๋๋ค์ ๋ฐฐํฌํ๊ธฐ ๋๋ฌธ์ ์คํ ์๊ฐ์ด ๋งค์ฐ ์ ๊ฒ ์ฆ๊ฐํ๋ค. ๋ฐ๋ผ์ ์์ฒ ๊ฐ์ ์ฝ๋ฃจํด์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ฑฐ์ ์ํฅ์ด ์๋ค.
์ฝ๋ฃจํด์ด ํน์ ์ค๋ ๋ ์์์ ์คํ๋๋๋ผ๋ ์ค๋ ๋์ ๋ฌถ์ด์ง ์๋๋ค๋ ์ ์ ์ดํดํด์ผ ํ๋ค. ์ฝ๋ฃจํด์ ์ผ๋ถ๋ฅผ ํน์ ์ค๋ ๋์์ ์คํํ๊ณ , ์คํ์ ์ค์งํ ๋ค์ ๋์ค์ ๋ค๋ฅธ ์ค๋ ๋์์ ๊ณ์ ์คํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
์ด์ ๊ฐ์ด ๋ค๋ฅธ ์ค๋ ๋์ ๋ค์ ์์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ ์๊ฒ ๋ ๊ฒ์ด๋ค.
์ค๋ ๋๋ ํ ๋ฒ์ ํ๋์ ์ฝ๋ฃจํด๋ง ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ํ๋ ์์ํฌ๊ฐ ํ์์ ๋ฐ๋ผ ์ฝ๋ฃจํด์ ์ค๋ ๋๋ค ์ฌ์ด์ ์ฎ๊ธฐ๋ ์ญํ ์ ํ๋ค.
๋ด์ฉ ์ ๋ฆฌ
์ค๋ ๋๋ฅผ ๋ธ๋กํ๋ค๋ ๊ฒ์ ๊ทธ ์ค๋ ๋์์ ์ฝ๋์ ์คํ์ ์ค์งํ๋ค๋ ์๋ฏธ์ธ๋ฐ, ์ฌ์ฉ์์ ์ํธ์์ฉํ๋ ์ค๋ ๋๋ ๋ธ๋ก๋์ง ์์์ผ ํ๋ค.
๋์์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์์ ํ ๊ฐ ์ด์์ ์ค๋ ๋์์ ์คํ๋ ๋ ๋ฐ์ํ๋ค.
๋์์ฑ์ ๋ํด
์ฌ๋ฐ๋ฅธ ๋์์ฑ ์ฝ๋๋ ๊ฒฐ์ ๋ก ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๋ง ์คํ ์์์์๋ ์ฝ๊ฐ์ ๊ฐ๋ณ์ฑ์ ํ์ฉํ๋ ์ฝ๋๋ค. ๊ทธ๋ฌ๋ ค๋ฉด ์๋ก ๋ค๋ฅธ ๋ถ๋ถ์ด ์ด๋ ์ ๋ ๋ ๋ฆฝ์ฑ์ด ์์ด์ผ ํ๋ฉฐ ์ฝ๊ฐ์ ์กฐ์ ๋ ํ์ํ๋ค. ๋์์ฑ์ ์ดํดํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์์ฐจ์ ์ธ ์ฝ๋๋ฅผ ๋์์ฑ ์ฝ๋์ ๋น๊ตํ๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ๋ฐํ๋๊ธฐ ์ ๊น์ง ์ฐ๋ฝ์ฒ ์ ๋ณด๋ฅผ ์์ฒญํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ์์ฐจ ์ฝ๋์ ์ฅ์ ์ด๋ค. ์ ํํ ์คํ ์์๋ฅผ ์ฝ๊ฒ ์ ์ ์์ด์ ์์ธกํ์ง ๋ชปํ ์ผ์ด ๋ฒ์ด์ง์ง๋ ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ์์ฐจ ์ฝ๋์๋ ๋ ๊ฐ์ง ํฐ ๋ฌธ์ ์ ์ด ์๋ค.
๋์์ฑ ์ฝ๋์ ๋นํด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
์ฝ๋๊ฐ ์คํ๋๋ ํ๋์จ์ด๋ฅผ ์ ๋๋ก ํ์ฉํ์ง ๋ชปํ ์ ์๋ค.
getUserInfo๊ฐ 5์ด๊ฐ ๊ฑธ๋ฆฌ๊ณ getContactInfo๊ฐ 5์ด๊ฐ ๊ฑธ๋ฆฐ๋ค๋ฉด getProfile์ ํญ์ 10์ด ์ด์ ๊ฑธ๋ฆด ๊ฒ์ด๋ค.
getProfile์ ๋์์ฑ ๊ตฌํ์ ๊ด๋ ์ดํด๋ณด์.
asyncGetUserInfo()์ asyncGetContactInfo()๋ ์๋ก ๋ค๋ฅธ ์ค๋ ๋์์ ์คํ๋๋๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋์์ฑ์ด๋ผ๊ณ ํ๋ค.
getProfile์ ๋์์ฑ ๊ตฌํ ๋ฒ์ ์ ์์ฐจ์ ๊ตฌํ๋ณด๋ค ๋ ๋ฐฐ ๋น ๋ฅด๊ฒ ์ํ๋ ์ ์์ง๋ง ์คํํ ๋ ์ฝ๊ฐ์ ๊ฐ๋ณ์ฑ์ด ์๋ค. ๊ทธ๊ฒ์ด createProfile()์ ํธ์ถํ ๋ ๋๊ฐ์ wait() ํธ์ถ์ด ์๋ ์ด์ ๋ค. asyncGetUserInfo()์ asyncGetContactInfo()๊ฐ ๋ชจ๋ ์๋ฃ๋ ๋๊น์ง getProfile()์ ์คํ์ ์ผ์ ์ค๋จํ๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๊ฒ์ด ๋์์ฑ์ ๊น๋ค๋ก์ด ๋ถ๋ถ์ด๋ค. ์ฝ๋์ ์ค๋ ๋ฆฝ์ ์ธ(semi-independent)๋ถ๋ถ์ด ์์ฑ๋๋ ์์์ ๊ด๊ณ์์ด ๊ฒฐ๊ณผ๊ฐ ๊ฒฐ์ ์ ์ด์ด์ผ ํจ์ ๋ณด์ฅํด์ผ ํ๋ค.
๋์์ฑ์ ๋ณ๋ ฌ์ฑ์ด ์๋๋ค
ํํ ๋์์ฑ๊ณผ ๋ณ๋ ฌ์ฑ์ ํผ๋ํ๊ณค ํ๋ค. ๋ ๊ฐ์ ์ฝ๋๊ฐ ๋์์ ์คํ๋๋ค๋ ์ ์์ ๋ ๋ค ๋น์ทํด ๋ณด์ด๊ธด ํ๋ค. ๋์ ์ฐจ์ด์ ์ ๊ฐ์ ํ๋ก์ธ์ค ์์์ ์๋ก ๋ค๋ฅธ ๋ช ๋ น ์งํฉ์ ํ์๋ผ์ธ์ด ๊ฒน์น ๋ ๋์์ฑ์ด ๋ฐ์ํ๋ค๋ ์ ์ด๋ค. ๋์์ฑ์ ์ ํํ ๊ฐ์ ์์ ์ ์คํ๋๋์ง ์ฌ๋ถ์๋ ์๊ด์ด ์๋ค. ๋ง์ฝ ์์ ์ฝ๋๋ฅผ ๋จ์ผ ์ฝ์ด์์ ๋ฐ์ํ๋ค๋ฉด ๋์์ฑ์ด์ง๋ง ๋ณ๋ ฌ์ ์๋๋ค. ๋จ์ผ ์ฒ๋ฆฌ ์ฅ์น๋ X์ Y ์ค๋ ๋ ์ฌ์ด์ ๊ต์ฐจ ๋ฐฐ์น๋๋ฉฐ, ๋ ๊ฐ์ ์ ์ฒด ์ผ์ ์ด ๊ฒน์น์ง๋ง ์ง์ ๋ ์์ ์ ๋ ์ค ํ๋๋ง ์คํ๋๊ณ ์๋ค.
๋ฐ๋ฉด์ ๋ณ๋ ฌ ์คํ์ ๋ ์ค๋ ๋๊ฐ ์ ํํ ๊ฐ์ ์์ ์ ์คํ๋ ๋๋ง ๋ฐ์ํ๋ค. ๋ ๊ฐ์ ์ฝ์ด๊ฐ ์๋ ์ปดํจํฐ์์ getProfile()์ด ์คํ๋๊ณ ์๋ ๊ฒฝ์ฐ ์ฝ์ด ํ๋๋ asyncGetUserInfo()์ ๋ช ๋ น์ ์คํํ๊ณ ๋ค๋ฅธ ํ๋์ ์ฝ์ด์์ asyncGetContactInfo()์ ๋ช ๋ น์ ์คํํ๋ค. ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๋์์ฑ์ ๋ ๊ฐ ์ด์์ ์๊ณ ๋ฆฌ์ฆ์ ์คํ ์๊ฐ์ด ๊ฒน์ณ์ง ๋ ๋ฐ์ํ๋ค. ๋ง์ฝ ๋จ์ผ ์ฝ์ด์์ ์คํ๋๋ฉด ๋ณ๋ ฌ์ด ์๋๋ผ ๋์์ ์คํ๋๋๋ฐ, ๋จ์ผ ์ฝ์ด๊ฐ ์๋ก ๋ค๋ฅธ ์ค๋ ๋์ ์ธ์คํธ๋ญ์ ์ ๊ต์ฐจ๋ฐฐ์นํด์ ์ค๋ ๋๋ค์ ์คํ์ ํจ์จ์ ์ผ๋ก ๊ฒน์ณ์ ์คํํ๋ค.
๋ณ๋ ฌ์ ๋ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ด ์ ํํ ๊ฐ์ ์์ ์ ์คํ๋ ๋ ๋ฐ์ํ๋ค. ์ด๊ฒ์ด ๊ฐ๋ฅํ๋ ค๋ฉด 2๊ฐ ์ด์์ ์ฝ์ด์ 2๊ฐ ์ด์์ ์ค๋ ๋๊ฐ ์์ด์ผ ๊ฐ ์ฝ์ด๊ฐ ๋์์ ์ค๋ ๋์ ์ธ์คํธ๋ญ์ ์ ์คํํ ์ ์๋ค.
CPU ๋ฐ์ด๋์ I/O ๋ฐ์ด๋
CPU ๋ฐ์ด๋
CPU๋ง ์๋ฃํ๋ฉด ๋๋ ์์ ์ ์ค์ฌ์ผ๋ก ๊ตฌํ๋๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋ง๋ค. ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ์คํ ์ค์ธ CPU์ ์ฑ๋ฅ์ ์ข์ฐ๋๋ฉฐ CPU๋ง ์ ๊ทธ๋ ์ด๋ํด๋ ์ฑ๋ฅ์ด ํฅ์๋๋ค.
๋จ์ด๋ฅผ ๊ฐ์ ธ์์ ์ข์ฐ๊ฐ ๊ฐ์ ๋จ์ด์ธ์ง๋ฅผ ํ๋ณํ๋ ๊ฐ๋จํ ์๊ณ ๋ฆฌ์ฆ์ ์ดํด๋ณด์
์์ญ ๋ง ๊ฐ์ ๋จ์ด๋ฅผ ๋ณด๋ด๋๋ก ์ฝ๋๋ฅผ ๋ฐ๊พธ๋ฉด filterPalindromes()๋ ๋ ์ค๋ ๊ฑธ๋ฆด ๊ฒ์ด๋ค. ์ฝ๋๋ฅผ ๋ ๋น ๋ฅธ CPU์์ ์คํํ๋ฉด ์ฝ๋์ ๋ณ๊ฒฝ ์์ด๋ ์ฑ๋ฅ์ด ํฅ์๋๋ค.
I/O ๋ฐ์ด๋
I/O ๋ฐ์ด๋๋ ์ ์ถ๋ ฅ ์ฅ์น์ ์์กดํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์คํ ์๊ฐ์ ์ ์ถ๋ ฅ ์ฅ์น์ ์๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ฐ, ์์ปจ๋ ๋ฌธ์๋ฅผ ์ฝ์ด์ ๋ฌธ์์ ๊ฐ ๋จ์ด๋ฅผ filterPalindromes()์ ์ ๋ฌํด ์ข์ฐ๊ฐ ๊ฐ์ ๋จ์ด๋ฅผ ์ถ๋ ฅํ๋ ์๊ณ ๋ฆฌ์ฆ์ด I/O ๋ฐ์ด๋๋ค. ๋คํธ์ํน์ด๋ ์ปดํจํฐ ์ฃผ๋ณ๊ธฐ๊ธฐ๋ก๋ถํฐ์ ์ ๋ ฅ์ ๋ฐ๋ ์์ ๋ค๋ I/O ์์ ์ด๋ค.
CPU ๋ฐ์ด๋ ์๊ณ ๋ฆฌ์ฆ์์์ ๋์์ฑ๊ณผ ๋ณ๋ ฌ์ฑ
CPU ๋ฐ์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ์ฐ ๋ค์ค ์ฝ์ด์์ ๋ณ๋ ฌ์ฑ์ ํ์ฉํ๋ฉด ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ง๋ง ๋จ์ผ ์ฝ์ด์์ ๋์์ฑ์ ๊ตฌํํ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋๊ธฐ๋ ํ๋ค.
๋จ์ผ ์ฝ์ด์์ ์คํ
๋จ์ผ ์ฝ์ด์์ ์คํ๋๋ค๋ฉด ํ๋์ ์ฝ์ด๊ฐ 3๊ฐ์ ์ค๋ ๋ ์ฌ์ด์์ ๊ต์ฐจ ๋ฐฐ์น๋๋ฉฐ ๋งค๋ฒ ์ผ์ ๋์ ๋จ์ด๋ฅผ ํํฐ๋งํ๊ณ ๋ค์ ์ค๋ ๋๋ก ์ ํ๋๋ค. ์ ํ ํ๋ก์ธ์ค๋ฅผ ์ปจํ ์คํธ ์ค์์นญ์ด๋ผ๊ณ ํ๋ค.
์ปจํ ์คํธ ์ค์์นญ์ ํ์ฌ ์ค๋ ๋์ ์ํ๋ฅผ ์ ์ฅํ ํ ๋ค์ ์ค๋ ๋์ ์ํ๋ฅผ ์ ์ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด ํ๋ก์ธ์ค์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค. ์์ฐจ์ ๊ตฌํ์์๋ ๋จ์ผ ์ฝ์ด๊ฐ ๋ชจ๋ ์์ ์ ์ํํ์ง๋ง ์ปจํ ์คํธ ์ค์์นญ์ด ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ณ๋ ฌ ์คํ
๋ณ๋ ฌ ์คํ์ ๊ฒฝ์ฐ ๊ฐ ์ค๋ ๋๊ฐ ํ๋์ ์ ์ฉ ์ฝ์ด์์ ์คํ๋๋ค๊ณ ๊ฐ์ ํ๋ฉด isPalindrome()์ ์คํ์ ์์ฐจ์ ์คํ์ ์ฝ 3๋ถ์ 1์ด ๋ ๊ฒ์ด๋ค.
CPU ๋ฐ์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ์ํด์๋ ํ์ฌ ์ฌ์ฉ ์ค์ธ ์ฅ์น์ ์ฝ์ด ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์ ํ ์ค๋ ๋ ์๋ฅผ ์์ฑํ๋๋ก ๊ณ ๋ คํด์ผ๋ง ํ๋ค.
I/O ๋ฐ์ด๋ ์๊ณ ๋ฆฌ์ฆ์์์ ๋์์ฑ ๋ ๋ณ๋ ฌ์ฑ
I/O ๋ฐ์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ฐจ์ ์ธ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋์์ฑ ๊ตฌํ์์ ํญ์ ๋ ๋์ ์ฑ๋ฅ์ ๋ฐํํ ๊ฒ์ผ๋ก ์์๋ผ I/O ์์ ์ ๋ ๋์์ฑ์ผ๋ก ์คํํ๋ ํธ์ด ์ข๋ค.
๋์์ฑ์ด ์ด๋ ค์ด ์ด์
์ด๋ค ์ธ์ด๋ค์ ๋๋ฌด ๋ฒ๊ฑฐ๋กญ๊ฒ ๋์์ฑ ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ๋ ํ๊ณ , ์ตํต์ฑ ์์ด ๋ง๋ค์ด ์ฌ์ฉ์ฑ์ ๋จ์ด๋จ๋ฆฌ๋ ์ธ์ด๋ ์๋ค. ๊ทธ๋ฌ๋ ์ฝํ๋ฆฐ์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋์์ฑ ์ฝ๋๋ฅผ ๋๊ธฐํํ๊ณ ํต์ ํ ์ ์๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์คํ ํ๋ฆ์ด ๋ฐ๋์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋์๋ ์ํฅ์ด ์๋ค.
๋ ์ด์ค ์ปจ๋์
๋์์ฑ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๊ฐ์ฅ ํํ ์ค๋ฅ์ธ ๋ ์ด์ค ์ปจ๋์ ์ ์ฝ๋๋ฅผ ๋์์ฑ์ผ๋ก ์์ฑํ์ง๋ง ์์ฐจ์ ์ฝ๋์ฒ๋ผ ๋์ํ ๊ฒ์ด๋ผ๊ณ ์์ํ ๋ ๋ฐ์ํ๋ค.
์ ์ฝ๋๋ฅผ ์คํํ๋ฉด user์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ๋์ ์ด๊ธฐํ๋์ง ์์์ main()๊ฐ ์ค๋จ๋๋ค. ๋ ์ด์ค ์ปจ๋์ ์ ๊ณ ์น๋ ค๋ฉด ์ ๋ณด์ ์ ๊ทผํ๋ ค๊ณ ํ๊ธฐ ์ ์ ์ ๋ณด๋ฅผ ์ป์ ๋๊น์ง ๋ช ์์ ์ผ๋ก ๊ธฐ๋ค๋ ค์ผ๋ง ํ๋ค.
์์์ฑ ์๋ฐ
์์์ฑ ์์ ์ด๋ ์์ ์ด ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ญ ์์ด ์ ๊ทผํ ์ ์์์ ๋งํ๋ค. ๋จ์ผ ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ชจ๋ ์ฝ๋๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์์ ์ด ๋ชจ๋ ์์์ผ ๊ฒ์ด๋ค. ์ค๋ ๋๊ฐ ํ๋๋ง ์คํ๋๋ฏ๋ก ๊ฐ์ญ์ด ์์ ์ ์๋ค.
์์ ์ด ๊ฒน์น ์ ์๋ค๋ ๊ฒ์ ๋ฐ์ดํฐ ์์ค์ด ๋ฐ์ํ ์ ์๋ค๋ ๋ป์ธ๋ฐ, ๊ฐ๋ น ์ฝ๋ฃจํด์ด ๋ค๋ฅธ ์ฝ๋ฃจํด์ด ์์ ํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฟ ์ ์๋ค๋ ๊ฒ์ด๋ค.
main()์ ์คํํ๋ฉด ๋๋ถ๋ถ counter [2100]๋ฅผ ์ถ๋ ฅํ์ง๋ง, ๊ฝค ๋ง์ ์คํ์์ 2,100๋ณด๋ค ์ ์ ๊ฐ์ ์ธ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ต์ฐฉ ์ํ
๋์์ฑ ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋๊ธฐํ๋๋ ค๋ฉด ๋ค๋ฅธ ์ค๋ ๋์์ ์์ ์ด ์๋ฃ๋๋ ๋์ ์คํ์ ์ผ์ ์ค๋จํ๊ฑฐ๋ ์ฐจ๋จํ ํ์๊ฐ ์๋ค.
๋ผ์ด๋ธ ๋ฝ
๋ผ์ด๋ธ ๋ฝ(Livelocks)์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์คํ์ ๊ณ์ํ ์ ์์ ๋ ๋ฐ์ํ๋ ๊ต์ฐฉ์ํ์ ์ ์ฌํ๋ค. ๋ผ์ด๋ธ ๋ฝ์ด ์งํ๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ ์ง์์ ์ผ๋ก ๋ณํ์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ ์คํ์ผ๋ก ๋์์ค์ง ๋ชปํ๊ฒ ํ๋ ๋ฐฉํฅ์ผ๋ก ์ํ๊ฐ ๋ณํ๋ค๋ ์ ์ด ๋ค๋ฅด๋ค.
๊ต์ฐฉ ์ํ๋ฅผ ๋ณต๊ตฌํ๋๋ก ์ค๊ณ๋ ์๊ณ ๋ฆฌ์ฆ์์ ๋ผ์ด๋ธ ๋ฝ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๊ต์ฐฉ ์ํ์์ ๋ณต๊ตฌํ๋ ค๋ ์๋๊ฐ ๋ผ์ด๋ธ ๋ฝ์ ๋ง๋ค์ด ๋ผ ์๋ ์๋ค.
์ฝํ๋ฆฐ์์์ ๋์์ฑ
๋ ๋ธ๋กํน
์ค๋ ๋๋ ๋ฌด๊ฒ๊ณ ์์ฑํ๋ ๋ฐ ๋น์ฉ์ด ๋ง์ด ๋ค๋ฉฐ ์ ํ๋ ์์ ์ค๋ ๋๋ง ์์ฑํ ์ ์๋ค. ์ฝํ๋ฆฐ์ ์ฑ๋(channels), ์กํฐ(actors), ์ํธ ๋ฐฐ์ (mutual exclusions)์ ๊ฐ์ ํ๋ฅญํ ๊ธฐ๋ณธํ(primitives)๋ ์ ๊ณตํด ์ค๋ ๋๋ฅผ ๋ธ๋กํ์ง ์๊ณ ๋์์ฑ ์ฝ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํต์ ํ๊ณ ๋๊ธฐํํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ค.
๋ช
์์ ์ธ ์ ์ธ
๋์์ฑ์ ์ฐ์ฐ์ด ๋์์ ์คํ๋ผ์ผ ํ๋ ์์ ์ ๋ช ์์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ์ค์ํ๋ค. ์ผ์ ์ค๋จ ๊ฐ๋ฅํ ์ฐ์ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฐจ์ ์ผ๋ก ์คํ๋๋ค.
์ฝ๋์์ main()์ ํ์ฌ ์ค๋ ๋์์ ์ผ์ ์ค๋จ ๊ฐ๋ฅํ ์ฐ์ฐ getName()๊ณผ getLastName()์ ์์ฐจ์ ์ผ๋ก ์คํํ๋ค.
๊ทธ๋ฌ๋ getLastName()๊ณผ getName() ๊ฐ์ ์์กด์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋์์ ์ํํ๋ ํ์ด ๋ ๋ซ๋ค.
async { ... }๋ฅผ ํธ์ถํด ๋ ํจ์๋ฅผ ๋์์ ์คํํด์ผ ํ๋ฉฐ await()๋ฅผ ํธ์ถํด ๋ ์ฐ์ฐ์ ๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ ๋๊น์ง main()์ด ์ผ์ ์ค๋จ๋๋๋ก ์์ฒญํ๋ค.
๊ฐ๋
์ฑ
์ฝํ๋ฆฐ์ ๋์์ฑ ์ฝ๋๋ ์์ฐจ์ ์ฝ๋๋งํผ ์ฝ๊ธฐ ์ฝ๋ค. suspend ๋ฉ์๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์คํ๋ ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
๊ธฐ๋ณธํ ํ์ฉ
์ค๋ ๋๋ฅผ ๋ง๋ค๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๋์์ฑ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๊ฐ์ฅ ์ด๋ ค์ด ๋ถ๋ถ ์ค ํ๋๋ค. ์ธ์ ์ค๋ ๋๋ฅผ ๋ง๋ค ๊ฒ์ธ๊ฐ๋ฅผ ์๋ ๊ฒ ๋ชป์ง ์๊ฒ ์ผ๋ง๋ ๋ง์ ์ค๋ ๋๋ฅผ ๋ง๋๋์ง๋ฅผ ์๋ ๊ฒ๋ ์ค์ํ๋ค. ๋ํ I/O ์์ ์ ์ฉ ์ค๋ ๋์ CPU ๋ฐ์ด๋ ์์ ์ ์ฒ๋ฆฌํ๋ ์ค๋ ๋๊ฐ ์์ด์ผ ํ๋๋ฐ, ์ค๋ ๋๋ฅผ ํต์ /๋๊ธฐํํ๋ ๊ฒ์ ๊ทธ ์์ฒด๋ก ์ด๋ ค์ด ์ผ์ด๋ค.
์ฝํ๋ฆฐ์ ๋์์ฑ ์ฝ๋๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ ๊ณ ๊ธ ํจ์์ ๊ธฐ๋ณธํ์ ์ ๊ณตํ๋ค.
์ค๋ ๋๋ ์ค๋ ๋ ์ด๋ฆ์ ํ๋ผ๋ฏธํฐ๋ก ํ๋ newSingleThreadContext()๋ฅผ ํธ์ถํ๋ฉด ์์ฑ๋๋ค. ์ผ๋จ ์์ฑ๋๋ฉด ํ์ํ ๋งํผ ๋ง์ ์ฝ๋ฃจํด์ ์ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ค.
์ค๋ ๋ ํ์ ํฌ๊ธฐ์ ์ด๋ฆ์ ํ๋ผ๋ฏธํฐ๋ก ํ๋ newFixedThreadPoolContext()๋ฅผ ํธ์ถํ๋ฉด ์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
CommonPool์ CPU ๋ฐ์ด๋ ์์ ์ ์ต์ ์ธ ์ค๋ ๋ ํ์ด๋ค. ์ต๋ ํฌ๊ธฐ๋ ์์คํ ์ ์ฝ์ด์์ 1์ ๋บ ๊ฐ์ด๋ค.
์ฝ๋ฃจํด์ ๋ค๋ฅธ ์ค๋ ๋๋ก ์ด๋์ํค๋ ์ญํ ์ ๋ฐํ์์ด ๋ด๋นํ๋ค.
ํ๋, ๋ฎคํ ์ค ๋ฐ ์ค๋ ๋ ํ์ ๊ณผ ๊ฐ์ ์ฝ๋ฃจํด์ ํต์ ๊ณผ ๋๊ธฐํ๋ฅผ ์ํด ํ์ํ ๋ง์ ๊ธฐ๋ณธํ๊ณผ ๊ธฐ์ ์ด ์ ๊ณต๋๋ค.
์ฝํ๋ฆฐ ๋์์ฑ ๊ด๋ จ ๊ฐ๋
๊ณผ ์ฉ์ด
์ผ์ ์ค๋จ ์ฐ์ฐ
์ผ์ ์ค๋จ ์ฐ์ฐ์ ํด๋น ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์คํ์ ์ธ์ ์ค์งํ ์ ์๋ ์ฐ์ฐ์ด๋ค.
์ผ์ ์ค๋จ ํจ์
์ผ์ ์ค๋จ ํจ์๋ ํจ์ ํ์์ ์ผ์ ์ค๋จ ์ฐ์ฐ์ด๋ค.
์์ ์์ ์์ greetAfter()์ ์คํ์ delay()๊ฐ ํธ์ถ๋ ๋ ์ผ์ ์ค๋จ๋๋ค. delay()๋ ์์ฒด๊ฐ ์ผ์ ์ค๋จ ํจ์์ด๋ฉฐ, ์ฃผ์ด์ง ์๊ฐ ๋์ ์คํ์ ์ผ์ ์ค๋จํ๋ค. delay()๊ฐ ์๋ฃ๋๋ฉด greetAfter()๊ฐ ์คํ์ ์ ์์ ์ผ๋ก ๋ค์ ์์ํ๋ค. greetAfter()๊ฐ ์ผ์ ์ค์ง๋ ๋์ ์คํ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ฐ์ฐ์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๋ค.
๋๋ค ์ผ์ ์ค๋จ
์ผ๋ฐ์ ์ธ ๋๋ค์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ผ์ ์ค๋จ ๋๋ค๋ ์ต๋ช ์ ๋ก์ปฌ ํจ์๋ค. ์ผ์ ์ค๋จ ๋๋ค๋ ๋ค๋ฅธ ์ผ์ ์ค๋จ ํจ์๋ฅผ ํธ์ถํจ์ผ๋ก์จ ์์ ์ ์คํ์ ์ค๋จํ ์ ์๋ค๋ ์ ์์ ๋ณดํต์ ๋๋ค์ ์ฐจ์ด๊ฐ ์๋ค.
์ฝ๋ฃจํด ๋์คํจ์ฒ
์ฝ๋ฃจํด์ ์์ํ๊ฑฐ๋ ์ฌ๊ฐํ ์ค๋ ๋๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ฝ๋ฃจํด ๋์คํจํฐ๊ฐ ์ฌ์ฉ๋๋ค. ๋ชจ๋ ์ฝ๋ฃจํด ๋์คํจํฐ๋ CoroutineDispatcher ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
DefaultDispatcher: ํ์ฌ๋ CommonPool๊ณผ ๊ฐ๋ค. ์์ผ๋ก ๋ฐ๋ ์ ์๋ค.
CommonPool: ๊ณต์ ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋ ํ์์ ์ฝ๋ฃจํด์ ์คํํ๊ณ ๋ค์ ์์ํ๋ค. ๊ธฐ๋ณธ ํฌ๊ธฐ๋ CPU ๋ฐ์ด๋ ์์ ์์ ์ฌ์ฉํ๊ธฐ์ ์ ํฉํ๋ค.
Unconfined: ํ์ฌ ์ค๋ ๋์์ ์ฝ๋ฃจํด์ ์์ํ์ง๋ง ์ด๋ค ์ค๋ ๋์์๋ ์ฝ๋ฃจํด์ด ๋ค์ ์ฌ๊ฐ๋ ์ ์๋ค. ๋์คํจํฐ์์๋ ์ค๋ ๋ ์ ์ฑ ์ ์ฌ์ฉํ์ง ์๋๋ค.
๋์คํจ์ฒ์ ํจ๊ป ํ์์ ๋ฐ๋ผ Pool ๋๋ ์ค๋ ๋๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ๋น๋๊ฐ ์๋ค.
newSingleThreadContext() : ๋จ์ผ ์ค๋ ๋๋ก ๋์คํจ์ฒ๋ฅผ ์์ฑํ๋ค. ์ฌ๊ธฐ์์ ์คํ๋๋ ์ฝ๋ฃจํด์ ํญ์ ๊ฐ์ ์ค๋ ๋์์ ์์๋๊ณ ์ฌ๊ฐ๋๋ค.
newFixedThreadPoolContext() : ์ง์ ๋ ํฌ๊ธฐ์ ์ค๋ ๋ ํ์ด ์๋ ๋์คํจ์ฒ๋ฅผ ๋ง๋ ๋ค. ๋ฐํ์์ ๋์คํจ์ฒ์์ ์คํ๋ ์ฝ๋ฃจํด์ ์์ํ๊ณ ์ฌ๊ฐํ ์ค๋ ๋๋ฅผ ๊ฒฐ์ ํ๋ค.
์ฝ๋ฃจํด ๋น๋
์ฝ๋ฃจํด ๋น๋๋ ์ผ์ ์ค๋จ ๋๋ค๋ฅผ ๋ฐ์ ๊ทธ๊ฒ์ ์คํ์ํค๋ ์ฝ๋ฃจํด์ ์์ฑํ๋ ํจ์๋ค.
async() : ๊ฒฐ๊ณผ๊ฐ ์์๋๋ ์ฝ๋ฃจํด์ ์์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. async()๋ ์ฝ๋ฃจํด ๋ด๋ถ์์ ์ผ์ด๋๋ ๋ชจ๋ ์์ธ๋ฅผ ์บก์ฒํด์ ๊ฒฐ๊ณผ์ ๋ฃ๊ธฐ ๋๋ฌธ์ ์กฐ์ฌํด์ ์ฌ์ฉํด์ผ ํ๋ค.
launch() : ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์๋ ์ฝ๋ฃจํด์ ์์ํ๋ค. ์์ฒด ํน์ ์์ ์ฝ๋ฃจํด์ ์คํ์ ์ทจ์ํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ Job์ ๋ฐํํ๋ค.
runBlocking() : ๋ธ๋กํน ์ฝ๋๋ฅผ ์ผ์ ์ค์ง ๊ฐ๋ฅํ ์ฝ๋๋ก ์ฐ๊ฒฐํ๊ธฐ ์ํด ์์ฑ๋๋ค. ๋ณดํต main() ๋ฉ์๋์ ์ ๋ ํ ์คํธ์์ ์ฌ์ฉ๋๋ค.
์์ฝ
์ ํ๋ฆฌ์ผ์ด์ ์๋ ํ๋ ์ด์์ ํ๋ก์ธ์ค๊ฐ ์๋ค. ๊ฐ๊ฐ์ ์ ์ด๋ ํ๋์ ์ค๋ ๋๋ฅผ ๊ฐ๊ณ ์๊ณ ์ฝ๋ฃจํด์ ์ค๋ ๋ ์์์ ์คํ๋๋ค.
์ฝ๋ฃจํด์ ์ฌ๊ฐ๋ ๋๋ง๋ค ๋ค๋ฅธ ์ค๋ ๋์์ ์คํ๋ ์ ์์ง๋ง ํน์ ์ค๋ ๋์๋ง ๊ตญํ๋ ์๋ ์๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด ํ๋ ์ด์์ ์ค๋ ๋์ ์ค์ฒฉ๋ผ ์คํ๋๋ ๊ฒฝ์ฐ๋ ๋์์ ์คํ์ด๋ค.
์ฌ๋ฐ๋ฅธ ๋์์ฑ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๋ฉด ์๋ก ๋ค๋ฅธ ์ค๋ ๋ ๊ฐ์ ํต์ ๊ณผ ๋๊ธฐํ ๋ฐฉ๋ฒ์ ๋ฐฐ์์ผ ํ๋ฉฐ, ์ฝํ๋ฆฐ์์๋ ์ฝ๋ฃจํด์ ํต์ ๊ณผ ๋๊ธฐํ ๋ฐฉ๋ฒ์ ํ์ต์ ์๋ฏธํ๋ค.
๋ณ๋ ฌ ์ฒ๋ฆฌ๋ ๋์ ์ฒ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ๋์ ์ ์ด๋ ๋ ๊ฐ ์ด์์ ์ค๋ ๋๊ฐ ๊ฐ์ด ์คํ๋ ๋ ๋ฐ์ํ๋ค.
๋์ ์ฒ๋ฆฌ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์์ด ์ผ์ด๋ ์ ์๋ค. ํ๋์ ์ฒ๋ฆฌ ์ฅ์น๋ ์ค๋ ๋ ๊ฐ์์ ๊ต์ฐจ ๋ฐฐ์น ํ ๊ฒ์ด๊ณ ํจ๊ณผ์ ์ผ๋ก ์ค๋ ๋๋ฅผ ์ค์ฒฉ์ํฌ ๊ฒ์ด๋ค.
๋์์ฑ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ์๋ ์ด๋ ค์์ด ๋ง๋ค. ๋๋ถ๋ถ ์ฌ๋ฐ๋ฅธ ํต์ ๊ณผ ์ค๋ ๋ ๋๊ธฐํ์ ๊ด๋ จ์ด ์๋๋ฐ ๋ ์ด์ค ์ปจ๋์ , ์์์ฑ ์๋ฐ, ๊ต์ฐฉ ์ํ ๋ฐ ๋ผ์ด๋ธ๋ฝ์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ์ด๋ค.
์ฝํ๋ฆฐ์ ๋์์ฑ์ ๋ํด ํ๋์ ์ด๊ณ ์ ์ ํ ์ ๊ทผ ๋ฐฉ์์ ์ทจํ๋ค. ์ฝํ๋ฆฐ์ ์ฌ์ฉํ๋ฉด ๋ ๋ธ๋กํน์ด๋ฉฐ, ๊ฐ๋ ์ฑ ์๊ฒ ํ์ฉ๋ ๋ฟ๋ง ์๋๋ผ ์ ์ฐํ ๋์์ฑ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
Last updated
Was this helpful?