FastAPI - Query Parameters

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

FastAPI

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

๐Ÿงญ Query Parameters

FastAPI์—์„œ Query Parameter๋Š” URL์˜ ? ๋’ค์— ๋ถ™๋Š” ๊ฐ’์œผ๋กœ, ์š”์ฒญ์˜ ์กฐ๊ฑดยท์˜ต์…˜ยท๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.


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

  • Query : ์งˆ๋ฌธํ•˜๋‹ค, ์กฐํšŒํ•˜๋‹ค
  • Parameter : ์กฐ๊ฑด, ๋ฒ”์œ„๋ฅผ ์ •ํ•˜๋Š” ๊ฐ’

์ฆ‰ Query Parameter๋ž€,

๐Ÿ‘‰ ์„œ๋ฒ„์—๊ฒŒ โ€œ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ด๋Ÿฐ ์กฐ๊ฑด์œผ๋กœ ์กฐํšŒํ•ด์ค˜โ€๋ผ๊ณ  ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์ด๋‹ค

๐ŸŒ URL ๊ตฌ์กฐ๋กœ ํ•œ ๋ฒˆ์— ์ดํ•ดํ•˜๊ธฐ

http://127.0.0.1:8000/items/?skip=0&limit=10
๊ตฌ์„ฑ ์š”์†Œ ์˜๋ฏธ
/items/ Path (๋ฆฌ์†Œ์Šค ์œ„์น˜)
? Query ์‹œ์ž‘ ์ง€์ 
skip=0 Query Parameter
limit=10 Query Parameter

Query Parameter๋Š” ํ•ญ์ƒ key=value ํ˜•ํƒœ์ด๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ &๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค.


๐Ÿง  ํ•ต์‹ฌ ๊ฐœ๋… ํ•œ๋ˆˆ์— ์ •๋ฆฌ

๊ตฌ๋ถ„ Path Parameter Query Parameter
์œ„์น˜ URL ๊ฒฝ๋กœ ? ๋’ค
์—ญํ•  ๋ฆฌ์†Œ์Šค ์‹๋ณ„ ์กฐ๊ฑด / ์˜ต์…˜
ํ•„์ˆ˜ ์—ฌ๋ถ€ ๋Œ€๋ถ€๋ถ„ ํ•„์ˆ˜ ๋Œ€๋ถ€๋ถ„ ์„ ํƒ
์˜ˆ์‹œ /users/1 ?page=1
๐Ÿ‘‰ ์ •๋ฆฌํ•˜๋ฉด
โ€œ๋ฌด์—‡์„ ๋ณผ์ง€โ€๋Š” Path
โ€œ์–ด๋–ป๊ฒŒ ๋ณผ์ง€โ€๋Š” Query

๐Ÿงช 2. ๊ธฐ๋ณธ Query Parameter

FastAPI๋Š” ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ Path์— ์—†์œผ๋ฉด ์ž๋™์œผ๋กœ Query Parameter๋กœ ์ธ์‹ํ•œ๋‹ค.

๐Ÿ“„ ์˜ˆ์ œ

from fastapi import FastAPI

app = FastAPI()

# ๊ฐ€์งœ ๋ฐ์ดํ„ฐ
fake_items_db = [
    {"item_name": "Foo"},
    {"item_name": "Bar"},
    {"item_name": "Baz"},
]

