Python 10 - Annotated

KjjeddΒ·2026λ…„ 1μ›” 13일

Python

λͺ©λ‘ 보기
10/10
post-thumbnail

🏷️ Python Annotated μ‰½κ²Œ μ΄ν•΄ν•˜κΈ°

AnnotatedλŠ” 처음 보면 λ‚―μ„€λ‹€.
문법도 μƒμ†Œν•˜κ³ , 없어도 μ½”λ“œκ°€ 잘 λŒμ•„κ°„λ‹€.

β€œνƒ€μž… 힌트만 써도 λ˜λŠ” κ±° μ•„λ‹Œκ°€?”
β€œμ΄κ±Έ μ™œ ꡳ이 써야 ν•˜μ§€?”


πŸ€” AnnotatedλŠ” μ™œ λ“±μž₯ν–ˆμ„κΉŒ?

핡심뢀터 λ§ν•˜λ©΄ AnnotatedλŠ”
νƒ€μž…μ„ λ°”κΎΈλŠ” κΈ°λŠ₯이 μ•„λ‹ˆλ‹€.

❌ μƒˆλ‘œμš΄ νƒ€μž…μ„ λ§Œλ“œλŠ” κΈ°λŠ₯이 μ•„λ‹ˆλ‹€
❌ νŒŒμ΄μ¬μ„ μ—„κ²©ν•˜κ²Œ λ§Œλ“œλŠ” κΈ°λŠ₯도 μ•„λ‹ˆλ‹€
βœ… β€œμ΄ νƒ€μž…μ— λŒ€ν•œ μ„€λͺ…을 λ§λΆ™μ΄λŠ” κΈ°λŠ₯”이닀

πŸ“˜ Annotate의 μ˜λ―ΈλΆ€ν„° 이해

AnnotateλŠ” μ˜μ–΄λ‘œ β€œμ£Όμ„μ„ 달닀, λ©”λͺ¨λ₯Ό λ‚¨κΈ°λ‹€β€λΌλŠ” 뜻.

책을 읽을 λ•Œλ₯Ό λ– μ˜¬λ €λ³΄μž.

  • μ€‘μš”ν•œ λ¬Έμž₯에 밑쀄을 κΈ‹κ³ 
  • μ˜†μ— λ©”λͺ¨λ₯Ό 남긴닀
  • λ‚˜μ€‘μ— λ‹€μ‹œ 봀을 λ•Œ λΉ λ₯΄κ²Œ μ΄ν•΄ν•œλ‹€

Python의 AnnotatedλŠ”
λ°”λ‘œ 이 β€œλ©”λͺ¨β€λ₯Ό νƒ€μž…μ— λΆ™μ΄λŠ” 도ꡬ닀.


πŸ“¦ 택배 μƒμžλ‘œ μ΄ν•΄ν•˜λŠ” Annotated

κΈ°λ³Έ 택배 (νƒ€μž…λ§Œ μžˆλŠ” 경우)

name: str = "jay"
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  πŸ“¦ μƒμž         β”‚
β”‚  νƒ€μž…: str       β”‚
β”‚  λ‚΄μš©: "jay"     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

이 μƒμžλŠ”
β€œλ¬Έμžμ—΄μ΄ λ“€μ–΄ μžˆλ‹€β€λŠ” κ²ƒλ§Œ μ•Œλ €μ€€λ‹€.


🏷️ μŠ€ν‹°μ»€κ°€ 뢙은 택배 (Annotated μ‚¬μš©)

from typing import Annotated

name: Annotated[str, "이름은 50자 μ΄ν•˜"] = "jay"
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    πŸ“¦ μƒμž       β”‚
β”‚  νƒ€μž…: str       β”‚
β”‚  λ‚΄μš©: "jay"     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 🏷️ μŠ€ν‹°μ»€         β”‚
β”‚ "이름은 50자 μ΄ν•˜" β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

μƒμž μ•ˆμ˜ λ‚΄μš©μ€ λ°”λ€Œμ§€ μ•Šμ•˜λ‹€.
λŒ€μ‹ , μƒμžμ— μ„€λͺ… μŠ€ν‹°μ»€κ°€ λΆ™μ—ˆλ‹€.


🧠 핡심 포인트

  • AnnotatedλŠ” νƒ€μž…μ„ μœ μ§€ν•œλ‹€
  • νƒ€μž… μ˜†μ— μΆ”κ°€ 정보λ₯Ό 뢙인닀
  • Python μžμ²΄λŠ” 이 정보λ₯Ό λ¬΄μ‹œν•œλ‹€
  • FastAPI 같은 ν”„λ ˆμž„μ›Œν¬κ°€ 이 정보λ₯Ό 읽어 ν™œμš©ν•œλ‹€
πŸ‘‰ AnnotatedλŠ” μ‚¬λžŒκ³Ό ν”„λ ˆμž„μ›Œν¬λ₯Ό μœ„ν•œ νžŒνŠΈλ‹€

πŸ” Annotated 문법을 λ‹¨κ³„λ³„λ‘œ λœ―μ–΄λ³΄κΈ°

1단계: κ°€μž₯ κΈ°λ³Έ ν˜•νƒœ

from typing import Annotated

