FastAPI - Path Parameters

Kjjeddยท2026๋…„ 1์›” 13์ผ

FastAPI

๋ชฉ๋ก ๋ณด๊ธฐ
5/16
post-thumbnail

๐Ÿงญ Path Parameters

FastAPI์—์„œ Path Parameter๋Š” URL ๊ฒฝ๋กœ ์ž์ฒด์— ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•ด ๋™์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด๋‹ค.


๐Ÿ“š 1. ์–ด์›์œผ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ

๊ฐœ๋…์€ ์–ธ์ œ๋‚˜ ์ด๋ฆ„๋ถ€ํ„ฐ ์ดํ•ดํ•˜๋ฉด ๊ฐ€์žฅ ๋น ๋ฅด๋‹ค.

  • Path : ๊ฒฝ๋กœ
  • Parameter : ๋งค๊ฐœ๋ณ€์ˆ˜

์ปดํ“จํ„ฐ์—์„œ ํŒŒ์ผ์„ ์ฐพ์„ ๋•Œ

/home/user/file.txt

์ฒ˜๋Ÿผ โ€œ์–ด๋””๋กœ ๊ฐ€์•ผ ํ•˜๋Š”์ง€โ€๋ฅผ ๊ฒฝ๋กœ(Path)๋กœ ํ‘œํ˜„ํ•˜๋“ฏ, ์›น์—์„œ๋„ ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด URL ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฒฝ๋กœ ์•ˆ์— ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ๋„ฃ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Path Parameter๋‹ค.

๐Ÿ‘‰ ์ฆ‰, Path Parameter๋ž€
URL ๊ฒฝ๋กœ์— ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด ๋™์ ์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค

๐Ÿ’ก ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

Path Parameter๋Š” Python์˜ ๋ฌธ์ž์—ด ํฌ๋งทํŒ…๊ณผ ๊ฑฐ์˜ ๊ฐ™์€ ๊ฐœ๋…์ด๋‹ค.

name = "์ฒ ์ˆ˜"
print(f"Hello {name}")

์ค‘๊ด„ํ˜ธ ์•ˆ์˜ {name} ์œ„์น˜์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋“ฏ,

/users/{user_id}

์—ฌ๊ธฐ์„œ {user_id} ์ž๋ฆฌ์— ์‹ค์ œ ๊ฐ’์ด ๋“ค์–ด์˜จ๋‹ค.


๐Ÿงช 2. ์ง์ ‘ ์ฒดํ—˜ํ•˜๊ธฐ

๋ง๋กœ๋งŒ ๋ณด๋ฉด ๊ฐ์ด ์•ˆ ์˜จ๋‹ค. ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์˜ˆ์ œ๋ถ€ํ„ฐ ๋ฐ”๋กœ ์‹คํ–‰ํ•ด๋ณด์ž.

๐Ÿ“„ ์˜ˆ์ œ ์ฝ”๋“œ

from fastapi import FastAPI

app = FastAPI()

# {item_id} ๊ฐ€ Path Parameter๋‹ค
@app.get("/items/{item_id}")
async def read_item(item_id):
    return {"item_id": item_id}

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š” ๋”ฑ ๋‘ ๊ฐ€์ง€๋‹ค.

  • URL ๊ฒฝ๋กœ์— {item_id}๊ฐ€ ์žˆ๋‹ค
  • ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„๋„ item_id๋กœ ๋™์ผํ•˜๋‹ค

๐ŸŒ ์‹คํ–‰ ํ›„ ํ…Œ์ŠคํŠธ

์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•œ ๋’ค ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•„๋ž˜ ์ฃผ์†Œ๋“ค์— ์ ‘์†ํ•ด๋ณด์ž.

  • /items/abc โ†’ {"item_id": "abc"}
  • /items/123 โ†’ {"item_id": "123"}
  • /items/jeff โ†’ {"item_id": "jeff"}

URL์˜ {item_id} ์œ„์น˜์— ๋ฌด์—‡์„ ๋„ฃ๋“ , ๊ทธ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ๋‹ค.