@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]
  • skip : ๊ฑด๋„ˆ๋›ธ ํ•ญ๋ชฉ ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: 0)
  • limit : ๊ฐ€์ ธ์˜ฌ ํ•ญ๋ชฉ ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: 10)

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

  • http://127.0.0.1:8000/items/ โ†’ ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ (skip=0, limit=10)
  • http://127.0.0.1:8000/items/?skip=0&limit=10โ†’ ์œ„์™€ ๋™์ผ
  • {"item_name": "Foo"},
    {"item_name": "Bar"},
    {"item_name": "Baz"}
  • http://127.0.0.1:8000/items/?skip=1&limit=1 โ†’ ๋‘ ๋ฒˆ์งธ ํ•ญ๋ชฉ 1๊ฐœ
  • {"item_name": "Bar"}

    ๐Ÿ‘‰ Query Parameter๋Š” ์ „๋‹ฌ๋˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์ด ์‚ฌ์šฉ๋œ๋‹ค


    โœ… Optional Parameters (์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜)

    @app.get("/items/{item_id}")
    async def read_item(item_id: str, q: str | None = None):
        # q๋Š” ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜
        # ์ œ๊ณต๋˜๋ฉด ์‚ฌ์šฉํ•˜๊ณ , ์—†์œผ๋ฉด None
        if q:
            return {"item_id": item_id, "q": q}
        return {"item_id": item_id}

    q์˜ ์˜๋ฏธ
    โ€ข ์ฟผ๋ฆฌ(Query) ํŒŒ๋ผ๋ฏธํ„ฐ
    โ€ข URL ๋’ค์— ?key=value ํ˜•ํƒœ๋กœ ์ „๋‹ฌ
    โ€ข ์„ ํƒ ์‚ฌํ•ญ์ด๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด..

    #q=fastapi โ†’ q
    /items/abc?q=fastapi

    ๊ฒฐ๊ณผ:

    {"item_id":"abc","q":"fastapi"}

    โœ… ํ•„์ˆ˜ Query Parameters

    ๊ธฐ๋ณธ๊ฐ’ ์—†์ด ์„ ์–ธํ•˜๊ธฐ

    @app.get("/items/{item_id}")
    async def read_user_item(item_id: str, needy: str):
        # needy๋Š” ํ•„์ˆ˜ query parameter
        # ๊ธฐ๋ณธ๊ฐ’์ด ์—†์œผ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ์ œ๊ณต๋˜์–ด์•ผ ํ•จ
        item = {"item_id": item_id, "needy": needy}
        return item

    ๋งŒ์•ฝ ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด,

    โŒ ์ž˜๋ชป๋œ ์š”์ฒญ: http://127.0.0.1:8000/items/foo-item

    ์‘๋‹ต:

    {
      "detail": [
        {
          "type": "missing",
          "loc": ["query", "needy"],
          "msg": "Field required",
          "input": null
        }
      ]
    }

    โœ… ์˜ฌ๋ฐ”๋ฅธ ์š”์ฒญ: http://127.0.0.1:8000/items/foo-item?needy=essential!

    ์‘๋‹ต:

    {
      "item_id": "foo-item",
      "needy": "essential!"
    }

    ๐Ÿง  3. ํƒ€์ž… ์„ ์–ธ๊ณผ ์ž๋™ ๋ณ€ํ™˜

    Query Parameter๋Š” URL์—์„œ ๋„˜์–ด์˜ฌ ๋•Œ ๋ฌด์กฐ๊ฑด ๋ฌธ์ž์—ด(str)์ด๋‹ค.

    ํ•˜์ง€๋งŒ FastAPI์—์„œ๋Š” ํƒ€์ž… ํžŒํŠธ๋ฅผ ์“ฐ๋Š” ์ˆœ๊ฐ„,

    • ์ž๋™ ํƒ€์ž… ๋ณ€ํ™˜
    • ์ž๋™ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ

    ์ด ๋™์‹œ์— ์ด๋ฃจ์–ด์ง„๋‹ค.

    ๐Ÿ“„ ํƒ€์ž… ๋ณ€ํ™˜ ์˜ˆ์ œ (Boolean)

    from fastapi import FastAPI
    
    app = FastAPI()
    
    @app.get("/items/{item_id}")
    async def read_item(
        item_id: str,
        q: str | None = None,
        short: bool = False  # bool ํƒ€์ž… ์„ ์–ธ
    ):
        item = {"item_id": item_id}
        
        if q:
            item.update({"q": q})
        
        # short๊ฐ€ False๋ฉด ๊ธด ์„ค๋ช… ์ถ”๊ฐ€
        if not short:
            item.update({
                "description": "This is an amazing item that has a long description"
            })
        
        return item

    /items/{item_id}๋กœ ์š”์ฒญ์ด ์˜ค๋ฉด
    item_id๋Š” ํ•„์ˆ˜๋กœ ๋ฐ›๊ณ ,
    q์™€ short๋Š” ์„ ํƒ์ ์œผ๋กœ ๋ฐ›์•„์„œ
    ์‘๋‹ต JSON์˜ ๋‚ด์šฉ๊ณผ ๊ธธ์ด๋ฅผ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ฐ”๊พผ๋‹ค.

    ์ด ๊ตฌ์กฐ๋Š” API ์‘๋‹ต ์ตœ์ ํ™”์˜ ๊ธฐ๋ณธ์ด๋‹ค.
    ์˜ˆ์‹œ:
    โ€ข ๋ชจ๋ฐ”์ผ โ†’ short=true
    โ€ข ์›น ์ƒ์„ธ ํŽ˜์ด์ง€ โ†’ short=false
    โ€ข ๊ฒ€์ƒ‰ API โ†’ q ์‚ฌ์šฉ

    ์ฆ‰, ๊ฐ™์€ API๋ฅผ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์“ฐ๋Š” ๋ฐฉ์‹์ด๋‹ค.

    โœ… ์ž๋™ ๋ณ€ํ™˜ ์˜ˆ์‹œ

    • ?short=true โ†’ True
    • ?short=True โ†’ True
    • ?short=on โ†’ True
    • ?short=1 โ†’ True
    • ?short=yes โ†’ True
    • ๊ทธ ์™ธ โ†’ False
    ๐Ÿ‘‰ ๋ฌธ์ž์—ด โ†’ Python ํƒ€์ž… ๋ณ€ํ™˜์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค

    ๐Ÿ” ๋‚ด๋ถ€ ๋™์ž‘ ํ๋ฆ„

    ์š”์ฒญ URL
       โ†“
    Query ๋ฌธ์ž์—ด (?skip=1&limit=2)
       โ†“
    FastAPI ํŒŒ์‹ฑ
       โ†“
    ํƒ€์ž… ํžŒํŠธ ๊ธฐ๋ฐ˜ ๋ณ€ํ™˜ (str โ†’ int, bool)
       โ†“
    ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
       โ†“
    ํ•จ์ˆ˜ ์‹คํ–‰
    

    ๐Ÿ“Œ ๊ธฐ์–ตํ•ด์•ผ ํ•  ํฌ์ธํŠธ

    • ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์œผ๋ฉด ์„ ํƒ Query
    • ๊ธฐ๋ณธ๊ฐ’์ด ์—†์œผ๋ฉด ํ•„์ˆ˜ Query
    • ํƒ€์ž… ํžŒํŠธ = ๋ณ€ํ™˜ + ๊ฒ€์ฆ + ๋ฌธ์„œ
    • /docs ์—์„œ ๋ฐ”๋กœ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
    ๐Ÿ‘‰ Query Parameter๋Š” API๋ฅผ โ€œ์œ ์—ฐํ•˜๊ฒŒโ€ ๋งŒ๋“œ๋Š” ํ•ต์‹ฌ ๋„๊ตฌ๋‹ค

    ๐Ÿงญ Query Parameters (์‹ฌํ™”)

    ๐Ÿ”— ์—ฌ๋Ÿฌ ๊ฐœ์˜ Path + Query Parameters ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ

    FastAPI์—์„œ๋Š” Path Parameter์™€ Query Parameter๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  ์ค‘์š”ํ•œ ์‚ฌ์‹ค ํ•˜๋‚˜:

    โœ… ์„ ์–ธ ์ˆœ์„œ๋Š” ์ „ํ˜€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค
    ๐Ÿ‘‰ ์ด๋ฆ„๊ณผ ์œ„์น˜(Path์— ์žˆ๋А๋ƒ ์—†๋А๋ƒ)๋กœ ์ž๋™ ๊ตฌ๋ถ„๋œ๋‹ค


    ๐Ÿ“„ ์˜ˆ์ œ: ์‚ฌ์šฉ์ž + ์•„์ดํ…œ ์กฐํšŒ API

    from fastapi import FastAPI
    
    app = FastAPI()
    
    @app.get("/users/{user_id}/items/{item_id}")
    async def read_user_item(
        user_id: int,              # Path Parameter (ํ•„์ˆ˜)
        item_id: str,              # Path Parameter (ํ•„์ˆ˜)
        q: str | None = None,      # Query Parameter (์„ ํƒ)
        short: bool = False        # Query Parameter (๊ธฐ๋ณธ๊ฐ’)
    ):
        item = {
            "item_id": item_id,
            "owner_id": user_id
        }
    
        if q:
            item["q"] = q
    
        if not short:
            item["description"] = "This is an amazing item with a long description"
    
        return item

    ๐ŸŒ ์š”์ฒญ ์˜ˆ์‹œ

    /users/1/items/abc
    /users/1/items/abc?q=search
    /users/1/items/abc?q=search&short=true

    ๐Ÿง  FastAPI์˜ ์ž๋™ ํŒ๋‹จ ๊ธฐ์ค€

    ๊ธฐ์ค€๋ถ„๋ฅ˜
    URL ๊ฒฝ๋กœ์— {}๋กœ ํฌํ•จ๋จPath Parameter
    ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ง€๋งŒ Path์— ์—†์ŒQuery Parameter
    ๊ธฐ๋ณธ๊ฐ’ ์—†์Œํ•„์ˆ˜
    ๊ธฐ๋ณธ๊ฐ’ ์žˆ์Œ์„ ํƒ

    ๐Ÿ“š Path vs Query โ€” ์ ˆ๋Œ€ ํ—ท๊ฐˆ๋ฆฌ๋ฉด ์•ˆ ๋˜๋Š” ๊ธฐ์ค€

    ๊ธฐ์ค€Path ParameterQuery Parameter
    ์—ญํ• ๋ฆฌ์†Œ์Šค ์‹๋ณ„์กฐ๊ฑด / ์˜ต์…˜
    ์œ„์น˜URL ๊ฒฝ๋กœ? ๋’ค
    ํ•„์ˆ˜์„ฑ๊ฑฐ์˜ ํ•ญ์ƒ ํ•„์ˆ˜๋Œ€๋ถ€๋ถ„ ์„ ํƒ
    ์˜๋ฏธ๋ฌด์—‡์„ ๋ณผ์ง€์–ด๋–ป๊ฒŒ ๋ณผ์ง€

    ๐ŸŽฏ ๋ฆฌ์†Œ์Šค๋ฅผ ํŠน์ •ํ•˜๋ฉด Path, ์กฐ๊ฑด์„ ๋ฐ”๊พธ๋ฉด Query


    ๐Ÿ›  ํ•ต์‹ฌ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

    • โœ… Pagination โ†’ Query (page, limit)

    • โœ… Search / Filter โ†’ Query

    • โœ… ๋ฆฌ์†Œ์Šค ID โ†’ Path

    • โœ… ๊ธฐ๋ณธ๊ฐ’ ์—†๋Š” Query = ํ•„์ˆ˜

    • โœ… ํƒ€์ž… ํžŒํŠธ ํ•˜๋‚˜๋กœ

      • ๋ณ€ํ™˜
      • ๊ฒ€์ฆ
      • ๋ฌธ์„œ ์ž๋™ ์™„์„ฑ

    ๐Ÿ“˜ FastAPI๊ฐ€ ๋Œ€์‹  ํ•ด์ฃผ๋Š” ๊ฒƒ

    ๊ธฐ๋Šฅ์„ค๋ช…
    ํƒ€์ž… ๋ณ€ํ™˜"1" โ†’ 1, "true" โ†’ True
    ๊ฒ€์ฆ์ž˜๋ชป๋œ ๊ฐ’ ์ž๋™ ์—๋Ÿฌ
    ๋ฌธ์„œํ™”/docs ์ž๋™ ์ƒ์„ฑ
    ํ…Œ์ŠคํŠธ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฆ‰์‹œ ๊ฐ€๋Šฅ

    ๐Ÿ”š ์š”์•ฝ

    • Query Parameter๋Š” ? ๋’ค์— ์˜ค๋Š” ์กฐ๊ฑด ๊ฐ’
    • Query Parameter๋Š” ์กฐ๊ฑดยท์˜ต์…˜ยท๋ฒ”์œ„
    • Path Parameter๋Š” ๋ฆฌ์†Œ์Šค ์‹๋ณ„
    • FastAPI๋Š” ์ด๋ฆ„๊ณผ ์œ„์น˜๋กœ ์ž๋™ ๊ตฌ๋ถ„
    • ํƒ€์ž… ํžŒํŠธ ํ•˜๋‚˜๋กœ API ํ’ˆ์งˆ์ด ์™„์„ฑ๋จ
    profile
    Gongbuhaja

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