age: Annotated[int, "λ‚˜μ΄λŠ” 0 이상"] = 25
ꡬ성 μš”μ†Œ 의미
age λ³€μˆ˜ 이름
Annotated[...] μΆ”κ°€ 정보가 뢙은 νƒ€μž…
int μ‹€μ œ νƒ€μž…
"λ‚˜μ΄λŠ” 0 이상" λ©”λͺ¨(μŠ€ν‹°μ»€)
= 25 κΈ°λ³Έκ°’

2단계: None ν—ˆμš©ν•˜κΈ°

# λ¬Έμžμ—΄λ§Œ ν—ˆμš©
name: Annotated[str, "이름"] = "jay"

# λ¬Έμžμ—΄ λ˜λŠ” None
name: Annotated[str | None, "이름"] = None
πŸ‘‰ str | None은
πŸ‘‰ β€œλ¬Έμžμ—΄μ΄κ±°λ‚˜ 값이 없을 μˆ˜λ„ μžˆμŒβ€

이 νŒ¨ν„΄μ€
선택 μž…λ ₯κ°’μ—μ„œ μ•„μ£Ό 자주 λ“±μž₯ν•œλ‹€.


πŸ”— FastAPIμ—μ„œ Annotatedκ°€ λΉ›λ‚˜λŠ” μˆœκ°„

FastAPIμ—μ„œλŠ”
Annotated의 β€œμŠ€ν‹°μ»€ μžλ¦¬β€μ—
Query, Path, Header 같은 객체가 λ“€μ–΄κ°„λ‹€.

Query와 ν•¨κ»˜ μ‚¬μš©ν•˜κΈ°

from typing import Annotated
from fastapi import Query

q: Annotated[str | None, Query(max_length=50)] = None

이 μ½”λ“œλ₯Ό 읽어보면,

qλŠ” λ¬Έμžμ—΄μ΄κ±°λ‚˜ None이고,
Query κ²€μ¦μœΌλ‘œ μ΅œλŒ€ 50μžκΉŒμ§€ ν—ˆμš©ν•˜λ©°,
기본값은 None이닀

βš–οΈ Annotated 이전 방식과 비ꡐ

❌ μ˜ˆμ „ 방식

@app.get("/items/")
async def read_items(
    q: str | None = Query(default=None, max_length=50)
):
    return {"q": q}

문제점:

  • κΈ°λ³Έκ°’κ³Ό 검증 κ·œμΉ™μ΄ μ„žμ—¬ μžˆλ‹€
  • ν•œλˆˆμ— 읽기 μ–΄λ ΅λ‹€

βœ… Annotated 방식 (ꢌμž₯)

@app.get("/items/")
async def read_items(
    q: Annotated[str | None, Query(max_length=50)] = None
):
    return {"q": q}
βœ… νƒ€μž… + κ·œμΉ™μ€ Annotated μ•ˆμ—
βœ… 기본값은 = None으둜 λͺ…ν™•

🧩 ꡬ쑰 ν•œ λ²ˆμ— μ •λ¦¬ν•˜κΈ°

q: Annotated[str | None, Query(max_length=50)] = None
β”‚  β”‚           β”‚                 β”‚              β”‚
β”‚  β”‚           β”‚                 β”‚              └─ κΈ°λ³Έκ°’
β”‚  β”‚           β”‚                 └─ 검증 κ·œμΉ™ (μŠ€ν‹°μ»€)
β”‚  β”‚           └─ μ‹€μ œ νƒ€μž…
β”‚  └─ Annotated μ„ μ–Έ
└─ λ³€μˆ˜λͺ…

πŸ“Œ Annotated 정리

κ°œλ… 의미
Annotated νƒ€μž…μ— 메타 정보λ₯Ό λΆ™μ΄λŠ” 도ꡬ
첫 번째 인자 μ‹€μ œ νƒ€μž…
두 번째 인자 μΆ”κ°€ 정보 (Query, Path λ“±)
κΈ°λ³Έκ°’ = 둜 별도 μ§€μ •

🧠 κΌ­ μ•”κΈ°ν•  ν•„μš”λŠ” μ—†λ‹€

μ²˜μŒλΆ€ν„° μ™„λ²½νžˆ μ΄ν•΄ν•˜λ € ν•˜μ§€ 말고,

πŸ‘‰ 이 νŒ¨ν„΄μ„ κΈ°μ–΅ν•˜μž
Annotated[νƒ€μž…, κ·œμΉ™] = κΈ°λ³Έκ°’

그리고 ν•„μš”ν•œ μ˜΅μ…˜μ€ κ·Έλ•Œκ·Έλ•Œ μ°Ύμ•„μ„œ λΆ™μ΄μž.


✨ 마무리 ν•œ 쀄 μš”μ•½

  • AnnotatedλŠ” νƒ€μž…μ„ λ°”κΎΈμ§€ μ•ŠλŠ”λ‹€
  • νƒ€μž…μ— μ„€λͺ…κ³Ό κ·œμΉ™μ„ 뢙인닀
  • FastAPIλŠ” 이 μ„€λͺ…을 읽고 μžλ™μœΌλ‘œ λ™μž‘ν•œλ‹€
πŸ‘‰ AnnotatedλŠ” β€œμ½νžˆλŠ” μ½”λ“œβ€λ₯Ό λ§Œλ“œλŠ” 도ꡬ닀
profile
Gongbuhaja

0개의 λŒ“κΈ€