[ FastAPI ๊ณต์ ๋ฌธ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ ๋ ๊ธ ์ ๋๋ค. ]
FastAPI
FastAPI framework, high performance, easy to learn, fast to code, ready for production
fastapi.tiangolo.com
FastAPI ์ ๋ํด ๋ง์ ๊ธ๋ค์ด ์๋๋ฐ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ค๊ณผ ๋น๊ต๋ฅผ ์ ๋๋ก ๋ณด์ฌ์ฃผ๋ ๊ณณ์ด ๋ณ๋ก ์๋ ๊ฒ ๊ฐ์์ ์ ๋ฆฌํด๋ณด์๋ค.
1. FastAPI ๋ ?
FastAPI ๋ ํ๋์ ์ด๊ณ ๋น ๋ฅธ, Python ์ API ๋ฅผ ๋น๋ํ๊ธฐ ์ํ ์น ํ๋ ์ ์ํฌ์ ๋๋ค. - ๊ณต์๋ฌธ์ -
1.1 Python ์ API ๋ฅผ ๋น๋ํ๋ค๋ ์๋ฏธ
๋๋ฃจ๋ญ์คํ๊ฒ ๋์ด๊ฐ์ง ์๊ณ , ์์ธํ๊ฒ ์ง์ด๋ณธ๋ค๋ฉด python ์ API ๋ฅผ ๋น๋ํ๋ค๋ ๋ง์ด ๋ฌด์จ๋ง์ผ๊น. ์ถ์ ๊ฒ ๊ฐ๋ค. ์๋ํ๋ฉด ๋ด๊ฐ ๊ทธ๋ฌ์ผ๋๊น. ์น ํ๋ ์์ํฌ์ธ๋ฐ ๊ทธ๊ฒ ์ python api ๋ฅผ '๋น๋'ํ๋ค๋ ๊ฒ ์ผ๊น? ์ฐจ๋ผ๋ฆฌ ์๋นํ๋ค๋ ํํ์ด ๋ง์ง ์์๊น.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
๋ค์์ ๋ ์์ธํ๊ฒ ๋ค๋ฃฐ FastAPI ์ ๊ธฐ๋ณธ ์์ ์ธ๋ฐ, return { } ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๊ณ ์๋ค. ์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ ๋ก์ปฌํธ์คํธ์ ์นํ์ด์ง์ hello, world ๊ฐ ๋์ค๊ฒ ๋๋๋ฐ
python api ๋ฅผ ๋น๋ํ๋ค๋ ๋ง์ ํ์ด์ฌ์ function ์ ์น์์ ๊ตฌํ๊ฐ๋ฅํ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ธด๋ค๋์ง, ํ์ผ์ ํธ์ถํ๋ค๋์ง ๋ฑ์ ์์ผ๋ก ์ฌ์ฉํ๊ฒ ๋ค๋ ๋ง์ด๋ค.
2. FastAPI ์ ํน์ง
๊ณต์๋ฌธ์์์ ์ธ๊ธํ ์ฃผ์ํน์ง์ 8๊ฐ์ง ์ด๋ค.
1. ๋น ๋ฆ
2. ๋น ๋ฅธ ์ฝ๋ ์์ฑ
3. ์ ์ ๋ฒ๊ทธ
4. ์ง๊ด์
5. ์ฌ์
6. ์งง์
7. ๊ฒฌ๊ณ ํจ
8. ํ์ค ๊ธฐ๋ฐ
์ธ๋ฐ ์ฌ์ค ์ฝ๋ค๋ณด๋ฉด ๊ทธ ์๋ฏธ๊ฐ ๊ฒน์น๋ ๊ฒ๋ค์ด ์กฐ๊ธ ์๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ ๋ด ๋๋ฆ๋๋ก ์ค๋ณต๋๋ ์๋ฏธ๋ฅผ ์ค์ฌ๋ณด์๋ฉด
1. ๋น ๋ฆ : Starlette ์ Pydantic ๋๋ถ์ NodeJS ๋ฐ Go ์ ๋๋ฑํ ์ ๋๋ก ๋งค์ฐ ๋์ ์ฑ๋ฅ [ ์ฌ์ฉ๊ฐ๋ฅํ ๊ฐ์ฅ ๋น ๋ฅธ ํ์ด์ฌ ํ๋ ์์ํฌ ์ค ํ๋ ]
- ์ฑ๋ฅ์ ์๋์์ ์์ธํ๊ฒ ๋น๊ตํด๋ณด๋ก๋ ํ๊ณ Starlette ์ Pydantic ์ด ๋ญ๊น?
Pydantic๊ณผ Starlette๋ FastAPI์ ์ฑ๋ฅ๊ณผ ๊ธฐ๋ฅ์ ํฌ๊ฒ ํฅ์์ํค๋ ํต์ฌ ์์๋ค. ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ FastAPI๊ฐ ๊ณ ์ฑ๋ฅ์ ๋น๋๊ธฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋๋ก ๋๋๋ค. ์๋์์ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ธํ ์ค๋ช ํ ๊ฒ.
1. Pydantic
Pydantic์ Python ๋ฐ์ดํฐ ๊ฒ์ฆ ๋ฐ ์ค์ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. FastAPI์์ Pydantic์ ์ฃผ๋ก ๋ฐ์ดํฐ ๊ฒ์ฆ, ์ง๋ ฌํ/์ญ์ง๋ ฌํ ๋ฐ ๋ฐ์ดํฐ ๋ชจ๋ธ ์ ์์ ์ฌ์ฉ๋๋ค.
์ฃผ์ ํน์ง:
- ๋ฐ์ดํฐ ๊ฒ์ฆ: Pydantic์ Python์ ํ์ ํํธ๋ฅผ ํ์ฉํด, ์ ๋ฌ๋ ๋ฐ์ดํฐ๊ฐ ์ ํํ ํ์ ์ธ์ง ์๋์ผ๋ก ํ์ธํ๋ค. ์๋ชป๋ ํ์์ ๋ฐ์ดํฐ๊ฐ ์ค๋ฉด ์ฆ์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ค.
- ํ์ ํํธ ์ง์: Pydantic์ Python์ ๊ธฐ๋ณธ ํ์ ํํธ๋ฅผ ์ง์ํ๋ฉฐ, ์ด๋ฅผ ํตํด ํ๋ ํ์ ์ ์ ์ํ๊ณ ๊ฒ์ฆํ๋ค. ์๋ฅผ ๋ค์ด, int, str, datetime ๋ฑ์ ํ์ ํํธ๋ก ์ฌ์ฉํ ์ ์๋ค.
- ์๋ ์ง๋ ฌํ/์ญ์ง๋ ฌํ: Pydantic์ Python ๊ฐ์ฒด์ JSON ๊ฐ์ ๋ณํ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค. ์ด๋ฅผ ํตํด FastAPI๋ ์์ฒญ ๋ฐ ์๋ต์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
- ์ฑ๋ฅ: Pydantic์ ๋ด๋ถ์ ์ผ๋ก Cython์ ํ์ฉํ์ฌ ๋์ ์ฑ๋ฅ์ ์๋ํ๋ค. ๋ฐ์ดํฐ ๊ฒ์ฆ, ์ง๋ ฌํ, ์ญ์ง๋ ฌํ ๋ฑ์ ์์ ์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
์์:
from pydantic import BaseModel
class User(BaseModel):
username: str
email: str
full_name: str | None = None
# ๋ฐ์ดํฐ ๊ฒ์ฆ
user = User(username="john_doe", email="john@example.com")
print(user.dict())
์ ์ฝ๋์์ User ํด๋์ค๋ BaseModel์ ์์๋ฐ์ Pydantic ๋ชจ๋ธ๋ก ์ ์๋๋ค. ์ด ํด๋์ค๋ ํ์ ํํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ ๊ฒ์ฆ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค.
FastAPI์์ ๊ด๊ณ
FastAPI๋ Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํด ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ถ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๊ณ ์ง๋ ฌํํ๋ค. ์๋ฅผ ๋ค์ด, API ์์ฒญ์์ JSON ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ์ด๋ฅผ Pydantic ๋ชจ๋ธ์ ํตํด ๊ฒ์ฆํ ํ ์ฒ๋ฆฌํ๋ค. ์๋ชป๋ ํ์์ ๋ฐ์ดํฐ๋ ์๋์ผ๋ก ์ค๋ฅ๋ฅผ ๋ฐํํ๋ค.
2. Starlette
Starlette๋ FastAPI์ ์น ์๋ฒ ํ๋ ์์ํฌ๋ก, ๋น๋๊ธฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋๋ก ๋์์ฃผ๋ ํต์ฌ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. FastAPI๋ Starlette๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์์ผ๋ฉฐ, Starlette๋ HTTP ์์ฒญ๊ณผ ์๋ต์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ฃผ์ ํน์ง:
- ๋น๋๊ธฐ ์ง์: Starlette๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ์ฌ ๋์ ์ฑ๋ฅ์ ์๋ํ๋ค. ์ด๋ฅผ ํตํด I/O๊ฐ ๋ง์ ์์ (์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ, ์ธ๋ถ API ํธ์ถ ๋ฑ)์ ์ฒ๋ฆฌํ ๋ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค.
- ๋ผ์ฐํ : Starlette๋ API ์๋ํฌ์ธํธ๋ฅผ ์ ์ํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ผ์ฐํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. FastAPI์์ ๋ผ์ฐํฐ๋ฅผ ์ ์ํ ๋ Starlette์ ๋ผ์ฐํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.
- ๋ฏธ๋ค์จ์ด ์ง์: Starlette๋ ๋ค์ํ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋๋ก ์ง์ํ๋ค. ๋ฏธ๋ค์จ์ด๋ ์์ฒญ๊ณผ ์๋ต์ ์ฒ๋ฆฌํ๋ ์ค๊ฐ ๊ณผ์ ์์ ๋์ํ๋ ์ฝ๋๋ค. ์๋ฅผ ๋ค์ด, ์ธ์ฆ, ๋ก๊น , ์ค๋ฅ ์ฒ๋ฆฌ ๋ฑ์ ๋ฏธ๋ค์จ์ด๋ก ๊ตฌํํ ์ ์๋ค.
- ์น์์ผ ์ง์: Starlette๋ ์น์์ผ์ ์ง์ํ์ฌ ์ค์๊ฐ ์๋ฐฉํฅ ํต์ ์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ (์: ์ฑํ , ์๋ฆผ ๋ฑ)์ ๊ตฌ์ถํ ์ ์๋ค.
- ์๋ฒ ๊ธฐ๋ฅ: Starlette๋ ์์ฒด ์น ์๋ฒ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, FastAPI๋ ๋ณดํต Uvicorn๊ณผ ๊ฐ์ ASGI ์๋ฒ์ ํจ๊ป ์ฌ์ฉํ๋ค. Starlette๋ ASGI(Asynchronous Server Gateway Interface)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋งค์ฐ ํจ์จ์ ์ด๋ค.
์์:
from starlette.responses import JSONResponse
from starlette.routing import Route
from starlette.applications import Starlette
async def homepage(request):
return JSONResponse({'message': 'Hello, World!'})
app = Starlette(debug=True, routes=[Route('/', homepage)])
์ ์ฝ๋์์ Starlette์ ๋น๋๊ธฐ ์น ์๋ฒ๋ฅผ ์ค์ ํ๊ณ , homepage๋ผ๋ ๋น๋๊ธฐ ํจ์๋ฅผ ํตํด ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฐ๋จํ ์์๋ฅผ ๋ณด์ฌ์ค๋ค.
FastAPI์์ ๊ด๊ณ:
FastAPI๋ Starlette์ ๊ธฐ๋ฅ์ ํ์ฅํ์ฌ HTTP ์์ฒญ/์๋ต์ ์ฒ๋ฆฌํ๊ณ , ๋น๋๊ธฐ ์์ฒญ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค. FastAPI์ ๋ผ์ฐํ , ๋ฏธ๋ค์จ์ด ์ฒ๋ฆฌ, ์๋ฒ ์ค์ ๋ฑ ๋๋ถ๋ถ์ ์น ๊ด๋ จ ๊ธฐ๋ฅ์ Starlette์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค. FastAPI๊ฐ ์ ๊ณตํ๋ ๊ณ ์ฑ๋ฅ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ๋ฐ๋ก Starlette ๋๋ถ์ด๋ค.
FastAPI์์ Pydantic๊ณผ Starlette์ ์ญํ ์์ฝ
- Pydantic:
- ๋ฐ์ดํฐ ๊ฒ์ฆ ๋ฐ ์ง๋ ฌํ/์ญ์ง๋ ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- Python ํ์ ํํธ๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๊ฒ์ฆํ๊ณ ๋ณํํ๋ค.
- Starlette:
- ๋น๋๊ธฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ๋ก, ๋ผ์ฐํ , ๋ฏธ๋ค์จ์ด, ์๋ฒ ๊ธฐ๋ฅ ๋ฑ์ ์ ๊ณตํ๋ค.
- ๋น๋๊ธฐ ์์ฒญ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ๋์ ์ฑ๋ฅ์ ์ง์ํ๋ค.
์ด ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ FastAPI๊ฐ ๋น ๋ฅด๊ณ ์์ ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋๋ก ํ๋ ์ค์ํ ์ญํ ์ ํ๋ค. Pydantic์ ๋ฐ์ดํฐ ๊ฒ์ฆ๊ณผ ์ฒ๋ฆฌ๋ฅผ, Starlette์ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์๋ฒ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ์ฌ FastAPI์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ํฌ๊ฒ ํฅ์์ํจ๋ค.
2. ๋น ๋ฅธ ์ฝ๋ ์์ฑ : ์ฝ 200% ์์ 300% ๊น์ง ๊ธฐ๋ฅ๊ฐ๋ฐ ์๋ ์ฆ๊ฐ.
3. ์ฌ์ : ์ฝ๊ฒ ์ฌ์ฉํ๊ณ ๋ฐฐ์ฐ๋๋ก ์ค๊ณ. ์ ์ ๋ฌธ์ ์ฝ๊ธฐ ์๊ฐ
4. ์ ์๋ฒ๊ทธ : ์ฌ๋(๊ฐ๋ฐ์) ์ ์ํ ์๋ฌ ์ฝ 40% ๊ฐ์
5. ํ์ค๊ธฐ๋ฐ : OpenAPI / Json ์คํค๋ง
- ์ด๊ฒ์ OpenAPI ๊ธฐ๋ฐ์ ์๋ ๋ฌธ์ํ๋ฅผ ์ง์ํ๋ค๋ ์๋ฏธ์ด๊ณ , Json ์คํค๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํด ๋ฒ์ฉ์ฑ์ด ๋๋ค๋ ์๋ฏธ์ด๋ค.
*์์น๋ ๋ด๋ถ ๊ฐ๋ฐํ์ ํ๋ก๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ํ ์คํธ์ ๊ทผ๊ฑฐํ ์ธก์ * ์ด๋ผ๊ณ ํ๋ค.
3. ์ฌ๋ก
๊ณต์๋ฌธ์์ ๋์ ์๋ ์คํฐ์๋ค์ ์๊ฒฌ์ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค.
Netflix | FastAPI์ ๋น ๋ฅธ ์ฑ๋ฅ ๋๋ถ์ ์ค์๊ฐ ๋ถ์ ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํ์ฉ. |
Uber | ๊ณ ์์ API ์ฒ๋ฆฌ์ ํจ์จ์ ์ธ ์์คํ ๊ตฌ์ถ์ ์ํ FastAPI ์ฑํ. |
Microsoft | ๋๊ท๋ชจ ์์คํ ์ API ์ต์ ํ๋ฅผ ์ํด FastAPI๋ฅผ ์ฌ์ฉํ์ฌ ๋น ๋ฅธ ์๋์ ๋ฎ์ ๋๊ธฐ์๊ฐ ๊ตฌํ. |
Platform.sh | FastAPI๋ ํด๋ผ์ฐ๋ ๋ฐฐํฌ์ DevOps ํตํฉ์ ์ฉ์ดํ๊ฒ ๋ง๋ค์ด ๋์ ์ฑ๋ฅ์ ์ ๊ณต. |
Porter | Kubernetes ํด๋ฌ์คํฐ์ ํตํฉ๋์ด ๋น ๋ฅธ ์ฑ ๋ฐฐํฌ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ ํ |
์ด์ฒ๋ผ FastAPI๋ ๋์ ์ฑ๋ฅ, ํจ์จ์ ์ธ API ์ฒ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ๋น ๋ฅธ ๊ฐ๋ฐ ์๋๋ฅผ ์ํ๋ ๋ค์ํ ์ฐ์ ์ ๊ธฐ์ ๋ค์๊ฒ ์ ํฉํ ์ ํ์ด ๋๊ณ ์๋ค.
4. ์ค์ต
4.1 ์ค์น
4.2 ์์ ๋ง๋ค๊ณ , ์๋ฒ์คํ
4.3. API Return ๊ฐ ํ์ธ
4.4. API ๋ฌธ์ ์๋์์ฑ
FastAPI ๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ Python [Function ์ ๊ฒฐ๊ณผ๊ฐ์ ์น์์ ๋ณด์ฌ์ค]-build ์ ์๊ฒ ๋์๋ค. ํน์ง ์ฒ๋ผ ๊ฐ๊ฒฐํ ์ฝ๋์ ๋น ๋ฅธ ์ค์น๋ก ์๋ฌ๊ฐ ์๋ค. ์ด ํฌ์คํ ์์ ๋ ์์ธํ๊ฒ ์ ์ง๋ ์๊ฒ ๋ค. ์์ ๋ ๊ณต์๋ฌธ์ ํ์ด์ง์ ๋ค์ด๊ฐ์ ํ๋ฒ์ฉ ํด๋ณด๊ธฐ๋ฅผ ๊ถ์ฅํ๋ค.
5. FastAPI ์ฑ๋ฅ ๋น๊ต
๊ทธ๋์ FastAPI ๊ฐ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ณด๋ค ์ผ๋ง๋ ์ข๋. ๋ผ๋ ๊ฒ์ ๋ฐ์ง๋ฉด ํ์คํ ๋น ๋ฅด๋ค. Flask ์ ์ฌ์ฉ๋ฒ์ด ์์ ์์๋ ๊ฑฐ์ ๋น์ทํ ๊ฒ ๊ฐ์๋ฐ, ์ฒ๋ฆฌ๋์ด ์ด๋ ๊ฒ ์ฐจ์ด๊ฐ ๋๋ FastAPI ๋ฅผ ์ฌ์ฉํ์ง ์์ ์ด์ ๋ ์์ ๊ฒ ๊ฐ๊ธฐ๋ํ๋ค.
FastAPI | 1,000,000+ ์์ฒญ/์ด |
Node.js | 1,000,000+ ์์ฒญ/์ด |
Go | 1,000,000+ ์์ฒญ/์ด |
Flask | 100,000 ์์ฒญ/์ด |
Django | 50,000-100,000 ์์ฒญ/์ด |
๊ทธ๋ผ์๋ Flask ์ Django ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ์ด์ ๋ฅผ ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์....
'Develop' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ผ์ธ ํ๊ฒฝ์์ Git ์ฌ์ฉ ๋ฐฉ๋ฒ: SSH๋ก ์๊ฒฉ ์ ์ฅ์ ์ ๊ทผํ๊ธฐ (0) | 2024.11.05 |
---|---|
[ Python ] dataclass ์์ธํ ์์๋ณด๊ธฐ (0) | 2024.11.03 |
C#) Grbage Collector (0) | 2024.04.22 |
Object-Oriented Programming ) Overroading,Override , Extend ? (0) | 2020.04.09 |