Skip to main content
@api λ°μ½”λ ˆμ΄ν„°λŠ” Model λ˜λŠ” Frame 클래슀의 λ©”μ„œλ“œλ₯Ό HTTP API μ—”λ“œν¬μΈνŠΈλ‘œ λ…ΈμΆœν•©λ‹ˆλ‹€.

κΈ°λ³Έ μ‚¬μš©λ²•

μ˜΅μ…˜

httpMethod

HTTP λ©”μ„œλ“œλ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
κΈ°λ³Έκ°’: "GET"

path

API μ—”λ“œν¬μΈνŠΈ 경둜λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. κΈ°λ³Έκ°’: /{modelName}/{methodName} (camelCase)
κ²½λ‘œλŠ” μžλ™μœΌλ‘œ camelCase둜 λ³€ν™˜λ©λ‹ˆλ‹€. UserModel.findById β†’ /user/findById

contentType

μ‘λ‹΅μ˜ Content-Type을 μ§€μ •ν•©λ‹ˆλ‹€. κΈ°λ³Έκ°’: "application/json"
contentType μ‚¬μš© μΌ€μ΄μŠ€:
application/octet-stream μ‚¬μš© μ‹œ μ£Όμ˜μ‚¬ν•­: - λ°˜λ“œμ‹œ Buffer λ˜λŠ” Uint8Arrayλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€ - Content-Disposition ν—€λ”λ‘œ λ‹€μš΄λ‘œλ“œ 파일λͺ…을 μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€ - 파일λͺ…에 ν•œκΈ€μ΄ ν¬ν•¨λœ 경우 encodeURIComponent()둜 μΈμ½”λ”©ν•˜μ„Έμš” - λŒ€μš©λŸ‰ νŒŒμΌμ€ 슀트리밍 방식을 κ³ λ €ν•˜μ„Έμš”

clients

생성할 ν΄λΌμ΄μ–ΈνŠΈ νƒ€μž…μ„ μ§€μ •ν•©λ‹ˆλ‹€. κΈ°λ³Έκ°’: ["axios"]

guards

API μ ‘κ·Ό κΆŒν•œμ„ μ§€μ •ν•©λ‹ˆλ‹€.

description

API μ„€λͺ…을 μΆ”κ°€ν•©λ‹ˆλ‹€. μƒμ„±λœ νƒ€μž…κ³Ό λ¬Έμ„œμ— ν¬ν•¨λ©λ‹ˆλ‹€.

resourceName

μƒμ„±λ˜λŠ” μ„œλΉ„μŠ€ 파일의 λ¦¬μ†ŒμŠ€ 이름을 μ§€μ •ν•©λ‹ˆλ‹€.

timeout

API μš”μ²­μ˜ νƒ€μž„μ•„μ›ƒμ„ λ°€λ¦¬μ΄ˆ λ‹¨μœ„λ‘œ μ§€μ •ν•©λ‹ˆλ‹€.

cacheControl

μ‘λ‹΅μ˜ Cache-Control 헀더λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
CacheControlConfig νƒ€μž…:
μ‹œκ°„ ν‘œκΈ°: "10s", "5m", "1h", "1d" ν˜•μ‹ 지원

compress

응닡 μ••μΆ• 섀정을 μ§€μ •ν•©λ‹ˆλ‹€.

전체 μ˜΅μ…˜ μ˜ˆμ‹œ

경둜 생성 κ·œμΉ™

Model 클래슀

κ·œμΉ™:
  1. 클래슀 μ΄λ¦„μ—μ„œ β€œModelClass” 제거
  2. λ‚˜λ¨Έμ§€λ₯Ό camelCase둜 λ³€ν™˜
  3. /{modelName}/{methodName} ν˜•μ‹

Frame 클래슀

κ·œμΉ™:
  1. 클래슀 μ΄λ¦„μ—μ„œ β€œFrameClass” 제거
  2. λ‚˜λ¨Έμ§€λ₯Ό camelCase둜 λ³€ν™˜
  3. /{frameName}/{methodName} ν˜•μ‹

λ‹€λ₯Έ λ°μ½”λ ˆμ΄ν„°μ™€ ν•¨κ»˜ μ‚¬μš©

@transactional

@apiλ₯Ό λ¨Όμ €, @transactional을 λ‚˜μ€‘μ— μž‘μ„±ν•˜μ„Έμš”.

@cache

@upload

@upload은 @api 없이 λ…λ¦½μ μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

μ œμ•½μ‚¬ν•­

1. λ‹€λ₯Έ λΌμš°νŒ… λ°μ½”λ ˆμ΄ν„°(@stream, @websocket, @upload)와 쀑볡 μ‚¬μš© λΆˆκ°€

같은 λ©”μ„œλ“œμ— @api, @stream, @websocket, @upload 쀑 λ‘˜ 이상을 ν•¨κ»˜ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
μ—λŸ¬ λ©”μ‹œμ§€:

2. 같은 λ©”μ„œλ“œμ— μ—¬λŸ¬ 번 μ‚¬μš© μ‹œ

μ—¬λŸ¬ 번 μ‚¬μš©ν•˜λ©΄ λ§ˆμ§€λ§‰ 것이 μš°μ„ λ˜λ©°, μΆ©λŒν•˜λŠ” μ˜΅μ…˜μ΄ 있으면 μ—λŸ¬ λ°œμƒ:
μ—λŸ¬ λ©”μ‹œμ§€:

3. Model/Frame ν΄λž˜μŠ€μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯

μƒμ„±λ˜λŠ” μ½”λ“œ

@api λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€μŒμ΄ μžλ™ μƒμ„±λ©λ‹ˆλ‹€:

1. API 라우트 등둝

2. νƒ€μž… μ •μ˜ 생성

3. ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ 생성

Axios:
TanStack Query:

λ‘œκΉ…

@api λ°μ½”λ ˆμ΄ν„°λŠ” μžλ™μœΌλ‘œ 둜그λ₯Ό λ‚¨κΉλ‹ˆλ‹€:
λ‘œκ·ΈλŠ” LogTapeλ₯Ό 톡해 기둝되며, μΉ΄ν…Œκ³ λ¦¬λŠ” [model:user] λ˜λŠ” [frame:auth] ν˜•μ‹μž…λ‹ˆλ‹€.

μ˜ˆμ‹œ λͺ¨μŒ

λ‹€μŒ 단계

@stream

SSE 슀트리밍 API λ§Œλ“€κΈ°

@transactional

λ°μ΄ν„°λ² μ΄μŠ€ νŠΈλžœμž­μ…˜ μ‚¬μš©ν•˜κΈ°

@upload

파일 μ—…λ‘œλ“œ API λ§Œλ“€κΈ°

@cache

λ©”μ„œλ“œ κ²°κ³Ό μΊμ‹±ν•˜κΈ°