๐Ÿ‘‰ URL ๊ฒฝ๋กœ = ํ•จ์ˆ˜ ์ธ์ž ์ „๋‹ฌ ํ†ต๋กœ


๐Ÿง  3. ์ด๋ก ๊ณผ ํ•ต์‹ฌ ๋‚ด์šฉ ์„ค๋ช…

3.1 ํƒ€์ž… ์„ ์–ธ๊ณผ ์ž๋™ ๋ณ€ํ™˜

์ง€๊ธˆ๊นŒ์ง€์˜ ์˜ˆ์ œ์—์„œ๋Š” item_id๊ฐ€ ๋ฌธ์ž์—ด๋กœ ๋“ค์–ด์™”๋‹ค.

ํ•˜์ง€๋งŒ FastAPI์—์„œ๋Š” ํƒ€์ž… ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๊ฐ’์ด ์ž๋™์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

๐Ÿ“„ ํƒ€์ž…์„ ๋ช…์‹œํ•œ ์˜ˆ์ œ

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

์ด์ œ item_id๋Š” ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ ์ •์ˆ˜(int)๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

  • /items/3 โ†’ {"item_id": 3}
๐Ÿ‘‰ ๋ฌธ์ž์—ด "3" โ†’ ์ •์ˆ˜ 3
FastAPI๊ฐ€ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค

โš™๏ธ ์ž๋™ ๋ณ€ํ™˜(Parsing)์˜ ์žฅ์ 

์ผ๋ฐ˜์ ์ธ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๋ฉด ๋ณดํ†ต ์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

item_id = int(item_id)

ํ•˜์ง€๋งŒ FastAPI์—์„œ๋Š”

ํƒ€์ž… ํžŒํŠธ ํ•œ ์ค„๋กœ "๋ณ€ํ™˜ + ๊ฒ€์ฆ"๊นŒ์ง€ ๋ชจ๋‘ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

3.2 ์ž๋™ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ

ํƒ€์ž…์„ ์„ ์–ธํ•˜๋ฉด, ์ž˜๋ชป๋œ ๊ฐ’์ด ๋“ค์–ด์™”์„ ๋•Œ๋„ FastAPI๊ฐ€ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์•„๋ž˜ ์š”์ฒญ์„ ๋ณด๋‚ด๋ณด์ž.

/items/foo

item_id๋Š” int๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋Š”๋ฐ, ๋ฌธ์ž์—ด "foo"๊ฐ€ ๋“ค์–ด์™”๋‹ค.

์ด ๊ฒฝ์šฐ FastAPI๋Š”

  • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ 
  • ์ž๋™์œผ๋กœ ์—๋Ÿฌ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค

๐Ÿ“Œ ๋ฐ˜ํ™˜๋˜๋Š” ์—๋Ÿฌ ์˜ˆ์‹œ

{
  "detail": [
    {
      "type": "int_parsing",
      "loc": ["path", "item_id"],
      "msg": "Input should be a valid integer",
      "input": "foo"
    }
  ]
}
๐Ÿ‘‰ ์ง์ ‘ if๋ฌธ์œผ๋กœ ๊ฒ€์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ํƒ€์ž… ์„ ์–ธ๋งŒ์œผ๋กœ ๊ฒ€์ฆ์ด ๋๋‚œ๋‹ค

3.3 ์ž๋™ ๋ฌธ์„œ ์ƒ์„ฑ

ํƒ€์ž… ํžŒํŠธ ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ–ˆ์„ ๋ฟ์ธ๋ฐ, API ๋ฌธ์„œ๊นŒ์ง€ ์ž๋™์œผ๋กœ ๋ฐ”๋€๋‹ค.

  • Swagger UI : /docs
  • ReDoc : /redoc

๋ฌธ์„œ ํ™”๋ฉด์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€ํ™”:

  • Path Parameter ์ž…๋ ฅ ์นธ ์ž๋™ ์ƒ์„ฑ
  • item_id๊ฐ€ int ํƒ€์ž…์œผ๋กœ ํ‘œ์‹œ
  • ์ž˜๋ชป๋œ ๊ฐ’ ์ž…๋ ฅ ์‹œ ์ฆ‰์‹œ ์—๋Ÿฌ ํ™•์ธ ๊ฐ€๋Šฅ
