Skip to content

์ด๋ฒคํŠธ: startup๊ณผ shutdown

ํ•„์š”์— ๋”ฐ๋ผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์ด๋‚˜ ์ข…๋ฃŒ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ(ํ•จ์ˆ˜)๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋“ค์€ async def ๋˜๋Š” ํ‰๋ฒ”ํ•˜๊ฒŒ def์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ 

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์ฃผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์œ„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ - ๋งˆ์šดํŠธ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

startup ์ด๋ฒคํŠธ

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์‹คํ–‰ํ•˜๋ ค๋Š” ํ•จ์ˆ˜๋ฅผ "startup" ์ด๋ฒคํŠธ๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค:

from fastapi import FastAPI

app = FastAPI()

items = {}


@app.on_event("startup")
async def startup_event():
    items["foo"] = {"name": "Fighters"}
    items["bar"] = {"name": "Tenders"}


@app.get("/items/{item_id}")
async def read_items(item_id: str):
    return items[item_id]

์ด ๊ฒฝ์šฐ startup ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋Š” ๋‹จ์ˆœํžˆ ๋ช‡ ๊ฐ€์ง€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ dict ํ˜•์‹์˜ "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค"๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜ ์ด์ƒ์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๋ชจ๋“  startup ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์š”์ฒญ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

shutdown ์ด๋ฒคํŠธ

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ ์‹คํ–‰ํ•˜๋ ค๋Š” ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด "shutdown" ์ด๋ฒคํŠธ๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค:

from fastapi import FastAPI

app = FastAPI()


@app.on_event("shutdown")
def shutdown_event():
    with open("log.txt", mode="a") as log:
        log.write("Application shutdown")


@app.get("/items/")
async def read_items():
    return [{"name": "Foo"}]

์ด ์˜ˆ์ œ์—์„œ shutdown ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋Š” "Application shutdown"์ด๋ผ๋Š” ํ…์ŠคํŠธ๊ฐ€ ์ ํžŒ log.txt ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ •๋ณด

open() ํ•จ์ˆ˜์—์„œ mode="a"๋Š” "์ถ”๊ฐ€"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์ค„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํŒ

์ด ์˜ˆ์ œ์—์„œ๋Š” ํŒŒ์ผ๊ณผ ์ƒํ˜ธ์ž‘์šฉ ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ด์ฌ ํ‘œ์ค€ ํ•จ์ˆ˜์ธ open()์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋””์Šคํฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด "๋Œ€๊ธฐ"๊ฐ€ ํ•„์š”ํ•œ I/O (์ž…๋ ฅ/์ถœ๋ ฅ) ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ open()์€ async์™€ await์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋Š” async def๊ฐ€ ์•„๋‹Œ ํ‘œ์ค€ def๋กœ ์„ ์–ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ •๋ณด

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ๊ด€ํ•œ ๋‚ด์šฉ์€ Starlette ์ด๋ฒคํŠธ ๋ฌธ์„œ์—์„œ ์ถ”๊ฐ€๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.