committed by
GitHub
1 changed files with 275 additions and 0 deletions
@ -0,0 +1,275 @@ |
|||
# yield๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ |
|||
|
|||
FastAPI๋ <abbr title='๋๋ก๋ "์ข
๋ฃ ์ฝ๋", "์ ๋ฆฌ ์ฝ๋", "์ข
๋ฃ ์ฒ๋ฆฌ ์ฝ๋", "๋ซ๊ธฐ ์ฝ๋", "์ปจํ
์คํธ ๊ด๋ฆฌ์ ์ข
๋ฃ ์ฝ๋" ๋ฑ์ผ๋ก๋ ๋ถ๋ฆฝ๋๋ค'>์์
์๋ฃ ํ ์ถ๊ฐ ๋จ๊ณ๋ฅผ ์ํํ๋</abbr> ์์กด์ฑ์ ์ง์ํฉ๋๋ค. |
|||
|
|||
์ด๋ฅผ ๊ตฌํํ๋ ค๋ฉด `return` ๋์ `yield`๋ฅผ ์ฌ์ฉํ๊ณ , ์ถ๊ฐ๋ก ์คํํ ๋จ๊ณ (์ฝ๋)๋ฅผ ๊ทธ ๋ค์ ์์ฑํ์ธ์. |
|||
|
|||
/// tip | ํ |
|||
|
|||
๊ฐ ์์กด์ฑ๋ง๋ค `yield`๋ ํ ๋ฒ๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค. |
|||
|
|||
/// |
|||
|
|||
/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ |
|||
|
|||
๋ค์๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ํจ์: |
|||
|
|||
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> ๋๋ |
|||
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a> |
|||
|
|||
๋ **FastAPI**์ ์์กด์ฑ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
์ฌ์ค, FastAPI๋ ๋ด๋ถ์ ์ผ๋ก ์ด ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
|||
|
|||
/// |
|||
|
|||
## `yield`๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์กด์ฑ |
|||
|
|||
์๋ฅผ ๋ค์ด, ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์
์ ์์ฑํ๊ณ ์์
์ด ๋๋ ํ์ ์ธ์
์ ์ข
๋ฃํ ์ ์์ต๋๋ค. |
|||
|
|||
์๋ต์ ์์ฑํ๊ธฐ ์ ์๋ `yield`๋ฌธ์ ํฌํจํ์ฌ ๊ทธ ์ด์ ์ ์ฝ๋๋ง์ด ์คํ๋ฉ๋๋ค: |
|||
|
|||
{* ../../docs_src/dependencies/tutorial007.py hl[2:4] *} |
|||
|
|||
yield๋ ๊ฐ์ *๊ฒฝ๋ก ์์
* ๋ฐ ๋ค๋ฅธ ์์กด์ฑ๋ค์ ์ฃผ์
๋๋ ๊ฐ ์
๋๋ค: |
|||
|
|||
{* ../../docs_src/dependencies/tutorial007.py hl[4] *} |
|||
|
|||
`yield`๋ฌธ ๋ค์์ ์ฝ๋๋ ์๋ต์ ์์ฑํ ํ ๋ณด๋ด๊ธฐ ์ ์ ์คํ๋ฉ๋๋ค: |
|||
|
|||
{* ../../docs_src/dependencies/tutorial007.py hl[5:6] *} |
|||
|
|||
/// tip | ํ |
|||
|
|||
`async` ํจ์์ ์ผ๋ฐ ํจ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
**FastAPI**๋ ์ผ๋ฐ ์์กด์ฑ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ๊ฐ์ ํจ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ ๊ฒ์
๋๋ค. |
|||
|
|||
/// |
|||
|
|||
## `yield`์ `try`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ |
|||
|
|||
`yield`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ์์ `try` ๋ธ๋ก์ ์ฌ์ฉํ๋ค๋ฉด, ์์กด์ฑ์ ์ฌ์ฉํ๋ ๋์ค ๋ฐ์ํ ๋ชจ๋ ์์ธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด, ๋ค๋ฅธ ์์กด์ฑ์ด๋ *๊ฒฝ๋ก ์์
*์ ์ค๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์
"๋กค๋ฐฑ"์ด ๋ฐ์ํ๊ฑฐ๋ ๋ค๋ฅธ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด, ํด๋น ์์ธ๋ฅผ ์์กด์ฑ์์ ๋ฐ์ ์ ์์ต๋๋ค. |
|||
|
|||
๋ฐ๋ผ์, ์์กด์ฑ ๋ด์์ `except SomeException`์ ์ฌ์ฉํ์ฌ ํน์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ง์ฐฌ๊ฐ์ง๋ก, `finally`๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ ๋ฐ์ ์ฌ๋ถ์ ๊ด๊ณ ์์ด ์ข
๋ฃ ๋จ๊ณ๊น ์คํ๋๋๋ก ํ ์ ์์ต๋๋ค. |
|||
|
|||
{* ../../docs_src/dependencies/tutorial007.py hl[3,5] *} |
|||
|
|||
## `yield`๋ฅผ ์ฌ์ฉํ๋ ํ์ ์์กด์ฑ |
|||
|
|||
๋ชจ๋ ํฌ๊ธฐ์ ํํ์ ํ์ ์์กด์ฑ๊ณผ ํ์ ์์กด์ฑ์ "ํธ๋ฆฌ"๋ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ด๋ค ๋ชจ๋๊ฐ `yield`๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
**FastAPI**๋ `yield`๋ฅผ ์ฌ์ฉํ๋ ๊ฐ ์์กด์ฑ์ "์ข
๋ฃ ์ฝ๋"๊ฐ ์ฌ๋ฐ๋ฅธ ์์๋ก ์คํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด, `dependency_c`๋ `dependency_b`์ ์์กดํ ์ ์๊ณ , `dependency_b`๋ `dependency_a`์ ์์กดํ ์ ์์ต๋๋ค. |
|||
|
|||
{* ../../docs_src/dependencies/tutorial008_an_py39.py hl[6,14,22] *} |
|||
|
|||
์ด๋ค ๋ชจ๋๋ `yield`๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด ๊ฒฝ์ฐ `dependency_c`๋ ์ข
๋ฃ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด, `dependency_b`์ ๊ฐ (์ฌ๊ธฐ์๋ `dep_b`๋ก ๋ช
๋ช
)์ด ์ฌ์ ํ ์ฌ์ฉ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ , `dependency_b`๋ ์ข
๋ฃ ์ฝ๋๋ฅผ ์ํด `dependency_a`์ ๊ฐ (์ฌ๊ธฐ์๋ `dep_a`๋ก ๋ช
๋ช
) ์ด ์ฌ์ฉ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/dependencies/tutorial008_an_py39.py hl[18:19,26:27] *} |
|||
|
|||
๊ฐ์ ๋ฐฉ์์ผ๋ก, `yield`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ๊ณผ `return`์ ์ฌ์ฉํ๋ ์์กด์ฑ์ ํจ๊ป ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ค ์ค ์ผ๋ถ๊ฐ ๋ค๋ฅธ ๊ฒ๋ค์ ์์กดํ ์ ์์ต๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ `yield`๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ฌ๋ฌ ์์กด์ฑ์ ํ์๋ก ํ๋ ๋จ์ผ ์์กด์ฑ์ ๊ฐ์ง ์๋ ์์ต๋๋ค. |
|||
|
|||
์ํ๋ ์์กด์ฑ์ ์ํ๋ ๋๋ก ์กฐํฉํ ์ ์์ต๋๋ค. |
|||
|
|||
**FastAPI**๋ ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์์๋ก ์คํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. |
|||
|
|||
/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ |
|||
|
|||
ํ์ด์ฌ์ <a href=โhttps://docs.python.org/3/library/contextlib.htmlโ class=โexternal-linkโ target=โ_blankโ>Context Managers</a> ๋๋ถ์ ์ด ๊ธฐ๋ฅ์ด ์๋ํฉ๋๋ค. |
|||
|
|||
**FastAPI**๋ ์ด๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ปจํ
์คํธ ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํฉ๋๋ค. |
|||
|
|||
/// |
|||
|
|||
## `yield`์ `HTTPException`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ |
|||
|
|||
`yield`์ `try` ๋ธ๋ก์ด ์๋ ์์กด์ฑ์ ์ฌ์ฉํ์ฌ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. |
|||
|
|||
๊ฐ์ ๋ฐฉ์์ผ๋ก, `yield` ์ดํ์ ์ข
๋ฃ ์ฝ๋์์ `HTTPException`์ด๋ ์ ์ฌํ ์์ธ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค. |
|||
|
|||
/// tip | ํ |
|||
|
|||
์ด๋ ๋ค์ ๊ณ ๊ธ ๊ธฐ์ ์ด๋ฉฐ, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ฒฝ๋ก ์ฐ์ฐ ํจ์ ๋ฑ ๋๋จธ์ง ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ ๋ด๋ถ์์ ์์ธ (`HTTPException` ํฌํจ)๋ฅผ ๋ฐ์์ํฌ ์ ์์ผ๋ฏ๋ก ์ค์ ๋ก๋ ํ์ํ์ง ์์ ๊ฒ์
๋๋ค. |
|||
|
|||
ํ์ง๋ง ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๐ค |
|||
|
|||
/// |
|||
|
|||
{* ../../docs_src/dependencies/tutorial008b_an_py39.py hl[18:22,31] *} |
|||
|
|||
์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ณ (๋๋ ์ถ๊ฐ๋ก ๋ค๋ฅธ `HTTPException`์ ๋ฐ์์ํค๊ธฐ ์ํด) ์ฌ์ฉํ ์ ์๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ [์ฌ์ฉ์ ์ ์ ์์ธ ์ฒ๋ฆฌ๊ธฐ](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}๋ฅผ ์์ฑํ๋ ๊ฒ ์
๋๋ค. |
|||
|
|||
## `yield`์ `except`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ |
|||
|
|||
`yield`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ์์ `except`๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ๋ฅผ ํฌ์ฐฉํ๊ณ ์์ธ๋ฅผ ๋ค์ ๋ฐ์์ํค์ง ์๊ฑฐ๋ (๋๋ ์ ์์ธ๋ฅผ ๋ฐ์์ํค์ง ์์ผ๋ฉด), FastAPI๋ ํด๋น ์์ธ๊ฐ ๋ฐ์ํ๋์ง ์ ์ ์์ต๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ธ Python ๋ฐฉ์๊ณผ ๋์ผํฉ๋๋ค: |
|||
|
|||
{* ../../docs_src/dependencies/tutorial008c_an_py39.py hl[15:16] *} |
|||
|
|||
์ด ๊ฒฝ์ฐ, `HTTPException`์ด๋ ์ ์ฌํ ์์ธ๋ฅผ ๋ฐ์์ํค์ง ์๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๋ HTTP 500 Internal Server Error ์๋ต์ ๋ณด๊ฒ ๋์ง๋ง, ์๋ฒ๋ ์ด๋ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง์ ๋ํ **๋ก๊ทธ**๋ ๋ค๋ฅธ ํ์๋ฅผ ์ ํ ๊ฐ์ง์ง ์๊ฒ ๋ฉ๋๋ค. ๐ฑ |
|||
|
|||
### `yield`์ `except`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ์์ ํญ์ `raise` ํ๊ธฐ |
|||
|
|||
`yield`๊ฐ ์๋ ์์กด์ฑ์์ ์์ธ๋ฅผ ์ก์์ ๋๋ `HTTPException`์ด๋ ์ ์ฌํ ์์ธ๋ฅผ ์๋ก ๋ฐ์์ํค์ง ์๋ ํ, ๋ฐ๋์ ์๋์ ์์ธ๋ฅผ ๋ค์ ๋ฐ์์์ผ์ผ ํฉ๋๋ค. |
|||
|
|||
`raise`๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ์์ธ๋ฅผ ๋ค์ ๋ฐ์์ํฌ ์ ์์ต๋๋ค: |
|||
|
|||
{* ../../docs_src/dependencies/tutorial008d_an_py39.py hl[17] *} |
|||
|
|||
์ด์ ํด๋ผ์ด์ธํธ๋ ๋์ผํ *HTTP 500 Internal Server Error* ์ค๋ฅ ์๋ต์ ๋ฐ๊ฒ ๋์ง๋ง, ์๋ฒ ๋ก๊ทธ์๋ ์ฌ์ฉ์ ์ ์ ์์ธ์ธ `InternalError"๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค. ๐ |
|||
|
|||
## `yield`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ์ ์คํ ์์ |
|||
|
|||
์คํ ์์๋ ์๋ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฑฐ์ ๋น์ทํฉ๋๋ค. ์๊ฐ์ ์์์ ์๋๋ก ํ๋ฆ
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ์ด์ ์ํธ ์์ฉํ๊ฑฐ๋ ์ฝ๋๋ฅผ ์คํํ๋ ๋ถ๋ถ ์ค ํ๋์
๋๋ค. |
|||
|
|||
```mermaid |
|||
sequenceDiagram |
|||
|
|||
participant client as Client |
|||
participant handler as Exception handler |
|||
participant dep as Dep with yield |
|||
participant operation as Path Operation |
|||
participant tasks as Background tasks |
|||
|
|||
Note over client,operation: Can raise exceptions, including HTTPException |
|||
client ->> dep: Start request |
|||
Note over dep: Run code up to yield |
|||
opt raise Exception |
|||
dep -->> handler: Raise Exception |
|||
handler -->> client: HTTP error response |
|||
end |
|||
dep ->> operation: Run dependency, e.g. DB session |
|||
opt raise |
|||
operation -->> dep: Raise Exception (e.g. HTTPException) |
|||
opt handle |
|||
dep -->> dep: Can catch exception, raise a new HTTPException, raise other exception |
|||
end |
|||
handler -->> client: HTTP error response |
|||
end |
|||
|
|||
operation ->> client: Return response to client |
|||
Note over client,operation: Response is already sent, can't change it anymore |
|||
opt Tasks |
|||
operation -->> tasks: Send background tasks |
|||
end |
|||
opt Raise other exception |
|||
tasks -->> tasks: Handle exceptions in the background task code |
|||
end |
|||
``` |
|||
|
|||
/// info | ์ ๋ณด |
|||
|
|||
ํด๋ผ์ด์ธํธ์ **ํ๋์ ์๋ต** ๋ง ์ ์ก๋ฉ๋๋ค. ์ด๋ ์ค๋ฅ ์๋ต ์ค ํ๋์ผ ์๋ ์๊ณ ,*๊ฒฝ๋ก ์์
*์์ ์์ฑ๋ ์๋ต์ผ ์๋ ์์ต๋๋ค. |
|||
|
|||
์ด๋ฌํ ์๋ต ์ค ํ๋๊ฐ ์ ์ก๋ ํ์๋ ๋ค๋ฅธ ์๋ต์ ๋ณด๋ผ ์ ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
/// tip | ํ |
|||
|
|||
์ด ๋ค์ด์ด๊ทธ๋จ์ `HTTPException`์ ๋ณด์ฌ์ฃผ์ง๋ง, `yield`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ์์ ์ฒ๋ฆฌํ ์์ธ๋ [์ฌ์ฉ์ ์ ์ ์์ธ์ฒ๋ฆฌ๊ธฐ](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}.๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ ๋ค๋ฅธ ์์ธ๋ ๋ฐ์์ํฌ ์ ์์ต๋๋ค. |
|||
|
|||
์ด๋ค ์์ธ๊ฐ ๋ฐ์ํ๋ , `HTTPException`์ ํฌํจํ์ฌ yield๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋ค์ ๋ฐ์์ํค๊ฑฐ๋ ์๋ก์ด ์์ธ๋ฅผ ๋ฐ์์์ผ์ผ ํฉ๋๋ค. |
|||
|
|||
/// |
|||
|
|||
## `yield`, `HTTPException`, `except` ๋ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ ์ฌ์ฉํ๋ ์์กด์ฑ |
|||
|
|||
/// warning | ๊ฒฝ๊ณ |
|||
|
|||
์ด๋ฌํ ๊ธฐ์ ์ ์ธ๋ถ ์ฌํญ์ ๋๋ถ๋ถ ํ์ํ์ง ์์ผ๋ฏ๋ก ์ด ์น์
์ ๊ฑด๋๋ฐ๊ณ ์๋์์ ๊ณ์ ์งํํด๋ ๋ฉ๋๋ค. |
|||
|
|||
์ด๋ฌํ ์ธ๋ถ ์ ๋ณด๋ ์ฃผ๋ก FastAPI 0.106.0 ์ด์ ๋ฒ์ ์์ `yield`๊ฐ ์๋ ์์กด์ฑ์ ๋ฆฌ์์ค๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฉ ์ ์ฉํฉ๋๋ค. |
|||
|
|||
/// |
|||
|
|||
### `yield`์ `except`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ, ๊ธฐ์ ์ธ๋ถ์ฌํญ |
|||
|
|||
FastAPI 0.110.0 ์ด์ ์๋ `yield`๊ฐ ํฌํจ๋ ์์กด์ฑ์ ์ฌ์ฉํ ํ ํด๋น ์์กด์ฑ์์ `except`๊ฐ ํฌํจ๋ ์์ธ๋ฅผ ์บก์ฒํ๊ณ ๋ค์ ์์ธ๋ฅผ ๋ฐ์์ํค์ง ์์ผ๋ฉด ์์ธ๊ฐ ์๋์ผ๋ก ์์ธ ํธ๋ค๋ฌ ๋๋ ๋ด๋ถ ์๋ฒ ์ค๋ฅ ํธ๋ค๋ฌ๋ก ๋ฐ์/์ ๋ฌ๋์์ต๋๋ค. |
|||
|
|||
์ด๋ ์ฒ๋ฆฌ๊ธฐ ์์ด ์ ๋ฌ๋ ์์ธ(๋ด๋ถ ์๋ฒ ์ค๋ฅ)์์ ์ฒ๋ฆฌ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ์์ ํ๊ณ ์ผ๋ฐ ํ์ด์ฌ ์ฝ๋์ ๋์๊ณผ ์ผ์นํ๋๋ก ํ๊ธฐ ์ํด 0.110.0 ๋ฒ์ ์์ ๋ณ๊ฒฝ๋์์ต๋๋ค. |
|||
|
|||
### ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
๊ณผ `yield`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ, ๊ธฐ์ ์ธ๋ถ์ฌํญ |
|||
|
|||
FastAPI 0.106.0 ์ด์ ์๋ `yield` ์ดํ์ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ์ต๋๋ค. `yield`๊ฐ ์๋ ์์กด์ฑ ์ข
๋ฃ ์ฝ๋๋ ์๋ต์ด ์ ์ก๋ ์ดํ์ ์คํ๋์๊ธฐ ๋๋ฌธ์, [์์ธ ์ฒ๋ฆฌ๊ธฐ](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}๊ฐ ์ด๋ฏธ ์คํ๋ ์ํ์์ต๋๋ค. |
|||
|
|||
์ด๋ ์ฃผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
๋ด์์ ์์กด์ฑ์์ "yield๋" ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ธฐ ์ํด ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์ค๊ณ๋์์ต๋๋ค. ์ข
๋ฃ ์ฝ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ด ์๋ฃ๋ ํ์ ์คํ๋์๊ธฐ ๋๋ฌธ์
๋๋ค |
|||
|
|||
ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ๋ฆฌ์์ค๋ฅผ ๋ถํ์ํ๊ฒ ์๋ณดํ ์์กด์ฑ(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ)์์ ๋ณด์ ํ๋ฉด์ ์๋ต์ด ๋คํธ์ํฌ๋ฅผ ํตํด ์ด๋ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ FastAPI 0.106.0์์ ๋ณ๊ฒฝ๋์์ต๋๋ค. |
|||
|
|||
/// tip | ํ |
|||
|
|||
๋ํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ ์ผ๋ฐ์ ์ผ๋ก ์์ฒด ๋ฆฌ์์ค(์: ์์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๋๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๋
๋ฆฝ์ ์ธ ๋ก์ง ์งํฉ์
๋๋ค. |
|||
|
|||
๋ฐ๋ผ์ ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ๋ ๊น๋ํด์ง๋๋ค. |
|||
|
|||
/// |
|||
|
|||
๋ง์ฝ ์ด์ ์ ์ด๋ฌํ ๋์์ ์์กดํ๋ค๋ฉด, ์ด์ ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
๋ด๋ถ์์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ ์ํ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ณ , `yield`๊ฐ ์๋ ์์กด์ฑ์ ๋ฆฌ์์ค์ ์์กดํ์ง ์๋ ๋ฐ์ดํฐ๋ง ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํด์ผํฉ๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด, ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์
์ ์ฌ์ฉํ๋ ๋์ , ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
๋ด๋ถ์์ ์๋ก์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์
์ ์์ฑํ๊ณ ์ด ์๋ก์ด ์ธ์
์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ง์ ์ ๋ฌํ๋ ๋์ , ํด๋น ๊ฐ์ฒด์ ID๋ฅผ ์ ๋ฌํ ๋ค์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
ํจ์ ๋ด๋ถ์์ ๊ฐ์ฒด๋ฅผ ๋ค์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค |
|||
|
|||
## ์ปจํ
์คํธ ๊ด๋ฆฌ์ |
|||
|
|||
### "์ปจํ
์คํธ ๊ด๋ฆฌ์"๋? |
|||
|
|||
"์ปจํ
์คํธ ๊ด๋ฆฌ์"๋ Python์์ `with` ๋ฌธ์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด, <a href="https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files" class="external-link" target="_blank"> `with`๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ฝ์ ์ ์์ต๋๋ค</a>: |
|||
|
|||
```Python |
|||
with open("./somefile.txt") as f: |
|||
contents = f.read() |
|||
print(contents) |
|||
``` |
|||
|
|||
๋ด๋ถ์ ์ผ๋ก `open("./somefile.txt")` ๋ "์ปจํ
์คํธ ๊ด๋ฆฌ์(Context Manager)"๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. |
|||
|
|||
`with` ๋ธ๋ก์ด ๋๋๋ฉด, ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ํ์ผ์ ๋ซ๋๋ก ๋ณด์ฅํฉ๋๋ค. |
|||
|
|||
`yield`๊ฐ ์๋ ์์กด์ฑ์ ์์ฑํ๋ฉด **FastAPI**๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ฅผ ์ํ ์ปจํ
์คํธ ๋งค๋์ ๋ฅผ ์์ฑํ๊ณ ๋ค๋ฅธ ๊ด๋ จ ๋๊ตฌ๋ค๊ณผ ๊ฒฐํฉํฉ๋๋ค. |
|||
|
|||
### `yield`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ์์ ์ปจํ
์คํธ ๊ด๋ฆฌ์ ์ฌ์ฉํ๊ธฐ |
|||
|
|||
/// warning | ๊ฒฝ๊ณ |
|||
|
|||
์ด๊ฒ์ ์ด๋ ์ ๋ "๊ณ ๊ธ" ๊ฐ๋
์
๋๋ค. |
|||
|
|||
**FastAPI**๋ฅผ ์ฒ์ ์์ํ๋ ๊ฒฝ์ฐ ์ง๊ธ์ ์ด ๋ถ๋ถ์ ๊ฑด๋๋ฐ์ด๋ ์ข์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
Python์์๋ ๋ค์์ ํตํด ์ปจํ
์คํธ ๊ด๋ฆฌ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. <a href="https://docs.python.org/3/reference/datamodel.html#context-managers" class="external-link" target="_blank"> ๋ ๊ฐ์ง ๋ฉ์๋๊ฐ ์๋ ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค: `__enter__()` and `__exit__()`</a>. |
|||
|
|||
**FastAPI**์ `yield`๊ฐ ์๋ ์์กด์ฑ ๋ด์์ |
|||
`with` ๋๋ `async with`๋ฌธ์ ์ฌ์ฉํ์ฌ ์ด๋ค์ ํ์ฉํ ์ ์์ต๋๋ค: |
|||
|
|||
{* ../../docs_src/dependencies/tutorial010.py hl[1:9,13] *} |
|||
|
|||
/// tip | ํ |
|||
|
|||
์ปจํ
์คํธ ๊ด๋ฆฌ์๋ฅผ ์์ฑํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: |
|||
|
|||
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> ๋๋ |
|||
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a> |
|||
|
|||
์ด๋ค์ ๋จ์ผ `yield`๊ฐ ์๋ ํจ์๋ฅผ ๊พธ๋ฏธ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค. |
|||
|
|||
์ด๊ฒ์ด **FastAPI**๊ฐ `yield`๊ฐ ์๋ ์์กด์ฑ์ ์ํด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์
๋๋ค. |
|||
|
|||
ํ์ง๋ง FastAPI ์์กด์ฑ์๋ ์ด๋ฌํ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ์ฌ์ฉํด์๋ ์๋ฉ๋๋ค). |
|||
|
|||
FastAPI๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ด๋ฅผ ์ฒ๋ฆฌํด ์ค ๊ฒ์
๋๋ค. |
|||
|
|||
/// |
Loadingโฆ
Reference in new issue