๐Ÿ‘‰ ์ฝ”๋“œ ํ•œ ์ค„(ํƒ€์ž… ํžŒํŠธ)๋กœ
๊ฒ€์ฆ + ๋ฌธ์„œ + UI๊ฐ€ ๋™์‹œ์— ์™„์„ฑ๋œ๋‹ค

3.4 Path Operation์˜ ์ˆœ์„œ

Path Parameter๋ฅผ ์“ฐ๋‹ค ๋ณด๋ฉด โ€œ์™œ ์ด ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์•ˆ ํƒ€์ง€?โ€ ๊ฐ™์€ ์ƒํ™ฉ์„ ํ•œ ๋ฒˆ์ฏค ๊ฒช๋Š”๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์›์ธ์€ ๊ฒฝ๋กœ(Path) ๋งค์นญ ์ˆœ์„œ๋‹ค.

FastAPI๋Š” ๊ฒฝ๋กœ๋ฅผ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฐจ๋ก€๋Œ€๋กœ ํ™•์ธํ•˜๋ฉด์„œ โ€œ๊ฐ€์žฅ ๋จผ์ € ๋งค์นญ๋˜๋Š”โ€ ๋ผ์šฐํŠธ๋ฅผ ์„ ํƒํ•œ๋‹ค. ์ฆ‰, ์„ ์–ธ ์ˆœ์„œ๊ฐ€ ๊ณง ์šฐ์„ ์ˆœ์œ„๋‹ค.


โœ… ํ•ต์‹ฌ ๊ทœ์น™

  • ๊ณ ์ • ๊ฒฝ๋กœ(static path) ๋Š” ๋™์  ๊ฒฝ๋กœ(dynamic path) ๋ณด๋‹ค ํ•ญ์ƒ ์œ„์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๋™์  ๊ฒฝ๋กœ๊ฐ€ ์œ„์— ์žˆ์œผ๋ฉด, ๊ณ ์ • ๊ฒฝ๋กœ ์š”์ฒญ๋„ โ€œ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„๋ฒ„๋ฆฌ๋Š”โ€ ์ผ์ด ์ƒ๊ธด๋‹ค.

โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ (๊ณ ์ • โ†’ ๋™์ )

from fastapi import FastAPI

app = FastAPI()

# โœ… ๊ณ ์ • ๊ฒฝ๋กœ ๋จผ์ €
@app.get("/users/me")
async def read_user_me():
    return {"user_id": "ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž"}

# โœ… ๋™์  ๊ฒฝ๋กœ๋Š” ๋‚˜์ค‘์—
@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}

์ด ์ƒํƒœ์—์„œ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค.

  • /users/me โ†’ read_user_me() ์‹คํ–‰
  • /users/123 โ†’ read_user() ์‹คํ–‰ (user_id="123")

โŒ ์ž˜๋ชป๋œ ์˜ˆ์‹œ (๋™์  โ†’ ๊ณ ์ •)

from fastapi import FastAPI

app = FastAPI()

# โŒ ๋™์  ๊ฒฝ๋กœ๊ฐ€ ๋จผ์ €
@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}

# โŒ ๊ณ ์ • ๊ฒฝ๋กœ๊ฐ€ ๋‚˜์ค‘
@app.get("/users/me")
async def read_user_me():
    return {"user_id": "ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž"}

์ด ๊ฒฝ์šฐ /users/me ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉดโ€ฆ

  • FastAPI๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ ๋งค์นญํ•œ๋‹ค.
  • /users/{user_id} ๋Š” /users/me ์™€๋„ ๋งค์นญ๋œ๋‹ค.
  • ๊ทธ๋ž˜์„œ user_id="me" ๋กœ ํ•ด์„ํ•ด๋ฒ„๋ฆฐ๋‹ค.

์ฆ‰, ๊ฒฐ๊ณผ๊ฐ€ ์ด๋ ‡๊ฒŒ ๋œ๋‹ค:

  • /users/me โ†’ read_user() ์‹คํ–‰ (์˜๋„์™€ ๋‹ค๋ฆ„)

