Browse Source
Co-authored-by: Sebastiรกn Ramรญrez <[email protected]> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>pull/9957/head
committed by
GitHub
1 changed files with 404 additions and 0 deletions
@ -0,0 +1,404 @@ |
|||
# ๋์์ฑ๊ณผ async / await |
|||
|
|||
*๊ฒฝ๋ก ์๋ ํจ์*์์์ `async def` ๋ฌธ๋ฒ์ ๋ํ ์ธ๋ถ์ฌํญ๊ณผ ๋น๋๊ธฐ ์ฝ๋, ๋์์ฑ ๋ฐ ๋ณ๋ ฌ์ฑ์ ๋ํ ๋ฐฐ๊ฒฝ |
|||
|
|||
## <a name="in-a-hurry"></a>๋ฐ์์ ๊ฒฝ์ฐ |
|||
|
|||
<strong>์์ฝ</strong> |
|||
|
|||
๋ค์๊ณผ ๊ฐ์ด `await`๋ฅผ ์ฌ์ฉํด ํธ์ถํ๋ ์ 3์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ: |
|||
|
|||
```Python |
|||
results = await some_library() |
|||
``` |
|||
|
|||
๋ค์์ฒ๋ผ *๊ฒฝ๋ก ์๋ ํจ์*๋ฅผ `async def`๋ฅผ ์ฌ์ฉํด ์ ์ธํ์ญ์์ค: |
|||
|
|||
```Python hl_lines="2" |
|||
@app.get('/') |
|||
async def read_results(): |
|||
results = await some_library() |
|||
return results |
|||
``` |
|||
|
|||
!!! note "์ฐธ๊ณ " |
|||
`async def`๋ก ์์ฑ๋ ํจ์ ๋ด๋ถ์์๋ง `await`๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
--- |
|||
|
|||
๋ฐ์ดํฐ๋ฒ ์ด์ค, API, ํ์ผ์์คํ
๋ฑ๊ณผ ์์ฌ์ํตํ๋ ์ 3์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ , ๊ทธ๊ฒ์ด `await`๋ฅผ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ(ํ์ฌ ๊ฑฐ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ทธ๋ฌํฉ๋๋ค), *๊ฒฝ๋ก ์๋ ํจ์*๋ฅผ ์ผ๋ฐ์ ์ธ `def`๋ฅผ ์ฌ์ฉํด ์ ์ธํ์ญ์์ค: |
|||
|
|||
```Python hl_lines="2" |
|||
@app.get('/') |
|||
def results(): |
|||
results = some_library() |
|||
return results |
|||
``` |
|||
|
|||
--- |
|||
|
|||
๋ง์ฝ ๋น์ ์ ์์ฉํ๋ก๊ทธ๋จ์ด (์ด์งธ์์ธ์ง) ๋ค๋ฅธ ๋ฌด์๊ณผ ์์ฌ์ํตํ๊ณ ๊ทธ๊ฒ์ด ์๋ตํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์๋ค๋ฉด `async def`๋ฅผ ์ฌ์ฉํ์ญ์์ค. |
|||
|
|||
--- |
|||
|
|||
๋ชจ๋ฅด๊ฒ ๋ค๋ฉด, ๊ทธ๋ฅ `def`๋ฅผ ์ฌ์ฉํ์ญ์์ค. |
|||
|
|||
--- |
|||
|
|||
**์ฐธ๊ณ **: *๊ฒฝ๋ก ์๋ ํจ์*์์ ํ์ํ๋งํผ `def`์ `async def`๋ฅผ ํผ์ฉํ ์ ์๊ณ , ๊ฐ์ฅ ์๋ง์ ๊ฒ์ ์ ํํด์ ์ ์ํ ์ ์์ต๋๋ค. FastAPI๊ฐ ์์ฒด์ ์ผ๋ก ์๋ง์ ์์
์ ์ํํ ๊ฒ์
๋๋ค. |
|||
|
|||
์ด์ฐ๋์๋ , ์๊ธฐ ์ด๋ ํ ๊ฒฝ์ฐ๋ผ๋, FastAPI๋ ์ฌ์ ํ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ํ๊ณ ๋งค์ฐ ๋น ๋ฆ
๋๋ค. |
|||
|
|||
๊ทธ๋ฌ๋ ์๊ธฐ ์์
์ ์ํํจ์ผ๋ก์จ ์ด๋ ์ ๋์ ์ฑ๋ฅ ์ต์ ํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. |
|||
|
|||
## ๊ธฐ์ ์ ์ธ๋ถ์ฌํญ |
|||
|
|||
์ต์ ํ์ด์ฌ ๋ฒ์ ์ `async`์ `await` ๋ฌธ๋ฒ๊ณผ ํจ๊ป **โ์ฝ๋ฃจํดโ**์ด๋ผ๊ณ ํ๋ ๊ฒ์ ์ฌ์ฉํ๋ **โ๋น๋๊ธฐ ์ฝ๋โ**๋ฅผ ์ง์ํฉ๋๋ค. |
|||
|
|||
์๋ ์น์
๋ค์์ ํด๋น ๋ฌธ์ฅ์ ๋ถ๋ถ๋ณ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค: |
|||
|
|||
* **๋น๋๊ธฐ ์ฝ๋** |
|||
* **`async`์ `await`** |
|||
* **์ฝ๋ฃจํด** |
|||
|
|||
## ๋น๋๊ธฐ ์ฝ๋ |
|||
|
|||
๋น๋๊ธฐ ์ฝ๋๋ ์ธ์ด ๐ฌ ๊ฐ ์ฝ๋์ ์ด๋ ํ ๋ถ๋ถ์์, ์ปดํจํฐ / ํ๋ก๊ทธ๋จ๐ค์๊ฒ *๋ค๋ฅธ ๋ฌด์ธ๊ฐ*๊ฐ ์ด๋๊ฐ์์ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํ๋ค๊ณ ๋งํ๋ ๋ฐฉ์์
๋๋ค. *๋ค๋ฅธ ๋ฌด์ธ๊ฐ*๊ฐ โ๋๋ฆฐ-ํ์ผ" ๐ ์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค. |
|||
|
|||
๋ฐ๋ผ์ โ๋๋ฆฐ-ํ์ผโ ๐์ด ๋๋ ๋๊น์ง ์ปดํจํฐ๋ ๋ค๋ฅธ ์์
์ ์ํํ ์ ์์ต๋๋ค. |
|||
|
|||
๊ทธ ๋ค์ ์ปดํจํฐ / ํ๋ก๊ทธ๋จ ๐ค ์ ๋ค์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ธฐํ๊ฐ ์์ ๋๋ง๋ค ๋ค์ ๋์์ค๊ฑฐ๋, ํน์ ๋น์์ ์ํํด์ผํ๋ ์์
๋ค์ด ์๋ฃ๋ ๋๋ง๋ค ๋ค์ ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ ๐ค ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์์
์ค ์ด๋ ๊ฒ์ด ์ด๋ฏธ ์๋ฃ๋์๋์ง, ๊ทธ๊ฒ ๐ค ์ด ํด์ผํ๋ ๋ชจ๋ ์์
์ ์ํํ๋ฉด์ ํ์ธํฉ๋๋ค. |
|||
|
|||
๋ค์์ผ๋ก, ๊ทธ๊ฒ ๐ค ์ ์๋ฃํ ์ฒซ๋ฒ์งธ ์์
์ ์ฐฉ์ํ๊ณ (์ฐ๋ฆฌ์ "๋๋ฆฐ-ํ์ผ" ๐ ์ด๋ผ๊ณ ๊ฐ์ ํฉ์๋ค) ๊ทธ์ ๋ํด ์ํํด์ผํ๋ ์์
์ ๊ณ์ํฉ๋๋ค. |
|||
|
|||
"๋ค๋ฅธ ๋ฌด์ธ๊ฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ"์ ์ผ๋ฐ์ ์ผ๋ก ๋น๊ต์ "๋๋ฆฐ" (ํ๋ก์ธ์์ RAM ๋ฉ๋ชจ๋ฆฌ ์๋์ ๋นํด) <abbr title="Input and Output">I/O</abbr> ์์
์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์์ ๊ฒ๋ค์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์
๋๋ค: |
|||
|
|||
* ๋คํธ์ํฌ๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ก๋๋ ๋ฐ์ดํฐ |
|||
* ๋คํธ์ํฌ๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๊ฐ ์์ ํ , ๋น์ ์ ํ๋ก๊ทธ๋จ์ผ๋ก๋ถํฐ ์ ์ก๋๋ ๋ฐ์ดํฐ |
|||
* ์์คํ
์ด ์ฝ๊ณ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ ๋์คํฌ ๋ด์ ํ์ผ ๋ด์ฉ |
|||
* ๋น์ ์ ํ๋ก๊ทธ๋จ์ด ์์คํ
์ ์ ๋ฌํ๋, ๋์คํฌ์ ์์ฑ๋ ๋ด์ฉ |
|||
* ์๊ฒฉ API ์์
|
|||
* ์๋ฃ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
|
|||
* ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ |
|||
* ๊ธฐํ |
|||
|
|||
์ํ ์๊ฐ์ ๋๋ถ๋ถ์ด <abbr title="Input and Output">I/O</abbr> ์์
์ ๊ธฐ๋ค๋ฆฌ๋๋ฐ์ ์์๋๊ธฐ ๋๋ฌธ์, "I/O์ ๋ฌถ์ธ" ์์
์ด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค. |
|||
|
|||
์ด๊ฒ์ "๋น๋๊ธฐ"๋ผ๊ณ ๋ถ๋ฆฌ๋๋ฐ ์ปดํจํฐ / ํ๋ก๊ทธ๋จ์ด ์์
๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ์ผ์ ์ํํ ์ ์๋๋ก, ๋๋ฆฐ ์์
์ "๋๊ธฐํ"๋์ด ์๋ฌด๊ฒ๋ ํ์ง ์์ผ๋ฉด์ ์์
์ด ์๋ฃ๋ ์ ํํ ์์ ๋ง์ ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค. |
|||
|
|||
์ด ๋์ ์, "๋น๋๊ธฐ" ์์คํ
์์๋, ์์
์ ์ผ๋จ ์๋ฃ๋๋ฉด, ์ปดํจํฐ / ํ๋ก๊ทธ๋จ์ด ์ํํ๊ณ ์๋ ์ผ์ ์๋ฃํ๊ณ ์ดํ ๋ค์ ๋์์์ ๊ทธ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ด๋ฅผ ์ฌ์ฉํด ์์
์ ์ง์ํ ๋๊น์ง ์ ์ (๋ช ๋ง์ดํฌ๋ก์ด) ๋๊ธฐํ ์ ์์ต๋๋ค. |
|||
|
|||
"๋๊ธฐ"("๋น๋๊ธฐ"์ ๋ฐ๋)๋ ์ปดํจํฐ / ํ๋ก๊ทธ๋จ์ด ์์ดํ ์์
๋ค๊ฐ ์ ํ์ ํ๊ธฐ ์ ์ ๊ทธ๊ฒ์ด ๋๊ธฐ๋ฅผ ๋๋ฐํ๊ฒ ๋ ์ง๋ผ๋ ๋ชจ๋ ์์๋ฅผ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ "์์ฐจ"๋ผ๋ ์ฉ์ด๋ก๋ ํํ ๋ถ๋ฆฝ๋๋ค. |
|||
|
|||
### ๋์์ฑ๊ณผ ๋ฒ๊ฑฐ |
|||
|
|||
์์์ ์ค๋ช
ํ **๋น๋๊ธฐ** ์ฝ๋์ ๋ํ ๊ฐ๋
์ ์ข
์ข
**"๋์์ฑ"**์ด๋ผ๊ณ ๋ ๋ถ๋ฆฝ๋๋ค. ์ด๊ฒ์ **"๋ณ๋ ฌ์ฑ"**๊ณผ๋ ๋ค๋ฆ
๋๋ค. |
|||
|
|||
**๋์์ฑ**๊ณผ **๋ณ๋ ฌ์ฑ**์ ๋ชจ๋ "๋์์ ์ผ์ด๋๋ ์๋ก ๋ค๋ฅธ ์ผ๋ค"๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. |
|||
|
|||
ํ์ง๋ง *๋์์ฑ*๊ณผ *๋ณ๋ ฌ์ฑ*์ ์ธ๋ถ์ ์ธ ๊ฐ๋
์๋ ๊ฝค ์ฐจ์ด๊ฐ ์์ต๋๋ค. |
|||
|
|||
์ฐจ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด, ๋ค์์ ๋ฒ๊ฑฐ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ์์ํด๋ณด์ญ์์ค: |
|||
|
|||
### ๋์ ๋ฒ๊ฑฐ |
|||
|
|||
๋น์ ์ ์ง์ฌ๋ ์๋ ๐ ์ ํจ์คํธํธ๋ ๐ ๋ฅผ ๋จน์ผ๋ฌ ๊ฐ์ต๋๋ค. ๋น์ ์ ์ ์ ๐ ์ด ๋น์ ์์ ์๋ ์ฌ๋๋ค์ ์ฃผ๋ฌธ์ ๋ฐ์ ๋์ ์ค์ ์์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. |
|||
|
|||
์ด์ ๋น์ ์ ์์๊ฐ ๋์ด์, ๋น์ ์ ๋น์ ๊ณผ ์ง์ฌ๋ ์๋ ๐ ๋ฅผ ์ํ ๋ ๊ฐ์ ๊ณ ๊ธ์ค๋ฌ์ด ๋ฒ๊ฑฐ ๐ ๋ฅผ ์ฃผ๋ฌธํฉ๋๋ค. |
|||
|
|||
๋น์ ์ด ๋์ ๋
๋๋ค ๐ธ. |
|||
|
|||
์ ์ ๐ ์ ์ฃผ๋ฐฉ ๐จโ๐ณ ์ ์๋ฆฌ๋ฅผ ํ๋ผ๊ณ ์ ๋ฌํ๊ณ , ๋ฐ๋ผ์ ๊ทธ๋ค์ ๋น์ ์ ๋ฒ๊ฑฐ ๐ ๋ฅผ ์ค๋นํด์ผํ๋ค๋ ์ฌ์ค์ ์๊ฒ๋ฉ๋๋ค(๊ทธ๋ค์ด ์ง๊ธ์ ๋น์ ์ ๊ณ ๊ฐ๋ค์ ์ฃผ๋ฌธ์ ์ค๋นํ๊ณ ์์์ง๋ผ๋ ๋ง์
๋๋ค). |
|||
|
|||
์ ์ ๐ ์ ๋น์ ์ ์์๊ฐ ์ ํ ๋ฒํธํ๋ฅผ ์ค๋๋ค. |
|||
|
|||
๊ธฐ๋ค๋ฆฌ๋ ๋์, ๋น์ ์ ์ง์ฌ๋ ์๋ ๐ ์ ํจ๊ป ํ
์ด๋ธ์ ๊ณ ๋ฅด๊ณ , ์๋ฆฌ์ ์์ ์ค๋ซ๋์ (๋น์ ์ด ์ฃผ๋ฌธํ ๋ฒ๊ฑฐ๋ ๊ฝค๋ ๊ณ ๊ธ์ค๋ฝ๊ธฐ ๋๋ฌธ์ ์ค๋นํ๋๋ฐ ์๊ฐ์ด ์กฐ๊ธ ๊ฑธ๋ฆฝ๋๋ค โจ๐โจ) ๋ํ๋ฅผ ๋๋๋๋ค. |
|||
|
|||
์ง์ฌ๋ ์๋ ๐ ์ ํ
์ด๋ธ์ ์์์ ๋ฒ๊ฑฐ ๐ ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์, ๊ทธ ์ฌ๋ ๐ ์ด ์ผ๋ง๋ ๋ฉ์ง๊ณ , ์ฌ๋์ค๋ฝ๊ณ , ๋๋ํ์ง ๊ฐํํ๋ฉฐ ์๊ฐ์ ๋ณด๋
๋๋ค โจ๐โจ. |
|||
|
|||
์ง์ฌ๋ ์๋ ๐ ์ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ์๊ธฐํ๋ ๋์, ๋๋๋ก, ๋น์ ์ ๋น์ ์ ์ฐจ๋ก๊ฐ ๋์๋์ง ๋ณด๊ธฐ ์ํด ์นด์ดํฐ์ ๋ฒํธ๋ฅผ ํ์ธํฉ๋๋ค. |
|||
|
|||
๊ทธ๋ฌ๋ค ์ด๋ ์๊ฐ, ๋น์ ์ ์ฐจ๋ก๊ฐ ๋ฉ๋๋ค. ์นด์ดํฐ์ ๊ฐ์, ๋ฒ๊ฑฐ ๐ ๋ฅผ ๋ฐ๊ณ , ํ
์ด๋ธ๋ก ๋ค์ ๋์์ต๋๋ค. |
|||
|
|||
๋น์ ๊ณผ ์ง์ฌ๋ ์๋ ๐ ๋ ๋ฒ๊ฑฐ ๐ ๋ฅผ ๋จน์ผ๋ฉฐ ์ข์ ์๊ฐ์ ๋ณด๋
๋๋ค โจ. |
|||
|
|||
--- |
|||
|
|||
๋น์ ์ด ์ด ์ด์ผ๊ธฐ์์ ์ปดํจํฐ / ํ๋ก๊ทธ๋จ ๐ค ์ด๋ผ๊ณ ์์ํด๋ณด์ญ์์ค. |
|||
|
|||
์ค์ ์์ ๊ธฐ๋ค๋ฆฌ๋ ๋์, ๋น์ ์ ์๋ฌด๊ฒ๋ ํ์ง ์๊ณ ๐ด ๋น์ ์ ์ฐจ๋ก๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ, ์ด๋ ํ "์์ฐ์ ์ธ" ์ผ๋ ํ์ง ์์ต๋๋ค. ํ์ง๋ง ์ ์ ๐ ์ด (์์์ ์ค๋นํ์ง๋ ์๊ณ ) ์ฃผ๋ฌธ์ ๋ฐ๊ธฐ๋ง ํ๊ธฐ ๋๋ฌธ์ ์ค์ด ๋นจ๋ฆฌ ์ค์ด๋ค์ด์ ๊ด์ฐฎ์ต๋๋ค. |
|||
|
|||
๊ทธ๋ค์, ๋น์ ์ด ์ฐจ๋ก๊ฐ ์ค๋ฉด, ๋น์ ์ ์ค์ ๋ก "์์ฐ์ ์ธ" ์ผ ๐ค ์ ํฉ๋๋ค. ๋น์ ์ ๋ฉ๋ด๋ฅผ ๋ณด๊ณ , ๋ฌด์์ ๋จน์์ง ๊ฒฐ์ ํ๊ณ , ์ง์ฌ๋ ์๋ ๐ ์ ์ ํ์ ๋ฌป๊ณ , ๋์ ๋ด๊ณ ๐ธ , ๋ง๋ ์นด๋๋ฅผ ๋๋์ง ํ์ธํ๊ณ , ๋น์ฉ์ด ์ ๋๋ก ์ง๋ถ๋์๋์ง ํ์ธํ๊ณ , ์ฃผ๋ฌธ์ด ์ ๋๋ก ๋ค์ด๊ฐ๋์ง ํ์ธ์ ํ๋ ์์
๋ฑ๋ฑ์ ์ํํฉ๋๋ค. |
|||
|
|||
ํ์ง๋ง ์ดํ์๋, ๋ฒ๊ฑฐ ๐ ๋ฅผ ์์ง ๋ฐ์ง ๋ชปํ์์๋, ๋ฒ๊ฑฐ๊ฐ ์ค๋น๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ๐ ํ๊ธฐ ๋๋ฌธ์ ์ ์ ๐ ๊ณผ์ ์์
์ "์ผ์์ ์ง" โธ ์ํ์
๋๋ค. |
|||
|
|||
ํ์ง๋ง ๋ฒํธํ๋ฅผ ๋ฐ๊ณ ์นด์ดํฐ์์ ๋์ ํ
์ด๋ธ์ ์์ผ๋ฉด, ๋น์ ์ ์ง์ฌ๋ ์๋ ๐ ์ ๊ทธ "์์
" โฏ ๐ค ์ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๐ ์ง์คํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋น์ ์ ๋ค์ ์ง์ฌ๋ ์๋ ๐ ์๊ฒ ์์
์ ๊ฑฐ๋ ๋งค์ฐ "์์ฐ์ ์ธ" ์ผ ๐ค ์ ํฉ๋๋ค. |
|||
|
|||
์ ์ ๐ ์ด ์นด์ดํฐ ํ๋ฉด์ ๋น์ ์ ๋ฒํธ๋ฅผ ํ์ํจ์ผ๋ก์จ "๋ฒ๊ฑฐ ๐ ๊ฐ ์ค๋น๋์์ต๋๋ค"๋ผ๊ณ ํด๋, ๋น์ ์ ์ฆ์ ๋ฐ์ณ๋๊ฐ์ง๋ ์์ ๊ฒ์
๋๋ค. ๋น์ ์ ๋น์ ์ ๋ฒํธ๋ฅผ ๊ฐ๊ณ ์๊ณ , ๋ค๋ฅธ ์ฌ๋๋ค์ ๊ทธ๋ค์ ๋ฒํธ๋ฅผ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์, ์๋ฌด๋ ๋น์ ์ ๋ฒ๊ฑฐ ๐ ๋ฅผ ํ์ณ๊ฐ์ง ์๋๋ค๋ ์ฌ์ค์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. |
|||
|
|||
๊ทธ๋์ ๋น์ ์ ์ง์ฌ๋ ์๋ ๐ ๊ฐ ์ด์ผ๊ธฐ๋ฅผ ๋๋ผ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ (ํ์ฌ ์์
์๋ฃ โฏ / ์งํ ์ค์ธ ์์
์ฒ๋ฆฌ ๐ค ), ์ ์คํ๊ฒ ๋ฏธ์์ง๊ณ ๋ฒ๊ฑฐ๋ฅผ ๊ฐ์ง๋ฌ ๊ฐ๊ฒ ๋ค๊ณ ๋งํฉ๋๋ค โธ. |
|||
|
|||
๊ทธ๋ค์ ๋น์ ์ ์นด์ดํฐ์ ๊ฐ์ ๐ , ์ด๊ธฐ ์์
์ ์ด์ ์๋ฃํ๊ณ โฏ , ๋ฒ๊ฑฐ ๐ ๋ฅผ ๋ฐ๊ณ , ๊ฐ์ฌํ๋ค๊ณ ๋งํ๊ณ ํ
์ด๋ธ๋ก ๊ฐ์ ธ์ต๋๋ค. ์ด๋ก์จ ์นด์ดํฐ์์ ์ํธ์์ฉ ๋จ๊ณ / ์์
์ด ์ข
๋ฃ๋ฉ๋๋ค โน. |
|||
|
|||
์ด์ ์์
์ธ "๋ฒ๊ฑฐ ๋ฐ๊ธฐ"๊ฐ ์ข
๋ฃ๋๋ฉด โน "๋ฒ๊ฑฐ ๋จน๊ธฐ"๋ผ๋ ์๋ก์ด ์์
์ด ์์ฑ๋ฉ๋๋ค ๐ โฏ. |
|||
|
|||
### ๋ณ๋ ฌ ๋ฒ๊ฑฐ |
|||
|
|||
์ด์ "๋์ ๋ฒ๊ฑฐ"๊ฐ ์๋ "๋ณ๋ ฌ ๋ฒ๊ฑฐ"๋ฅผ ์์ํด๋ณด์ญ์์ค. |
|||
|
|||
๋น์ ์ ์ง์ฌ๋ ์๋ ๐ ์ ํจ๊ป ๋ณ๋ ฌ ํจ์คํธํธ๋ ๐ ๋ฅผ ๋จน์ผ๋ฌ ๊ฐ์ต๋๋ค. |
|||
|
|||
๋น์ ์ ์ฌ๋ฌ๋ช
(8๋ช
์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค)์ ์ ์์ด ๋น์ ์ ์ฌ๋๋ค์ ์ฃผ๋ฌธ์ ๋ฐ์ผ๋ฉฐ ๋์์ ์๋ฆฌ ๐ฉโ๐ณ๐จโ๐ณ๐ฉโ๐ณ๐จโ๐ณ๐ฉโ๐ณ๐จโ๐ณ๐ฉโ๐ณ๐จโ๐ณ ๋ ํ๋ ๋์ ์ค์ ์์ ๊ธฐ๋ค๋ฆฝ๋๋ค. |
|||
|
|||
๋น์ ์ ๋ชจ๋ ์ฌ๋๋ค์ด ๋ฒ๊ฑฐ๊ฐ ์ค๋น๋ ๋๊น์ง ์นด์ดํฐ์์ ๋ ๋์ง ์๊ณ ๊ธฐ๋ค๋ฆฝ๋๋ค ๐ . ์๋ํ๋ฉด 8๋ช
์ ์ง์๋ค์ด ๋ค์ ์ฃผ๋ฌธ์ ๋ฐ๊ธฐ ์ ์ ๋ฒ๊ฑฐ๋ฅผ ์ค๋นํ๋ฌ ๊ฐ๊ธฐ ๋๋ฌธ์
๋๋ค. |
|||
|
|||
๋ง์นจ๋ด ๋น์ ์ ์ฐจ๋ก๊ฐ ์๊ณ , ๋น์ ์ ๋น์ ๊ณผ ์ง์ฌ๋ ์๋ ๐ ๋ฅผ ์ํ ๋ ๊ฐ์ ๊ณ ๊ธ์ค๋ฌ์ด ๋ฒ๊ฑฐ ๐ ๋ฅผ ์ฃผ๋ฌธํฉ๋๋ค. |
|||
|
|||
๋น์ ์ด ๋น์ฉ์ ์ง๋ถํฉ๋๋ค ๐ธ . |
|||
|
|||
์ ์์ด ์ฃผ๋ฐฉ์ ๊ฐ๋๋ค ๐จโ๐ณ . |
|||
|
|||
๋น์ ์ ๋ฒํธํ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๊ตฌ๋ ๋น์ ์ ๋ฒ๊ฑฐ ๐ ๋ฅผ ๋์ ๊ฐ์ ธ๊ฐ ์ ์๋๋ก ์นด์ดํฐ์ ์์ ๊ธฐ๋ค๋ฆฝ๋๋ค ๐ . |
|||
|
|||
๋น์ ๊ณผ ์ง์ฌ๋ ์๋ ๐ ๋ ๋ค๋ฅธ ์ฌ๋์ด ์์น๊ธฐํด์ ๋ฒ๊ฑฐ๋ฅผ ๊ฐ์ ธ๊ฐ์ง ๋ชปํ๊ฒ ํ๋๋ผ ๋ฐ์๊ธฐ ๋๋ฌธ์ ๐ , ์ง์ฌ๋ ์๋์๊ฒ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ผ ์ ์์ต๋๋ค ๐ . |
|||
|
|||
์ด๊ฒ์ "๋๊ธฐ" ์์
์ด๊ณ , ๋น์ ์ ์ ์/์๋ฆฌ์ฌ ๐จโ๐ณ ์ "๋๊ธฐํ" ๋์์ต๋๋ค. ๋น์ ์ ๊ธฐ๋ค๋ฆฌ๊ณ ๐ , ์ ์/์๋ฆฌ์ฌ ๐จโ๐ณ ๊ฐ ๋ฒ๊ฑฐ ๐ ์ค๋น๋ฅผ ์๋ฃํ ํ ๋น์ ์๊ฒ ์ฃผ๊ฑฐ๋, ๋๊ตฐ๊ฐ๊ฐ ๊ทธ๊ฒ์ ๊ฐ์ ธ๊ฐ๋ ๊ทธ ์๊ฐ์ ๊ทธ ๊ณณ์ ์์ด์ผํฉ๋๋ค. |
|||
|
|||
์นด์ดํฐ ์์์ ์ค๋ซ๋์ ๊ธฐ๋ค๋ฆฐ ํ์ ๐ , ์ ์/์๋ฆฌ์ฌ ๐จโ๐ณ ๊ฐ ๋น์ ์ ๋ฒ๊ฑฐ ๐ ๋ฅผ ๊ฐ์ง๊ณ ๋์์ต๋๋ค. |
|||
|
|||
๋น์ ์ ๋ฒ๊ฑฐ๋ฅผ ๋ฐ๊ณ ์ง์ฌ๋ ์๋์ ํจ๊ป ํ
์ด๋ธ๋ก ๋์์ต๋๋ค. |
|||
|
|||
๋จ์ง ๋จน๊ธฐ๋ง ํ๋ค๊ฐ, ๋ค ๋จน์์ต๋๋ค ๐ โน. |
|||
|
|||
์นด์ดํฐ ์์์ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ๐ ๋๋ฌด ๋ง์ ์๊ฐ์ ํ๋นํ๊ธฐ ๋๋ฌธ์ ๋ํ๋ฅผ ํ๊ฑฐ๋ ์์
์ ๊ฑธ ์๊ฐ์ด ๊ฑฐ์ ์์์ต๋๋ค ๐ . |
|||
|
|||
--- |
|||
|
|||
์ด ๋ณ๋ ฌ ๋ฒ๊ฑฐ ์๋๋ฆฌ์ค์์, ๋น์ ์ ๊ธฐ๋ค๋ฆฌ๊ณ ๐ , ์ค๋ ์๊ฐ๋์ "์นด์ดํฐ์์ ๊ธฐ๋ค๋ฆฌ๋" ๐ ๋ฐ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๋ โฏ ๋ ๊ฐ์ ํ๋ก์ธ์(๋น์ ๊ณผ ์ง์ฌ๋ ์๋๐)๋ฅผ ๊ฐ์ง ์ปดํจํฐ / ํ๋ก๊ทธ๋จ ๐ค ์
๋๋ค. |
|||
|
|||
ํจ์คํธํธ๋์ ์๋ 8๊ฐ์ ํ๋ก์ธ์(์ ์/์๋ฆฌ์ฌ) ๐ฉโ๐ณ๐จโ๐ณ๐ฉโ๐ณ๐จโ๐ณ๐ฉโ๐ณ๐จโ๐ณ๐ฉโ๐ณ๐จโ๐ณ ๊ฐ ์์ต๋๋ค. ๋์ ๋ฒ๊ฑฐ๋ ๋จ ๋ ๊ฐ(ํ ๋ช
์ ์ง์๊ณผ ํ ๋ช
์ ์๋ฆฌ์ฌ) ๐ ๐จโ๐ณ ๋ง์ ๊ฐ์ง๊ณ ์์์ต๋๋ค. |
|||
|
|||
ํ์ง๋ง ์ฌ์ ํ, ๋ณ๋ ฌ ๋ฒ๊ฑฐ ์์๊ฐ ์ต์ ์ ์๋๋๋ค ๐ . |
|||
|
|||
--- |
|||
|
|||
์ด ์์๋ ๋ฒ๊ฑฐ๐ ์ด์ผ๊ธฐ์ ๊ฒฐ์ด ๊ฐ์ต๋๋ค. |
|||
|
|||
๋ "ํ์ค์ ์ธ" ์์๋ก, ์ํ์ ์์ํด๋ณด์ญ์์ค. |
|||
|
|||
์ต๊ทผ๊น์ง, ๋๋ค์์ ์ํ์๋ ๋ค์์ ์ํ์๋ค ๐จโ๐ผ๐จโ๐ผ๐จโ๐ผ๐จโ๐ผ ๊ณผ ๊ธด ์ค ๐๐๐๐๐๐๐๐ ์ด ์์ต๋๋ค. |
|||
|
|||
๋ชจ๋ ์ํ์๋ค์ ํ ๋ช
ํ ๋ช
์ ๊ณ ๊ฐ๋ค์ ์ฐจ๋ก๋ก ์๋ํฉ๋๋ค ๐จโ๐ผโฏ . |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ๋น์ ์ ์ค๋ซ๋์ ์ค์์ ๊ธฐ๋ค๋ ค์ผํ๊ณ ๐ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋น์ ์ ์ฐจ๋ก๋ฅผ ์๊ฒ ๋ฉ๋๋ค. |
|||
|
|||
์๋ง ๋น์ ์ ์ํ ๐ฆ ์ฌ๋ถ๋ฆ์ ์ง์ฌ๋ ์๋ ๐ ๋ฅผ ๋ฐ๋ ค๊ฐ๊ณ ์ถ์ง๋ ์์ ๊ฒ์
๋๋ค. |
|||
|
|||
### ๋ฒ๊ฑฐ ์์์ ๊ฒฐ๋ก |
|||
|
|||
"์ง์ฌ๋ ์๋์์ ํจ์คํธํธ๋์ ๋ฒ๊ฑฐ" ์๋๋ฆฌ์ค์์, ์ค๋ ๊ธฐ๋ค๋ฆผ ๐ ์ด ์๊ธฐ ๋๋ฌธ์ ๋์ ์์คํ
โธ๐โฏ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์
๋๋ค. |
|||
|
|||
๋๋ค์์ ์น ์์ฉํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ๊ฐ ๊ทธ๋ฌํฉ๋๋ค. |
|||
|
|||
๋งค์ฐ ๋ง์ ์์ ์ ์ ๊ฐ ์์ง๋ง, ์๋ฒ๋ ๊ทธ๋ค์ ์์ฒญ์ ์ ์กํ๊ธฐ ์ํด ๊ทธ๋ฅ-์ข์ง-์์ ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค ๐ . |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ์๋ต์ด ๋์์ฌ ๋๊น์ง ๋ค์ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค ๐ . |
|||
|
|||
์ด "๊ธฐ๋ค๋ฆผ" ๐ ์ ๋ง์ดํฌ๋ก์ด ๋จ์์ด์ง๋ง, ๋ชจ๋ ๋ํด์ง๋ฉด, ๊ฒฐ๊ตญ์๋ ๋งค์ฐ ๊ธด ๋๊ธฐ์๊ฐ์ด ๋ฉ๋๋ค. |
|||
|
|||
๋ฐ๋ผ์ ์น API๋ฅผ ์ํด ๋น๋๊ธฐ โธ๐โฏ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค. |
|||
|
|||
๋๋ถ๋ถ์ ์กด์ฌํ๋ ์ ๋ช
ํ ํ์ด์ฌ ํ๋ ์์ํฌ (Flask์ Django ๋ฑ)์ ์๋ก์ด ๋น๋๊ธฐ ๊ธฐ๋ฅ๋ค์ด ํ์ด์ฌ์ ์กด์ฌํ๊ธฐ ์ ์ ๋ง๋ค์ด์ก์ต๋๋ค. ๊ทธ๋์, ๊ทธ๋ค์ ๋ฐฐํฌ ๋ฐฉ์์ ๋ณ๋ ฌ ์คํ๊ณผ ์๋ก์ด ๊ธฐ๋ฅ๋งํผ ๊ฐ๋ ฅํ์ง๋ ์์ ์์ ๋ฒ์ ์ ๋น๋๊ธฐ ์คํ์ ์ง์ํฉ๋๋ค. |
|||
|
|||
๋น๋๊ธฐ ์น ํ์ด์ฌ(ASGI)์ ๋ํ ์ฃผ์ ๋ช
์ธ๊ฐ ์น์์ผ์ ์ง์ํ๊ธฐ ์ํด Django์์ ๊ฐ๋ฐ ๋์์์๋ ๊ทธ๋ ์ต๋๋ค. |
|||
|
|||
์ด๋ฌํ ์ข
๋ฅ์ ๋น๋๊ธฐ์ฑ์ (NodeJS๋ ๋ณ๋ ฌ์ ์ด์ง ์์์๋) NodeJS๊ฐ ์ฌ๋๋ฐ๋ ์ด์ ์ด๊ณ , ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก์์ Go์ ๊ฐ์ ์
๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ **FastAPI**๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๋์ผํ ์ฑ๋ฅ์ ๋ผ ์ ์์ต๋๋ค. |
|||
|
|||
๋ํ ๋ณ๋ ฌ์ฑ๊ณผ ๋น๋๊ธฐ์ฑ์ ๋์์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, ๋๋ถ๋ถ์ ํ
์คํธ๊ฐ ์๋ฃ๋ NodeJS ํ๋ ์์ํฌ๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ ์ป๊ณ C์ ๋ ๊ฐ๊น์ด ์ปดํ์ผ ์ธ์ด์ธ Go์ ๋๋ฑํ ์ฑ๋ฅ์ ์ป์ ์ ์์ต๋๋ค<a href="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1" class="external-link" target="_blank">(๋ชจ๋ Starlette ๋๋ถ์
๋๋ค)</a>. |
|||
|
|||
### ๋์์ฑ์ด ๋ณ๋ ฌ์ฑ๋ณด๋ค ๋ ๋์๊ฐ? |
|||
|
|||
๊ทธ๋ ์ง ์์ต๋๋ค! ๊ทธ๊ฒ์ด ์ด์ผ๊ธฐ์ ๊ตํ์ ์๋๋๋ค. |
|||
|
|||
๋์์ฑ์ ๋ณ๋ ฌ์ฑ๊ณผ ๋ค๋ฆ
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ง์ ๋๊ธฐ๋ฅผ ํ์๋กํ๋ **ํน์ ํ** ์๋๋ฆฌ์ค์์๋ ๋ ๋ซ์ต๋๋ค. ์ด๋ก ์ธํด, ์น ์์ฉํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์์ ๋์์ฑ์ด ๋ณ๋ ฌ์ฑ๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ํจ์ฌ ๋ซ์ต๋๋ค. ํ์ง๋ง ๋ชจ๋ ๊ฒฝ์ฐ์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋๋ค. |
|||
|
|||
๋ฐ๋ผ์, ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด, ๋ค์์ ์งง์ ์ด์ผ๊ธฐ๋ฅผ ์์ํด๋ณด์ญ์์ค: |
|||
|
|||
> ๋น์ ์ ํฌ๊ณ , ๋๋ฌ์ด ์ง์ ์ฒญ์ํด์ผํฉ๋๋ค. |
|||
|
|||
*๋ค, ์ด๊ฒ ์ ๋ถ์
๋๋ค*. |
|||
|
|||
--- |
|||
|
|||
์ด๋์๋ ๋๊ธฐ ๐ ๋ ์๊ณ , ์ง์ ๊ณณ๊ณณ์์ ํด์ผํ๋ ๋ง์ ์์
๋ค๋ง ์์ต๋๋ค. |
|||
|
|||
๋ฒ๊ฑฐ ์์์ฒ๋ผ ์ฒ์์๋ ๊ฑฐ์ค, ๊ทธ ๋ค์์ ๋ถ์๊ณผ ๊ฐ์ ์์ผ๋ก ์์๋ฅผ ์ ํ ์๋ ์์ผ๋, ๋ฌด์๋ ๊ธฐ๋ค๋ฆฌ์ง ๐ ์๊ณ ๊ณ์ํด์ ์ฒญ์ ์์
๋ง ์ํํ๊ธฐ ๋๋ฌธ์, ์์๋ ์๋ฌด๋ฐ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. |
|||
|
|||
์์๊ฐ ์๋ ์๋ ๋์ผํ ์๊ฐ์ด ์์๋ ๊ฒ์ด๊ณ (๋์์ฑ) ๋์ผํ ์์ ์์
์ ํ๊ฒ ๋ ๊ฒ์
๋๋ค. |
|||
|
|||
ํ์ง๋ง ์ด ๊ฒฝ์ฐ์์, 8๋ช
์ ์ (ๅ)-์ ์/์๋ฆฌ์ฌ์ด๋ฉด์-ํ(็พ)-์ฒญ์๋ถ ๐ฉโ๐ณ๐จโ๐ณ๐ฉโ๐ณ๐จโ๐ณ๐ฉโ๐ณ๐จโ๐ณ๐ฉโ๐ณ๐จโ๐ณ ๋ฅผ ๊ณ ์ฉํ ์ ์๊ณ , ๊ทธ๋ค ๊ฐ์(๊ทธ๋ฆฌ๊ณ ๋น์ )๊ฐ ์ง์ ํ ๋ถ๋ถ์ฉ ๋งก์ ์ฒญ์๋ฅผ ํ๋ค๋ฉด, ๋น์ ์ **๋ณ๋ ฌ์ **์ผ๋ก ์์
์ ์ํํ ์ ์๊ณ , ์กฐ๊ธ์ ๋์์ด ์๋ค๋ฉด, ํจ์ฌ ๋ ๋นจ๋ฆฌ ๋๋ผ ์ ์์ต๋๋ค. |
|||
|
|||
์ด ์๋๋ฆฌ์ค์์, (๋น์ ์ ํฌํจํ) ๊ฐ๊ฐ์ ์ฒญ์๋ถ๋ค์ ํ๋ก์ธ์๊ฐ ๋ ๊ฒ์ด๊ณ , ๊ฐ์์ ์ญํ ์ ์ํํฉ๋๋ค. |
|||
|
|||
์คํ ์๊ฐ์ ๋๋ถ๋ถ์ด ๋๊ธฐ๊ฐ ์๋ ์ค์ ์์
์ ์์๋๊ณ , ์ปดํจํฐ์์ ์์
์ <abbr title="Central Processing Unit">CPU</abbr>์์ ์ด๋ฃจ์ด์ง๋ฏ๋ก, ์ด๋ฌํ ๋ฌธ์ ๋ฅผ "CPU์ ๋ฌถ์"๋ค๊ณ ํฉ๋๋ค. |
|||
|
|||
--- |
|||
|
|||
CPU์ ๋ฌถ์ธ ์ฐ์ฐ์ ๊ดํ ํํ ์์๋ ๋ณต์กํ ์ํ ์ฒ๋ฆฌ๋ฅผ ํ์๋ก ํ๋ ๊ฒฝ์ฐ์
๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด: |
|||
|
|||
* **์ค๋์ค** ๋๋ **์ด๋ฏธ์ง** ์ฒ๋ฆฌ. |
|||
* **์ปดํจํฐ ๋น์ **: ํ๋์ ์ด๋ฏธ์ง๋ ์๋ฐฑ๊ฐ์ ํฝ์
๋ก ๊ตฌ์ฑ๋์ด์๊ณ , ๊ฐ ํฝ์
์ 3๊ฐ์ ๊ฐ / ์์ ๊ฐ๊ณ ์์ผ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ํด๋น ํฝ์
๋ค์ ๋ํด ๋์์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ณ์ฐํด์ผํ๋ ์ฒ๋ฆฌ. |
|||
* **๋จธ์ ๋ฌ๋**: ์ผ๋ฐ์ ์ผ๋ก ๋ง์ "ํ๋ ฌ"๊ณผ "๋ฒกํฐ" ๊ณฑ์
์ด ํ์ํฉ๋๋ค. ๊ฑฐ๋ํ ์คํ๋ ๋ ์ํธ์ ์๋ค์ด ์๊ณ ๊ทธ ์๋ค์ ๋์์ ๊ณฑํด์ผ ํ๋ค๊ณ ์๊ฐํด๋ณด์ญ์์ค. |
|||
* **๋ฅ๋ฌ๋**: ๋จธ์ ๋ฌ๋์ ํ์์์ญ์ผ๋ก, ๋์ผํ ์์๊ฐ ์ ์ฉ๋ฉ๋๋ค. ๋จ์ง ์ด ๊ฒฝ์ฐ์๋ ํ๋์ ์คํ๋ ๋ ์ํธ์ ๊ณฑํด์ผํ ์๋ค์ด ์๋ ๊ฒ์ด ์๋๋ผ, ๊ฑฐ๋ํ ์ธํธ์ ์คํ๋ ๋ ์ํธ๋ค์ด ์๊ณ , ๋ง์ ๊ฒฝ์ฐ์, ์ด ๋ชจ๋ธ๋ค์ ๋ง๋ค๊ณ ์ฌ์ฉํ๊ธฐ ์ํด ํน์ํ ํ๋ก์ธ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
|||
|
|||
### ๋์์ฑ + ๋ณ๋ ฌ์ฑ: ์น + ๋จธ์ ๋ฌ๋ |
|||
|
|||
**FastAPI**๋ฅผ ์ฌ์ฉํ๋ฉด ์น ๊ฐ๋ฐ์์๋ ๋งค์ฐ ํํ ๋์์ฑ์ ์ด์ ์ (NodeJS์ ์ฃผ๋ ๋งค๋ ฅ๋งํผ) ์ป์ ์ ์์ต๋๋ค. |
|||
|
|||
๋ฟ๋ง ์๋๋ผ ๋จธ์ ๋ฌ๋ ์์คํ
๊ณผ ๊ฐ์ด **CPU์ ๋ฌถ์ธ** ์์
์ ์ํด ๋ณ๋ ฌ์ฑ๊ณผ ๋ฉํฐํ๋ก์ธ์ฑ(๋ค์์ ํ๋ก์ธ์ค๋ฅผ ๋ณ๋ ฌ์ ์ผ๋ก ๋์์ํค๋ ๊ฒ)์ ์ด์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. |
|||
|
|||
ํ์ด์ฌ์ด **๋ฐ์ดํฐ ์ฌ์ด์ธ์ค**, ๋จธ์ ๋ฌ๋๊ณผ ํนํ ๋ฅ๋ฌ๋์ ์ ์ฃผ๋ ์ธ์ด๋ผ๋ ๊ฐ๋จํ ์ฌ์ค์ ๋ํด์, ์ด๊ฒ์ FastAPI๋ฅผ ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค / ๋จธ์ ๋ฌ๋ ์น API์ ์์ฉํ๋ก๊ทธ๋จ์ (๋ค๋ฅธ ๊ฒ๋ค๋ณด๋ค) ์ข์ ์ ํ์ง๊ฐ ๋๊ฒ ํฉ๋๋ค. |
|||
|
|||
๋ฐฐํฌ์ ๋ณ๋ ฌ์ ์ด๋ป๊ฒ ๊ฐ๋ฅํ๊ฒ ํ๋์ง ์๊ณ ์ถ๋ค๋ฉด, [๋ฐฐํฌ](/ko/deployment){.internal-link target=_blank}๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ญ์์ค. |
|||
|
|||
## `async`์ `await` |
|||
|
|||
์ต์ ํ์ด์ฌ ๋ฒ์ ์๋ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ ์ํ๋ ๋งค์ฐ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด๋ ์ด๊ฒ์ ํ๋ฒํ "์์ฐจ์ " ์ฝ๋๋ก ๋ณด์ด๊ฒ ํ๊ณ , ์ ์ ํ ์๊ฐ์ ๋น์ ์ ์ํด "๋๊ธฐ"ํฉ๋๋ค. |
|||
|
|||
์ฐ์ฐ์ด ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํ๊ธฐ ์ ์ ๋๊ธฐ๋ฅผ ํด์ผํ๊ณ ์๋ก์ด ํ์ด์ฌ ๊ธฐ๋ฅ๋ค์ ์ง์ํ๋ค๋ฉด, ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค: |
|||
|
|||
```Python |
|||
burgers = await get_burgers(2) |
|||
``` |
|||
|
|||
์ฌ๊ธฐ์ ํต์ฌ์ `await`์
๋๋ค. ์ด๊ฒ์ ํ์ด์ฌ์๊ฒ `burgers` ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ด์ ์ `get_burgers(2)`์ ์์
์ด ์๋ฃ๋๊ธฐ๋ฅผ ๐ ๊ธฐ๋ค๋ฆฌ๋ผ๊ณ โธ ๋งํฉ๋๋ค. ์ด๋ก ์ธํด, ํ์ด์ฌ์ ๊ทธ๋์ (๋ค๋ฅธ ์์ฒญ์ ๋ฐ๋ ๊ฒ๊ณผ ๊ฐ์) ๋ค๋ฅธ ์์
์ ์ํํด๋ ๋๋ค๋ ๊ฒ์ ๐ โฏ ์๊ฒ๋ ๊ฒ์
๋๋ค. |
|||
|
|||
`await`๊ฐ ๋์ํ๊ธฐ ์ํด, ์ด๊ฒ์ ๋น๋๊ธฐ๋ฅผ ์ง์ํ๋ ํจ์ ๋ด๋ถ์ ์์ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด์ ํจ์๋ฅผ `async def`๋ฅผ ์ฌ์ฉํด ์ ์ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค: |
|||
|
|||
```Python hl_lines="1" |
|||
async def get_burgers(number: int): |
|||
# Do some asynchronous stuff to create the burgers |
|||
return burgers |
|||
``` |
|||
|
|||
...`def`๋ฅผ ์ฌ์ฉํ๋ ๋์ : |
|||
|
|||
```Python hl_lines="2" |
|||
# This is not asynchronous |
|||
def get_sequential_burgers(number: int): |
|||
# Do some sequential stuff to create the burgers |
|||
return burgers |
|||
``` |
|||
|
|||
`async def`๋ฅผ ์ฌ์ฉํ๋ฉด, ํ์ด์ฌ์ ํด๋น ํจ์ ๋ด์์ `await` ํํ์ ์ฃผ์ํด์ผํ๋ค๋ ์ฌ์ค๊ณผ, ํด๋น ํจ์์ ์คํ์ "์ผ์์ ์ง"โธํ๊ณ ๋ค์ ๋์์ค๊ธฐ ์ ๊น์ง ๋ค๋ฅธ ์์
์ ์ํ๐ํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ๋ฉ๋๋ค. |
|||
|
|||
`async def`f ํจ์๋ฅผ ํธ์ถํ๊ณ ์ ํ ๋, "๋๊ธฐ"ํด์ผํฉ๋๋ค. ๋ฐ๋ผ์, ์๋๋ ๋์ํ์ง ์์ต๋๋ค. |
|||
|
|||
```Python |
|||
# This won't work, because get_burgers was defined with: async def |
|||
burgers = get_burgers(2) |
|||
``` |
|||
|
|||
--- |
|||
|
|||
๋ฐ๋ผ์, `await`f๋ฅผ ์ฌ์ฉํด์ ํธ์ถํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด `async def`๋ฅผ ์ฌ์ฉํ๋ *๊ฒฝ๋ก ์๋ ํจ์*๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค: |
|||
|
|||
```Python hl_lines="2-3" |
|||
@app.get('/burgers') |
|||
async def read_burgers(): |
|||
burgers = await get_burgers(2) |
|||
return burgers |
|||
``` |
|||
|
|||
### ๋ ์ธ๋ถ์ ์ธ ๊ธฐ์ ์ ์ฌํญ |
|||
|
|||
`await`๊ฐ `async def`๋ฅผ ์ฌ์ฉํ๋ ํจ์ ๋ด๋ถ์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋์น์ฑ์
จ์ ๊ฒ์
๋๋ค. |
|||
|
|||
ํ์ง๋ง ๋์์, `async def`๋ก ์ ์๋ ํจ์๋ค์ "๋๊ธฐ"๋์ด์ผ๋ง ํฉ๋๋ค. ๋ฐ๋ผ์, `async def`๋ฅผ ์ฌ์ฉํ ํจ์๋ค์ ์ญ์ `async def`๋ฅผ ์ฌ์ฉํ ํจ์ ๋ด๋ถ์์๋ง ํธ์ถ๋ ์ ์์ต๋๋ค. |
|||
|
|||
๊ทธ๋ ๋ค๋ฉด ๋ญ์ด ๋จผ์ ๋, ๋ฌ๊ฑ์ด ๋จผ์ ๋, ์ฒซ `async` ํจ์๋ฅผ ์ด๋ป๊ฒ ํธ์ถํ ์ ์๊ฒ ์ต๋๊น? |
|||
|
|||
**FastAPI**๋ฅผ ์ฌ์ฉํด ์์
ํ๋ค๋ฉด ์ด๊ฒ์ ๊ฑฑ์ ํ์ง ์์๋ ๋ฉ๋๋ค. ์๋ํ๋ฉด ๊ทธ "์ฒซ" ํจ์๋ ๋น์ ์ *๊ฒฝ๋ก ์๋ ํจ์*๊ฐ ๋ ๊ฒ์ด๊ณ , FastAPI๋ ์ด๋ป๊ฒ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ง ์๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค. |
|||
|
|||
ํ์ง๋ง FastAPI๋ฅผ ์ฌ์ฉํ์ง ์๊ณ `async` / `await`๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์ด ์ญ์ ๊ฐ๋ฅํฉ๋๋ค. |
|||
|
|||
### ๋น์ ๋ง์ ๋น๋๊ธฐ ์ฝ๋ ์์ฑํ๊ธฐ |
|||
|
|||
Starlette(๊ทธ๋ฆฌ๊ณ FastAPI)๋ <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์๊ณ , ๋ฐ๋ผ์ ํ์ด์ฌ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ <a href="https://docs.python.org/3/library/asyncio-task.html" class="external-link" target="_blank">asyncio</a> ๋ฐ <a href="https://trio.readthedocs.io/en/stable/" class="external-link" target="_blank">Trio</a>์ ํธํ๋ฉ๋๋ค. |
|||
|
|||
ํนํ, ์ฝ๋์์ ๊ณ ๊ธ ํจํด์ด ํ์ํ ๊ณ ๊ธ ๋์์ฑ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ง์ ์ ์ผ๋ก <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
FastAPI๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋, ๋์ ํธํ์ฑ ๋ฐ <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>์ ์ด์ (์: *๊ตฌ์กฐํ๋ ๋์์ฑ*)์ ์ทจํ๊ธฐ ์ํด <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ ์์ฉํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์ต๋๋ค. |
|||
|
|||
### ๋น๋๊ธฐ ์ฝ๋์ ๋ค๋ฅธ ํํ |
|||
|
|||
ํ์ด์ฌ์์ `async`์ `await`๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ ๋น๊ต์ ์ต๊ทผ์ ์ผ์
๋๋ค. |
|||
|
|||
ํ์ง๋ง ์ด๋ก ์ธํด ๋น๋๊ธฐ ์ฝ๋ ์์
์ด ํจ์ฌ ๊ฐ๋จํด์ก์ต๋๋ค. |
|||
|
|||
๊ฐ์ (๋๋ ๊ฑฐ์ ์ ์ฌํ) ๋ฌธ๋ฒ์ ์ต์ ๋ฒ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ(๋ธ๋ผ์ฐ์ ์ NodeJS)์๋ ์ถ๊ฐ๋์์ต๋๋ค. |
|||
|
|||
ํ์ง๋ง ๊ทธ ์ด์ ์, ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ฝค ๋ณต์กํ๊ณ ์ด๋ ค์ด ์ผ์ด์์ต๋๋ค. |
|||
|
|||
ํ์ด์ฌ์ ์์ ๋ฒ์ ์ด๋ผ๋ฉด, ์ค๋ ๋ ๋๋ <a href="https://www.gevent.org/" class="external-link" target="_blank">Gevent</a>๋ฅผ ์ฌ์ฉํ ์ ์์ ๊ฒ์
๋๋ค. ํ์ง๋ง ์ฝ๋๋ฅผ ์ดํดํ๊ณ , ๋๋ฒ๊น
ํ๊ณ , ์ด์ ๋ํด ์๊ฐํ๋๊ฒ ํจ์ฌ ๋ณต์กํฉ๋๋ค. |
|||
|
|||
์์ ๋ฒ์ ์ NodeJS / ๋ธ๋ผ์ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ผ๋ฉด, "์ฝ๋ฐฑ ํจ์"๋ฅผ ์ฌ์ฉํ์ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ก ์ธํด <a href="http://callbackhell.com/" class="external-link" target="_blank">์ฝ๋ฐฑ ์ง์ฅ</a>์ ๋น ์ง๊ฒ ๋ ์ ์์ต๋๋ค. |
|||
|
|||
## ์ฝ๋ฃจํด |
|||
|
|||
**์ฝ๋ฃจํด**์ `async def` ํจ์๊ฐ ๋ฐํํ๋ ๊ฒ์ ์นญํ๋ ๋งค์ฐ ๊ณ ๊ธ์ค๋ฌ์ด ์ฉ์ด์ผ ๋ฟ์
๋๋ค. ํ์ด์ฌ์ ๊ทธ๊ฒ์ด ์์๋๊ณ ์ด๋ ์์ ์์ ์๋ฃ๋์ง๋ง ๋ด๋ถ์ `await`๊ฐ ์์ ๋๋ง๋ค ๋ด๋ถ์ ์ผ๋ก ์ผ์์ ์งโธ๋ ์๋ ์๋ ํจ์์ ์ ์ฌํ ๊ฒ์ด๋ผ๋ ์ฌ์ค์ ์๊ณ ์์ต๋๋ค. |
|||
|
|||
๊ทธ๋ฌ๋ `async` ๋ฐ `await`์ ํจ๊ป ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ์ด ๋ชจ๋ ๊ธฐ๋ฅ๋ค์ "์ฝ๋ฃจํด"์ผ๋ก ๊ฐ๋จํ ์์ฝ๋ฉ๋๋ค. ์ด๊ฒ์ Go์ ์ฃผ๋ ํต์ฌ ๊ธฐ๋ฅ์ธ "๊ณ ๋ฃจํด"์ ๊ฒฌ์ค ์ ์์ต๋๋ค. |
|||
|
|||
## ๊ฒฐ๋ก |
|||
|
|||
์๊ธฐ ๋ฌธ์ฅ์ ๋ค์ ํ ๋ฒ ๋ด
์๋ค: |
|||
|
|||
> ์ต์ ํ์ด์ฌ ๋ฒ์ ์ **`async` ๋ฐ `await`** ๋ฌธ๋ฒ๊ณผ ํจ๊ป **โ์ฝ๋ฃจํดโ**์ด๋ผ๊ณ ํ๋ ๊ฒ์ ์ฌ์ฉํ๋ **โ๋น๋๊ธฐ ์ฝ๋โ**๋ฅผ ์ง์ํฉ๋๋ค. |
|||
|
|||
์ด์ ์ด ๋ง์ ์กฐ๊ธ ๋ ์ดํดํ ์ ์์ ๊ฒ์
๋๋ค. โจ |
|||
|
|||
์ด๊ฒ์ด (Starlette์ ํตํด) FastAPI๋ฅผ ๊ฐํ๊ฒ ํ๋ฉด์ ๊ทธ๊ฒ์ด ์ธ์์ ์ธ ์ฑ๋ฅ์ ๋ผ ์ ์๊ฒ ํฉ๋๋ค. |
|||
|
|||
## ๋งค์ฐ ์ธ๋ถ์ ์ธ ๊ธฐ์ ์ ์ฌํญ |
|||
|
|||
!!! warning "๊ฒฝ๊ณ " |
|||
์ด ๋ถ๋ถ์ ๋์ด๊ฐ๋ ๋ฉ๋๋ค. |
|||
|
|||
์ด๊ฒ๋ค์ **FastAPI**๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง์ ๋ํ ๋งค์ฐ ์ธ๋ถ์ ์ธ ๊ธฐ์ ์ฌํญ์
๋๋ค. |
|||
|
|||
๋ง์ฝ ๊ธฐ์ ์ ์ง์(์ฝ๋ฃจํด, ์ค๋ ๋, ๋ธ๋กํน ๋ฑ)์ด ์๊ณ FastAPI๊ฐ ์ด๋ป๊ฒ `async def` vs `def`๋ฅผ ๋ค๋ฃจ๋์ง ๊ถ๊ธํ๋ค๋ฉด, ๊ณ์ํ์ญ์์ค. |
|||
|
|||
### ๊ฒฝ๋ก ์๋ ํจ์ |
|||
|
|||
๊ฒฝ๋ก ์๋ ํจ์๋ฅผ `async def` ๋์ ์ผ๋ฐ์ ์ธ `def`๋ก ์ ์ธํ๋ ๊ฒฝ์ฐ, (์๋ฒ๋ฅผ ์ฐจ๋จํ๋ ๊ฒ์ฒ๋ผ) ๊ทธ๊ฒ์ ์ง์ ํธ์ถํ๋ ๋์ ๋๊ธฐ์ค์ธ ์ธ๋ถ ์ค๋ ๋ํ์์ ์คํ๋ฉ๋๋ค. |
|||
|
|||
๋ง์ฝ ์๊ธฐ์ ๋ฌ์ฌ๋๋๋ก ๋์ํ์ง ์๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํด์๊ณ ์ฝ๊ฐ์ ์ฑ๋ฅ ํฅ์ (์ฝ 100 ๋๋
ธ์ด)์ ์ํด `def`๋ฅผ ์ฌ์ฉํด์ ๊ณ์ฐ๋ง์ ์ํ ์ฌ์ํ *๊ฒฝ๋ก ์๋ ํจ์*๋ฅผ ์ ์ํด์๋ค๋ฉด, **FastAPI**๋ ์ด์๋ ๋ฐ๋๋ผ๋ ๊ฒ์ ์ฃผ์ํ์ญ์์ค. ์ด๋ฌํ ๊ฒฝ์ฐ์, *๊ฒฝ๋ก ์๋ ํจ์*๊ฐ ๋ธ๋กํน <abbr title="Input/Output: ๋์คํฌ ์ฝ๊ธฐ ๋๋ ์ฐ๊ธฐ, ๋คํธ์ํฌ ํต์ .">I/O</abbr>๋ฅผ ์ํํ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ `async def`๋ฅผ ์ฌ์ฉํ๋ ํธ์ด ๋ ๋ซ์ต๋๋ค. |
|||
|
|||
ํ์ง๋ง ๋ ๊ฒฝ์ฐ ๋ชจ๋, FastAPI๊ฐ ๋น์ ์ด ์ ์ ์ฌ์ฉํ๋ ํ๋ ์์ํฌ๋ณด๋ค [๋ ๋น ๋ฅผ](/#performance){.internal-link target=_blank} (์ต์ํ ๋น๊ฒฌ๋ ) ํ๋ฅ ์ด ๋์ต๋๋ค. |
|||
|
|||
### ์์กด์ฑ |
|||
|
|||
์์กด์ฑ์๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค. ์์กด์ฑ์ด `async def`๊ฐ ์๋ ํ์ค `def` ํจ์๋ผ๋ฉด, ์ธ๋ถ ์ค๋ ๋ํ์์ ์คํ๋ฉ๋๋ค. |
|||
|
|||
### ํ์-์์กด์ฑ |
|||
|
|||
ํจ์ ์ ์์ ๋งค๊ฐ๋ณ์๋ก ์๋ก๋ฅผ ํ์๋กํ๋ ๋ค์์ ์์กด์ฑ๊ณผ ํ์-์์กด์ฑ์ ๊ฐ์ง ์ ์๊ณ , ๊ทธ ์ค ์ผ๋ถ๋ `async def`๋ก, ๋ค๋ฅธ ์ผ๋ถ๋ ์ผ๋ฐ์ ์ธ `def`๋ก ์์ฑ๋์์ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ ํ ์ ๋์ํ๊ณ , ์ผ๋ฐ์ ์ธ `def`๋ก ์์ฑ๋ ๊ฒ๋ค์ "๋๊ธฐ"๋๋ ๋์ ์ (์ค๋ ๋ํ๋ก๋ถํฐ) ์ธ๋ถ ์ค๋ ๋์์ ํธ์ถ๋ฉ๋๋ค. |
|||
|
|||
### ๋ค๋ฅธ ์ ํธ๋ฆฌํฐ ํจ์ |
|||
|
|||
์ง์ ํธ์ถ๋๋ ๋ค๋ฅธ ๋ชจ๋ ์ ํธ๋ฆฌํฐ ํจ์๋ ์ผ๋ฐ์ ์ธ `def`๋ `async def`๋ก ์์ฑ๋ ์ ์๊ณ FastAPI๋ ์ด๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. |
|||
|
|||
์ด๊ฒ์ FastAPI๊ฐ ๋น์ ์ ์ํด ํธ์ถํ๋ ํจ์์๋ ๋ฐ๋์
๋๋ค: *๊ฒฝ๋ก ์๋ ํจ์*์ ์์กด์ฑ |
|||
|
|||
๋ง์ฝ ๋น์ ์ ์ ํธ๋ฆฌํฐ ํจ์๊ฐ `def`๋ฅผ ์ฌ์ฉํ ์ผ๋ฐ์ ์ธ ํจ์๋ผ๋ฉด, ์ค๋ ๋ํ์์๊ฐ ์๋๋ผ ์ง์ ํธ์ถ(๋น์ ์ด ์ฝ๋์ ์์ฑํ ๋๋ก)๋ ๊ฒ์ด๊ณ , `async def`๋ก ์์ฑ๋ ํจ์๋ผ๋ฉด ์ฝ๋์์ ํธ์ถํ ๋ ๊ทธ ํจ์๋ฅผ `await` ํด์ผ ํฉ๋๋ค. |
|||
|
|||
--- |
|||
|
|||
๋ค์ ๋งํ์ง๋ง, ์ด๊ฒ์ ๋น์ ์ด ์ด๊ฒ์ ๋ํด ์ฐพ๊ณ ์๋ ๊ฒฝ์ฐ์ ํํด ์ ์ฉํ ๋งค์ฐ ์ธ๋ถ์ ์ธ ๊ธฐ์ ์ฌํญ์
๋๋ค. |
|||
|
|||
๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ, ์๊ธฐ์ ๊ฐ์ด๋๋ผ์ธ๋ง์ผ๋ก๋ ์ถฉ๋ถํ ๊ฒ์
๋๋ค: [๋ฐ์์ ๊ฒฝ์ฐ](#in-a-hurry). |
Loadingโฆ
Reference in new issue