Browse Source

๐ŸŒ Add Korean translation for `docs/ko/docs/tutorial/handling-errors.md`

pull/14253/head
Nicered 9 months ago
parent
commit
879c166946
  1. 255
      docs/ko/docs/tutorial/handling-errors.md

255
docs/ko/docs/tutorial/handling-errors.md

@ -0,0 +1,255 @@
# ์—๋Ÿฌ ์ฒ˜๋ฆฌ { #handling-errors }
API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์—๋Ÿฌ๋ฅผ ์•Œ๋ ค์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.
ํด๋ผ์ด์–ธํŠธ๋Š” ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €์ผ ์ˆ˜๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ์ผ ์ˆ˜๋„ ์žˆ๊ณ , IoT ์žฅ์น˜์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์•Œ๋ ค์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* ํ•ด๋‹น ์ž‘์—…์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ์—†์Œ
* ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ
* ์ ‘๊ทผํ•˜๋ ค๋Š” ํ•ญ๋ชฉ์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ
* ๊ธฐํƒ€ ๋“ฑ๋“ฑ
์ด๋Ÿฐ ๊ฒฝ์šฐ, ๋ณดํ†ต **400**๋ฒˆ๋Œ€(400~499)์˜ **HTTP ์ƒํƒœ ์ฝ”๋“œ**๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ด๋Š” 200๋ฒˆ๋Œ€ HTTP ์ƒํƒœ ์ฝ”๋“œ(200~299)์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. "200"๋ฒˆ๋Œ€ ์ƒํƒœ ์ฝ”๋“œ๋Š” ์š”์ฒญ์ด ์–ด๋–ป๊ฒŒ๋“  "์„ฑ๊ณต"ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
400๋ฒˆ๋Œ€ ์ƒํƒœ ์ฝ”๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
**"404 Not Found"** ์—๋Ÿฌ(๊ทธ๋ฆฌ๊ณ  ๋†๋‹ด๋“ค)๋ฅผ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”?
## `HTTPException` ์‚ฌ์šฉํ•˜๊ธฐ { #use-httpexception }
์—๋Ÿฌ๊ฐ€ ์žˆ๋Š” HTTP ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉด `HTTPException`์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
### `HTTPException` ์ž„ํฌํŠธํ•˜๊ธฐ { #import-httpexception }
{* ../../docs_src/handling_errors/tutorial001.py hl[1] *}
### ์ฝ”๋“œ์—์„œ `HTTPException` ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ { #raise-an-httpexception-in-your-code }
`HTTPException`์€ API ๊ด€๋ จ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ์ผ๋ฐ˜ ํŒŒ์ด์ฌ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.
ํŒŒ์ด์ฌ ์˜ˆ์™ธ์ด๋ฏ€๋กœ `return`์ด ์•„๋‹Œ `raise`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
*๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜* ๋‚ด์—์„œ ํ˜ธ์ถœํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ทธ ํ•จ์ˆ˜ ์•ˆ์—์„œ `HTTPException`์„ ๋ฐœ์ƒ์‹œ์ผฐ์„ ๋•Œ *๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜*์˜ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , ์š”์ฒญ์ด ์ฆ‰์‹œ ์ข…๋ฃŒ๋˜๋ฉฐ `HTTPException`์˜ HTTP ์—๋Ÿฌ๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์˜ ์ด์ ์€ ์˜์กด์„ฑ๊ณผ ๋ณด์•ˆ ์„น์…˜์—์„œ ๋” ๋ช…ํ™•ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์˜ˆ์ œ์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ID๋กœ ํ•ญ๋ชฉ์„ ์š”์ฒญํ•˜๋ฉด ์ƒํƒœ ์ฝ”๋“œ `404`์˜ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค:
{* ../../docs_src/handling_errors/tutorial001.py hl[11] *}
### ๊ฒฐ๊ณผ ์‘๋‹ต { #the-resulting-response }
ํด๋ผ์ด์–ธํŠธ๊ฐ€ `http://example.com/items/foo`(`item_id`๊ฐ€ `"foo"`)๋ฅผ ์š”์ฒญํ•˜๋ฉด, HTTP ์ƒํƒœ ์ฝ”๋“œ 200๊ณผ ๋‹ค์Œ JSON ์‘๋‹ต์„ ๋ฐ›์Šต๋‹ˆ๋‹ค:
```JSON
{
"item": "The Foo Wrestlers"
}
```
ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ๊ฐ€ `http://example.com/items/bar`(์กด์žฌํ•˜์ง€ ์•Š๋Š” `item_id` `"bar"`)๋ฅผ ์š”์ฒญํ•˜๋ฉด, HTTP ์ƒํƒœ ์ฝ”๋“œ 404("not found" ์—๋Ÿฌ)์™€ ๋‹ค์Œ JSON ์‘๋‹ต์„ ๋ฐ›์Šต๋‹ˆ๋‹ค:
```JSON
{
"detail": "Item not found"
}
```
/// tip | ํŒ
`HTTPException`์„ ๋ฐœ์ƒ์‹œํ‚ฌ ๋•Œ `detail` ๋งค๊ฐœ๋ณ€์ˆ˜์— `str`๋ฟ๋งŒ ์•„๋‹ˆ๋ผ JSON์œผ๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
`dict`, `list` ๋“ฑ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋“ค์€ **FastAPI**๊ฐ€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
///
## ์ปค์Šคํ…€ ํ—ค๋” ์ถ”๊ฐ€ํ•˜๊ธฐ { #add-custom-headers }
HTTP ์—๋Ÿฌ์— ์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ถ€ ๋ณด์•ˆ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋ง์ด์ฃ .
์ง์ ‘ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ํ•„์š”ํ•œ ๊ณ ๊ธ‰ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์œ„ํ•ด ์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
{* ../../docs_src/handling_errors/tutorial002.py hl[14] *}
## ์ปค์Šคํ…€ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ์„ค์น˜ํ•˜๊ธฐ { #install-custom-exception-handlers }
<a href="https://www.starlette.dev/exceptions/" class="external-link" target="_blank">Starlette์˜ ์˜ˆ์™ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ</a>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค์Šคํ…€ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„(๋˜๋Š” ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์ด `raise`ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค์Šคํ…€ ์˜ˆ์™ธ `UnicornException`์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.
์ด ์˜ˆ์™ธ๋ฅผ FastAPI์—์„œ ์ „์—ญ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
`@app.exception_handler()`๋กœ ์ปค์Šคํ…€ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
{* ../../docs_src/handling_errors/tutorial003.py hl[5:7,13:18,24] *}
์—ฌ๊ธฐ์„œ `/unicorns/yolo`๋ฅผ ์š”์ฒญํ•˜๋ฉด *๊ฒฝ๋กœ ์ž‘๋™*์ด `UnicornException`์„ `raise`ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ `unicorn_exception_handler`๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ HTTP ์ƒํƒœ ์ฝ”๋“œ `418`๊ณผ ๋‹ค์Œ JSON ๋‚ด์šฉ์˜ ๊น”๋”ํ•œ ์—๋Ÿฌ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค:
```JSON
{"message": "Oops! yolo did something. There goes a rainbow..."}
```
/// note | ๊ธฐ์ˆ ์  ์„ธ๋ถ€์‚ฌํ•ญ
`from starlette.requests import Request`์™€ `from starlette.responses import JSONResponse`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
**FastAPI**๋Š” ๊ฐœ๋ฐœ์ž ํŽธ์˜๋ฅผ ์œ„ํ•ด `starlette.responses`๋ฅผ `fastapi.responses`๋กœ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์‘๋‹ต์€ Starlette์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. `Request`๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
///
## ๊ธฐ๋ณธ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๊ธฐ { #override-the-default-exception-handlers }
**FastAPI**์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ํ•ธ๋“ค๋Ÿฌ๋“ค์€ `HTTPException`์„ `raise`ํ•˜๊ฑฐ๋‚˜ ์š”์ฒญ์— ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ ๊ธฐ๋ณธ JSON ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ๊ฒƒ์œผ๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### ์š”์ฒญ ๊ฒ€์ฆ ์˜ˆ์™ธ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๊ธฐ { #override-request-validation-exceptions }
์š”์ฒญ์— ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜๋ฉด **FastAPI**๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ `RequestValidationError`๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ณธ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋ ค๋ฉด `RequestValidationError`๋ฅผ ์ž„ํฌํŠธํ•˜๊ณ  `@app.exception_handler(RequestValidationError)`๋กœ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ์ฝ”๋ ˆ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋Š” `Request`์™€ ์˜ˆ์™ธ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
{* ../../docs_src/handling_errors/tutorial004.py hl[2,14:16] *}
์ด์ œ `/items/foo`๋กœ ๊ฐ€๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ JSON ์—๋Ÿฌ ๋Œ€์‹ :
```JSON
{
"detail": [
{
"loc": [
"path",
"item_id"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
}
```
๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ…์ŠคํŠธ ๋ฒ„์ „์„ ๋ฐ›์Šต๋‹ˆ๋‹ค:
```
1 validation error
path -> item_id
value is not a valid integer (type=type_error.integer)
```
#### `RequestValidationError` vs `ValidationError` { #requestvalidationerror-vs-validationerror }
/// warning | ์ฃผ์˜
์ง€๊ธˆ ๋‹น์žฅ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
///
`RequestValidationError`๋Š” Pydantic์˜ <a href="https://docs.pydantic.dev/latest/concepts/models/#error-handling" class="external-link" target="_blank">`ValidationError`</a>์˜ ์„œ๋ธŒํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
**FastAPI**๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ `response_model`์—์„œ Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐ์ดํ„ฐ์— ์—๋Ÿฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋กœ๊ทธ์—์„œ ์—๋Ÿฌ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ/์‚ฌ์šฉ์ž๋Š” ์ด๋ฅผ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  HTTP ์ƒํƒœ ์ฝ”๋“œ `500`๊ณผ ํ•จ๊ป˜ "Internal Server Error"๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
*์‘๋‹ต*์ด๋‚˜ ์ฝ”๋“œ ์–ด๋”˜๊ฐ€์—(ํด๋ผ์ด์–ธํŠธ *์š”์ฒญ*์ด ์•„๋‹Œ) Pydantic `ValidationError`๊ฐ€ ์žˆ๋‹ค๋ฉด ์‹ค์ œ๋กœ๋Š” ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ์ด๋ฏ€๋กœ ์ด๋ ‡๊ฒŒ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋™์•ˆ ํด๋ผ์ด์–ธํŠธ/์‚ฌ์šฉ์ž๋Š” ์—๋Ÿฌ์— ๋Œ€ํ•œ ๋‚ด๋ถ€ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
### `HTTPException` ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๊ธฐ { #override-the-httpexception-error-handler }
๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ `HTTPException` ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋Ÿฐ ์—๋Ÿฌ๋“ค์— ๋Œ€ํ•ด JSON ๋Œ€์‹  ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
{* ../../docs_src/handling_errors/tutorial004.py hl[3:4,9:11,22] *}
/// note | ๊ธฐ์ˆ ์  ์„ธ๋ถ€์‚ฌํ•ญ
`from starlette.responses import PlainTextResponse`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
**FastAPI**๋Š” ๊ฐœ๋ฐœ์ž ํŽธ์˜๋ฅผ ์œ„ํ•ด `starlette.responses`๋ฅผ `fastapi.responses`๋กœ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์‘๋‹ต์€ Starlette์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
///
### `RequestValidationError` ๋ณธ๋ฌธ ์‚ฌ์šฉํ•˜๊ธฐ { #use-the-requestvalidationerror-body }
`RequestValidationError`๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ๋ฐ›์€ `body`๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
์•ฑ ๊ฐœ๋ฐœ ์ค‘ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณธ๋ฌธ์„ ๋กœ๊น…ํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
{* ../../docs_src/handling_errors/tutorial005.py hl[14] *}
์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์œ ํšจํ•˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์„ ๋ณด๋‚ด๋ณด์„ธ์š”:
```JSON
{
"title": "towel",
"size": "XL"
}
```
๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋Š” ๋‚ด์šฉ๊ณผ ๋ฐ›์€ ๋ณธ๋ฌธ์„ ํฌํ•จํ•œ ์‘๋‹ต์„ ๋ฐ›์Šต๋‹ˆ๋‹ค:
```JSON hl_lines="12-15"
{
"detail": [
{
"loc": [
"body",
"size"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
],
"body": {
"title": "towel",
"size": "XL"
}
}
```
#### FastAPI์˜ `HTTPException` vs Starlette์˜ `HTTPException` { #fastapis-httpexception-vs-starlettes-httpexception }
**FastAPI**๋Š” ์ž์ฒด `HTTPException`์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
**FastAPI**์˜ `HTTPException` ์—๋Ÿฌ ํด๋ž˜์Šค๋Š” Starlette์˜ `HTTPException` ์—๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค.
์œ ์ผํ•œ ์ฐจ์ด์ ์€ **FastAPI**์˜ `HTTPException`์€ `detail` ํ•„๋“œ์— JSON์œผ๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด, Starlette์˜ `HTTPException`์€ ๋ฌธ์ž์—ด๋งŒ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ์—์„œ ํ‰์†Œ์ฒ˜๋Ÿผ **FastAPI**์˜ `HTTPException`์„ ๊ณ„์† ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•  ๋•Œ๋Š” Starlette์˜ `HTTPException`์— ๋Œ€ํ•ด ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Starlette ๋‚ด๋ถ€ ์ฝ”๋“œ๋‚˜ Starlette ํ™•์žฅ/ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ Starlette `HTTPException`์„ ๋ฐœ์ƒ์‹œ์ผฐ์„ ๋•Œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ด๋ฅผ ์žก์•„์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์˜ˆ์ œ์—์„œ๋Š” ๊ฐ™์€ ์ฝ”๋“œ์—์„œ ๋‘ `HTTPException`์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Starlette์˜ ์˜ˆ์™ธ๋ฅผ `StarletteHTTPException`์œผ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค:
```Python
from starlette.exceptions import HTTPException as StarletteHTTPException
```
### **FastAPI**์˜ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ { #reuse-fastapis-exception-handlers }
์˜ˆ์™ธ์™€ ํ•จ๊ป˜ **FastAPI**์˜ ๊ธฐ๋ณธ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด `fastapi.exception_handlers`์—์„œ ๊ธฐ๋ณธ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ž„ํฌํŠธํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
{* ../../docs_src/handling_errors/tutorial006.py hl[2:5,15,21] *}
์ด ์˜ˆ์ œ์—์„œ๋Š” ์•„์ฃผ ์„ค๋ช…์ ์ธ ๋ฉ”์‹œ์ง€๋กœ ์—๋Ÿฌ๋ฅผ ์ถœ๋ ฅํ•˜์ง€๋งŒ, ํ•ต์‹ฌ์€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ ๊ธฐ๋ณธ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
Loadingโ€ฆ
Cancel
Save