๐Ÿ”ฅ โ€œ์ˆœ์„œโ€ ๋ฌธ์ œ๊ฐ€ ํŠนํžˆ ์น˜๋ช…์ ์ธ ์ด์œ 

์ด๊ฑด ๋‹จ์ˆœํžˆ โ€œ๊ฒฐ๊ณผ๊ฐ€ ์ด์ƒํ•˜๋‹คโ€์—์„œ ๋๋‚˜์ง€ ์•Š๋Š”๋‹ค.

  • ๊ณ ์ • ๊ฒฝ๋กœ์—์„œ๋งŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋กœ์ง(๊ถŒํ•œ ์ฒดํฌ, ํŠน๋ณ„ ์‘๋‹ต ๋“ฑ)์ด
  • ๋™์  ๊ฒฝ๋กœ๋กœ ํก์ˆ˜๋˜์–ด๋ฒ„๋ฆฌ๋ฉด
  • ๋ณด์•ˆ/๊ถŒํ•œ/๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํ‹€์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค

๊ทธ๋ž˜์„œ ์‹ค๋ฌด์—์„œ๋Š” ์ด ์ˆœ์„œ ๊ทœ์น™์„ ๊ฑฐ์˜ โ€œ๊ทœ์น™โ€์ด ์•„๋‹ˆ๋ผ โ€œ๋ฒ•โ€์ฒ˜๋Ÿผ ๋‹ค๋ฃฌ๋‹ค.


โœ… ์‹ค์ „ ํŒ: ๊ณ ์ • ๊ฒฝ๋กœ๋ฅผ โ€œ๋จผ์ €โ€ ๋ชจ์•„๋‘๊ธฐ

๋ผ์šฐํ„ฐ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ โ€œ๊ณ ์ •โ€์„ ๋จผ์ € ๋ชจ์•„๋‘๋ฉด ์‹ค์ˆ˜๊ฐ€ ํ™• ์ค„์–ด๋“ ๋‹ค.

# โœ… users ๊ด€๋ จ ๊ณ ์ • ๋ผ์šฐํŠธ
@app.get("/users/me")
async def me(): ...

@app.get("/users/admin")
async def admin(): ...

# โœ… ๋งˆ์ง€๋ง‰์— users ๋™์  ๋ผ์šฐํŠธ
@app.get("/users/{user_id}")
async def user(user_id: str): ...

์ถ”๊ฐ€ ํ•ต์‹ฌ: ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ์ค‘๋ณต ์ •์˜ํ•˜๋ฉด?

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
FastAPI์—์„œ ๊ฐ™์€ ๋ฉ”์„œ๋“œ + ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ๋‘ ๋ฒˆ ์ •์˜ํ•˜๋ฉด, ์‚ฌ์‹ค์ƒ โ€œ๋’ค์— ์žˆ๋Š” ๊ฑด ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธโ€.

from fastapi import FastAPI

app = FastAPI()

@app.get("/users")
async def read_users():
    return ["์ฒ ์ˆ˜", "์˜ํฌ"]

@app.get("/users")
async def read_users2():
    return ["ํ›ˆ์ด", "์งฑ๊ตฌ"]

์ด๋Ÿฐ ์ฝ”๋“œ๋Š” ๋ณด๋Š” ์‚ฌ๋žŒ์„ ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ๋งŒ๋“ค๊ณ  ์œ ์ง€๋ณด์ˆ˜๋„ ์ตœ์•…์ด๋‹ค.
(ํ™˜๊ฒฝ/๋ฒ„์ „์— ๋”ฐ๋ผ ๋ผ์šฐํŠธ ๋“ฑ๋ก ์‹œ์  ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์–ด ๋” ์œ„ํ—˜ํ•˜๋‹ค)

โœ… ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ณดํ†ต ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.

  • ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ: GET /users vs POST /users
  • ๊ฒฝ๋กœ๋ฅผ ๋‹ค๋ฅด๊ฒŒ: /users vs /users/v2
  • ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ถ„๊ธฐ: /users?type=...
  • ์•„์˜ˆ ๋ผ์šฐํŒ… ๊ตฌ์กฐ๋ฅผ ์žฌ์„ค๊ณ„

3.5 Enum์œผ๋กœ ๊ฐ’ ์ œํ•œํ•˜๊ธฐ (์„ ํƒ ๊ฐ€๋Šฅํ•œ ๊ฐ’๋งŒ ๋ฐ›๊ธฐ)

Path Parameter๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋–ค ๋ฌธ์ž์—ด์ด๋“  ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์‹ค๋ฌด์—์„œ๋Š” โ€œ์ •ํ•ด์ง„ ๊ฐ’๋งŒ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์€โ€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋ธ ์ด๋ฆ„์ด ์•„๋ž˜ 3๊ฐœ ์ค‘ ํ•˜๋‚˜๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•˜์ž.

  • alexnet
  • resnet
  • lenet

์ด๋Ÿด ๋•Œ Python์˜ Enum์„ ์“ฐ๋ฉด:

  • ํ—ˆ์šฉ๋œ ๊ฐ’๋งŒ ๋ฐ›๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ณ 
  • ์ž˜๋ชป๋œ ๊ฐ’์ด ๋“ค์–ด์˜ค๋ฉด ์ž๋™์œผ๋กœ 422 ์—๋Ÿฌ๊ฐ€ ๋‚˜๋ฉฐ
  • ๋ฌธ์„œ(/docs)์—์„œ ๋“œ๋กญ๋‹ค์šด์ฒ˜๋Ÿผ ์„ ํƒ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋ณด์ธ๋‹ค

โœ… Enum ์˜ˆ์ œ

from enum import Enum
from fastapi import FastAPI

class ModelName(str, Enum):
    alexnet = "alexnet"
    resnet = "resnet"
    lenet = "lenet"

app = FastAPI()

@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
    if model_name is ModelName.alexnet:
        return {"model_name": model_name, "message": "Deep Learning FTW!"}

    if model_name.value == "lenet":
        return {"model_name": model_name, "message": "LeCNN all the images"}

    return {"model_name": model_name, "message": "Have some residuals"}

โœ… Enum์„ ์“ฐ๋ฉด ์–ป๋Š” ๊ฒƒ

  • ์œ ํšจํ•œ ๊ฐ’๋งŒ ํ—ˆ์šฉ (๊ทธ ์™ธ ๊ฐ’์€ ์ž๋™์œผ๋กœ ์—๋Ÿฌ)
  • /docs์—์„œ ์„ ํƒ ๊ฐ€๋Šฅํ•œ ๊ฐ’ ๋ชฉ๋ก์ด UI๋กœ ํ‘œ์‹œ๋จ
  • ์ฝ”๋“œ์—์„œ if model_name is ModelName.alexnet ์ฒ˜๋Ÿผ ์•ˆ์ „ํ•˜๊ฒŒ ๋น„๊ต ๊ฐ€๋Šฅ

๐Ÿ“Œ ์–ธ์ œ ์“ฐ๋ฉด ์ข‹์„๊นŒ?

  • ์ƒํƒœ ๊ฐ’: pending / running / done
  • ์นดํ…Œ๊ณ ๋ฆฌ: news / blog / notice
  • ๊ถŒํ•œ: admin / user / guest
  • ํƒ€์ž…: image / video / text

โ€œ๋ฒ”์œ„๊ฐ€ ์ •ํ•ด์ง„ ๊ฐ’โ€์ด๋ฉด Enum์„ ์‚ฌ์šฉํ•˜์ž


3.6 ์Šฌ๋ž˜์‹œ(/)๋ฅผ ํฌํ•จํ•˜๋Š” Path Parameter

์ผ๋ฐ˜์ ์œผ๋กœ Path Parameter๋Š” ์Šฌ๋ž˜์‹œ(/)๋ฅผ ๊ฒฝ๊ณ„๋กœ ๋Š๊ธด๋‹ค.
์ฆ‰, ๊ธฐ๋ณธ ํ˜•ํƒœ์—์„œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ โ€œํ•œ ๋ฉ์–ด๋ฆฌโ€๋งŒ ๋ฐ›๋Š”๋‹ค.

  • /files/a/b/c.txt ์—์„œ {file_path} ๋Š” ๋ณดํ†ต a๊นŒ์ง€๋งŒ ๋ฐ›๋Š”๋‹ค

๊ทธ๋Ÿฐ๋ฐ ํŒŒ์ผ ๊ฒฝ๋กœ์ฒ˜๋Ÿผ ์Šฌ๋ž˜์‹œ ํฌํ•จ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ํ†ต์งธ๋กœ ๋ฐ›๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
์ด๋•Œ FastAPI๋Š” :path ์ปจ๋ฒ„ํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

โœ… :path ์˜ˆ์ œ

from fastapi import FastAPI

app = FastAPI()

@app.get("/files/{file_path:path}")
async def read_file(file_path: str):
    return {"file_path": file_path}

์ด์ œ ์•„๋ž˜ ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

  • /files/home/jay/myfile.txt
    โ†’ {"file_path": "home/jay/myfile.txt"}

โš ๏ธ ์Šฌ๋ž˜์‹œ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ๋กœ๋Š”?

๋งŒ์•ฝ ์‹ค์ œ๋กœ /home/jay/myfile.txt ์ฒ˜๋Ÿผ โ€œ์Šฌ๋ž˜์‹œ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ๋กœโ€๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๊ณ  ์‹ถ๋‹ค๋ฉด URL์€ ์ด๋ ‡๊ฒŒ ๋œ๋‹ค:

  • /files//home/jay/myfile.txt

์ค‘๊ฐ„์— ์Šฌ๋ž˜์‹œ๊ฐ€ ํ•˜๋‚˜ ๋” ๋“ค์–ด๊ฐ€๋Š” ์ด์œ ๋Š”:

  • /files/ ๋’ค์— Path Parameter ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š”๋ฐ
  • ๊ทธ ๊ฐ’ ์ž์ฒด๊ฐ€ / ๋กœ ์‹œ์ž‘ํ•˜๋‹ˆ๊นŒ
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ // ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋˜๋Š” ๊ฒƒ

โœ… ์ž์ฃผ ์“ฐ์ด๋Š” ์ผ€์ด์Šค

  • ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ/์กฐํšŒ API
  • S3 key ์ฒ˜๋Ÿผ โ€œ๊ฒฝ๋กœ ํ˜•ํƒœ ๋ฌธ์ž์—ดโ€์„ ๊ทธ๋Œ€๋กœ ๋ฐ›๋Š” API
  • CDN/์Šคํ† ๋ฆฌ์ง€ ํ”„๋ก์‹œ ๋ผ์šฐํŠธ

๐Ÿ”š ๋งˆ๋ฌด๋ฆฌ

Path Parameter๋Š” ๋‹จ์ˆœํžˆ โ€œURL์—์„œ ๊ฐ’ ๋ฐ›๊ธฐโ€๊ฐ€ ์•„๋‹ˆ๋‹ค.
FastAPI์—์„œ๋Š”

  • ํƒ€์ž… ํžŒํŠธ๋กœ ์ž๋™ ๋ณ€ํ™˜
  • ํƒ€์ž… ํžŒํŠธ๋กœ ์ž๋™ ๊ฒ€์ฆ
  • ๋ฌธ์„œ์—์„œ ์ž๋™ UI ์ƒ์„ฑ
  • Enum์œผ๋กœ ๊ฐ’ ์ œํ•œ
  • :path๋กœ ๊ฒฝ๋กœ ํ†ต์งธ๋กœ ๋ฐ›๊ธฐ

๊นŒ์ง€ ํ•œ ๋ฒˆ์— ์ด์–ด์ง„๋‹ค.

์ฆ‰, Path Parameter๋ฅผ ์ž˜ ์“ฐ๋ฉด
API ์„ค๊ณ„๊ฐ€ ๋” ์•ˆ์ „ํ•ด์ง€๊ณ  ๋ฌธ์„œ๊นŒ์ง€ ๊น”๋”ํ•ด์ง„๋‹ค.

profile
Gongbuhaja

0๊ฐœ์˜ ๋Œ“๊ธ€