Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

ย 

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

openapi-multitarget-codegen

OpenAPI ์ŠคํŽ™์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ ์•„๋ž˜ 3๊ฐ€์ง€ ํƒ€๊นƒ์˜ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” npm ๋ฐฐํฌ์šฉ CLI ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.

  1. TypeScript Kubb
  2. Python ํƒ€์ž… ์ฝ”๋“œ
  3. LangGraph ๋„๊ตฌ ์ฝ”๋“œ

์ด ํŒจํ‚ค์ง€๋Š” ํŠน์ • ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์ „์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ ์ŠคํŽ™ ๊ฒฝ๋กœ๋Š” --input์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ์ถœ๋ ฅ ๋ฃจํŠธ ๊ฒฝ๋กœ๋Š” --output์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ ํƒ€๊นƒ์€ --target์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์ฆ‰, openapi/openapi.yaml, generated/... ๊ฐ™์€ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฒฝ๋กœ์— ๋ฌถ์ด์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ž…๋‹ˆ๋‹ค.


์„ค์น˜

dev dependency

npm install -D openapi-multitarget-codegen

๋˜๋Š”:

pnpm add -D openapi-multitarget-codegen

์ „์—ญ ์„ค์น˜

npm install -g openapi-multitarget-codegen

์‹คํ–‰ ๋ฐฉ๋ฒ•

  • dev dependency๋กœ ์„ค์น˜ํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ ํ˜•ํƒœ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”.
    • npx openapi-multitarget-codegen ...
    • pnpm exec openapi-multitarget-codegen ...
  • ์ „์—ญ ์„ค์น˜ํ•œ ๊ฒฝ์šฐ์—๋งŒ openapi-multitarget-codegen ... ๋ช…๋ น์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

  1. ์ŠคํŽ™ ์ตœ์†Œ ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹จ์ผ ํƒ€๊นƒ์œผ๋กœ ๋จผ์ € ์ƒ์„ฑํ•ด ๋ด…๋‹ˆ๋‹ค.
  3. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ํƒ€๊นƒ์„ ํ•œ ๋ฒˆ์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. Kubb ๊ณ ๊ธ‰ ์„ค์ •์ด ํ•„์š”ํ•  ๋•Œ๋งŒ --kubb-config ๋ชจ๋“œ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.
npx openapi-multitarget-codegen check-spec --input ./specs/openapi.yaml
npx openapi-multitarget-codegen generate --input ./specs/openapi.yaml --output ./generated --target kubb
npx openapi-multitarget-codegen generate --input ./specs/openapi.yaml --output ./generated --target kubb --target python --target langgraph

๋ฌธ์„œ


GitHub

  • Repository: https://github.com/kht2199/openapi-multitarget-codegen
  • Issues: https://github.com/kht2199/openapi-multitarget-codegen/issues

์ง€์› ํƒ€๊นƒ

1) kubb

OpenAPI ์ŠคํŽ™์œผ๋กœ๋ถ€ํ„ฐ TypeScript ํƒ€์ž… ๋ฐ fetch client๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

2) python

OpenAPI ์ŠคํŽ™์œผ๋กœ๋ถ€ํ„ฐ Python ํƒ€์ž… ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ถœ๋ ฅ ๋ชจ๋ธ ํƒ€์ž…์€ pydantic_v2.BaseModel์ž…๋‹ˆ๋‹ค.

3) langgraph

OpenAPI operation์„ ๊ธฐ์ค€์œผ๋กœ LangGraph/LangChain StructuredTool ์ดˆ์•ˆ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”:

  • LangGraph๋Š” ์ •์‹ ์ง€์› ํƒ€๊นƒ์ž…๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ๊ตฌํ˜„์ด ํŠน์ • ํŒŒ์ผ ๊ฒฝ๋กœ๋‚˜ ํŠน์ • ํ”„๋กœ์ ํŠธ ๋ ˆ์ด์•„์›ƒ์— ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  • ์ด CLI๋Š” LangGraph ํƒ€๊นƒ๋„ ๋‹ค๋ฅธ ํƒ€๊นƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ธ์ž ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

CLI ์‚ฌ์šฉ๋ฒ•

openapi-multitarget-codegen generate --input <spec> --output <dir> --target <kubb|python|langgraph> [--target ...]
openapi-multitarget-codegen check-spec --input <spec>

๊ณตํ†ต ์˜ต์…˜

  • --input <path> (ํ•„์ˆ˜): OpenAPI ํŒŒ์ผ ๊ฒฝ๋กœ (.yaml, .yml, .json)
  • --output <dir> (ํ•„์ˆ˜, generate ์ „์šฉ): ์ƒ์„ฑ ๊ฒฐ๊ณผ๋ฅผ ์“ธ ์ถœ๋ ฅ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ
  • --target <name> (ํ•„์ˆ˜, generate ์ „์šฉ): ์ƒ์„ฑ ํƒ€๊นƒ (kubb, python, langgraph)
    • ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด --target์„ ๋ฐ˜๋ณตํ•ด์„œ ๋„˜๊น๋‹ˆ๋‹ค.
  • --clean (generate ์ „์šฉ): ์ถœ๋ ฅ ๋ฃจํŠธ๋ฅผ ๋จผ์ € ๋น„์›๋‹ˆ๋‹ค.

check-spec ๋ฒ”์œ„

  • check-spec์€ ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€์™€ ๊ธฐ๋ณธ ๊ตฌ์กฐ(openapi, paths) ํ™•์ธ์— ๋”ํ•ด, OpenAPI ๋ฌธ์„œ๋ฅผ ์‹ค์ œ๋กœ parse/validate ํ•ฉ๋‹ˆ๋‹ค.
  • unresolved $ref, ์ž˜๋ชป๋œ ์Šคํ‚ค๋งˆ ๊ตฌ์กฐ, ๋ฌธ์„œ ์ˆ˜์ค€์˜ OpenAPI ์˜ค๋ฅ˜๋ฅผ ์กฐ๊ธฐ์— ์žก๋Š” ์šฉ๋„์ž…๋‹ˆ๋‹ค.
  • ๋‹ค๋งŒ target๋ณ„ ์ƒ์„ฑ๊ธฐ ํ˜ธํ™˜์„ฑ๊นŒ์ง€ ์ „๋ถ€ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฆ‰, kubb, python, langgraph ๊ฐ๊ฐ์˜ ์„ธ๋ถ€ ์ œ์•ฝ์€ ์‹ค์ œ generate ๋‹จ๊ณ„์—์„œ ์ถ”๊ฐ€ ํ™•์ธ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์˜ต์…˜

  • --python-model-type <type>
    • ๊ธฐ๋ณธ๊ฐ’: pydantic_v2.BaseModel
  • --kubb-output-dir <path>
    • ๊ธฐ๋ณธ๊ฐ’: <output>/kubb
    • ์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” --output ๊ธฐ์ค€์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.
    • --kubb-config์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • --kubb-format <mode>
    • ๊ธฐ๋ณธ๊ฐ’: false
    • preset ๋ชจ๋“œ์—์„œ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ํ—ˆ์šฉ๊ฐ’: auto, prettier, biome, oxfmt, false
    • ๊ธฐ๋ณธ๊ฐ’ false๋Š” Kubb ์ƒ์„ฑ์€ ์œ ์ง€ํ•˜๋˜ formatter ๋ฏธ์„ค์น˜๋กœ ์ธํ•œ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ฉ”์‹œ์ง€๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค.
    • --kubb-config์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • --python-output-file <path>
    • ๊ธฐ๋ณธ๊ฐ’: <output>/python/models.py
    • ์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” --output ๊ธฐ์ค€์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.
  • --langgraph-output-dir <path>
    • ๊ธฐ๋ณธ๊ฐ’: <output>/langgraph
    • ์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” --output ๊ธฐ์ค€์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.
  • --langgraph-file <name>
    • ๊ธฐ๋ณธ๊ฐ’: langgraph_tools.py
  • --kubb-client <client>
    • ๊ธฐ๋ณธ๊ฐ’: fetch
    • --kubb-config์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • --kubb-config <path>
    • Kubb native config ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋ชจ๋“œ์—์„œ๋Š” ํ•ด๋‹น config ํŒŒ์ผ์ด Kubb ์ƒ์„ฑ์— ๊ด€ํ•œ ์ž…๋ ฅ/์ถœ๋ ฅ/ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •์˜ source of truth๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
    • ๋‹ค๋งŒ ์ด ๋ž˜ํผ CLI ์ฐจ์›์—์„œ๋Š” --input, --output์„ ๊ณ„์† ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
    • --input์€ ์‚ฌ์ „ ๊ฒ€์ฆ์— ์‚ฌ์šฉ๋˜๊ณ , --output์€ --clean ์ฒ˜๋ฆฌ ๊ธฐ์ค€ ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.
    • ์ด ํŒจํ‚ค์ง€๋Š” ๋‚ด์žฅ preset์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  kubb generate --config ...๋ฅผ pass-through ํ•ฉ๋‹ˆ๋‹ค.
  • --kubb-arg <value>
    • ๋ฐ˜๋ณต ๊ฐ€๋Šฅ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.
    • --kubb-config์™€ ํ•จ๊ป˜๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ „๋‹ฌํ•œ ๊ฐ’์€ kubb generate ๋’ค์— ๊ทธ๋Œ€๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
    • ๊ฐ’์ด --watch, --logLevel์ฒ˜๋Ÿผ --๋กœ ์‹œ์ž‘ํ•˜๋ฉด --kubb-arg=--watch์ฒ˜๋Ÿผ = ํ˜•์‹์œผ๋กœ ์ „๋‹ฌํ•˜์„ธ์š”.

์ฃผ์˜: --kubb-output-dir, --python-output-file, --langgraph-output-dir์— ์ฃผ๋Š” ์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ --output ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

Kubb ์‚ฌ์šฉ ์ •์ฑ…

์ด CLI์˜ Kubb ์ง€์›์€ ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ธฐ๋ณธ preset ๋ชจ๋“œ
    • ์ด ํŒจํ‚ค์ง€์— ํฌํ•จ๋œ ๊ธฐ๋ณธ Kubb ๊ตฌ์„ฑ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ formatter ์„ค์ •์€ false์ž…๋‹ˆ๋‹ค.
    • formatter๋ฅผ ์ผœ๊ณ  ์‹ถ๋‹ค๋ฉด --kubb-format auto ๋˜๋Š” --kubb-format prettier ๊ฐ™์€ ์‹์œผ๋กœ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
    • ํ˜„์žฌ ํฌํ•จ๋œ ํ•ต์‹ฌ ์˜์กด์„ฑ:
      • @kubb/cli
      • @kubb/core
      • @kubb/plugin-oas
      • @kubb/plugin-ts
      • @kubb/plugin-client
  2. native config pass-through ๋ชจ๋“œ
    • --kubb-config๋ฅผ ์ฃผ๋ฉด ์‚ฌ์šฉ์ž์˜ ๊ธฐ์กด Kubb config๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • Kubb์˜ ์‹ค์ œ ์ž…๋ ฅ/์ถœ๋ ฅ/ํ”Œ๋Ÿฌ๊ทธ์ธ/formatter ์„ค์ •์€ config ํŒŒ์ผ ๋‚ด์šฉ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
    • ๋‹ค๋งŒ ์ด ๋ž˜ํผ CLI๋Š” --input, --output์„ ๊ณ„์† ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
    • --input์€ OpenAPI ํŒŒ์ผ ์‚ฌ์ „ ๊ฒ€์ฆ์— ์‚ฌ์šฉ๋˜๊ณ , --output์€ --clean ๊ธฐ์ค€ ๋ฃจํŠธ์ž…๋‹ˆ๋‹ค.
    • ์ด ๋ชจ๋“œ์—์„œ๋Š” --kubb-output-dir, --kubb-client, --kubb-format์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ์ด ๊ฒฝ์šฐ ์ถ”๊ฐ€ Kubb ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์†Œ๋น„์ž ํ”„๋กœ์ ํŠธ์—์„œ ์ง์ ‘ ์„ค์น˜/๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ด ํŒจํ‚ค์ง€๋Š” ๊ธฐ๋ณธ preset์— ํ•„์š”ํ•œ ํ•ต์‹ฌ Kubb ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ํฌํ•จํ•˜๊ณ , ๋‚˜๋จธ์ง€ Kubb ์ƒํƒœ๊ณ„๋Š” ๊ธฐ์กด Kubb CLI/config๋ฅผ ๊ทธ๋Œ€๋กœ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๋ฐฉํ–ฅ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

์ฃผ์˜: --clean์€ ํ•ญ์ƒ --output ๋ฃจํŠธ๋ฅผ ๋จผ์ € ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. --kubb-config ๋ชจ๋“œ์—์„œ๋Š” ์‹ค์ œ Kubb ์ถœ๋ ฅ ์œ„์น˜๊ฐ€ config ๋‚ด๋ถ€ ์„ค์ •๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์„ธ์š”.


๋น ๋ฅธ OpenAPI ์ž‘์„ฑ ํ…œํ”Œ๋ฆฟ

์•„๋ž˜ ํ…œํ”Œ๋ฆฟ์€ ์ด CLI๋กœ Kubb / Python / LangGraph ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•  ๋•Œ ์ตœ์†Œํ•œ์œผ๋กœ ๋ณต๋ถ™ํ•ด ์“ธ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๊ธฐ์ค€์€ docs/openapi-authoring-guide.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

openapi: 3.0.3
info:
  title: Example API
  version: 0.1.0
servers:
  - url: https://api.example.com
paths:
  /items:
    get:
      operationId: listItems
      summary: List items
      description: Retrieve the current item catalog.
      responses:
        '200':
          description: Successful item list response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Item'
    post:
      operationId: createItem
      summary: Create item
      description: Create a new catalog item from the supplied payload.
      requestBody:
        required: true
        description: Item payload to create.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateItemRequest'
      responses:
        '200':
          description: Item created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Item'
  /items/{itemId}:
    get:
      operationId: getItem
      summary: Get item by id
      description: Retrieve one catalog item using its identifier.
      parameters:
        - in: path
          name: itemId
          required: true
          description: Unique item identifier.
          schema:
            type: string
      responses:
        '200':
          description: Matching item response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Item'
components:
  schemas:
    Item:
      type: object
      description: Catalog item returned by the API.
      required: [id, name]
      properties:
        id:
          type: string
          description: Stable item identifier.
        name:
          type: string
          description: Display name of the item.
        description:
          type: string
          description: Optional human-readable item details.
    CreateItemRequest:
      type: object
      description: Payload for creating a catalog item.
      required: [name]
      properties:
        name:
          type: string
          description: Name to assign to the new item.
        description:
          type: string
          description: Optional explanatory text for the new item.

์ฒดํฌ ํฌ์ธํŠธ:

  • ๊ฐ operation์— operationId, summary, description์„ ๋„ฃ๊ธฐ
  • response description์„ ๋น„์›Œ๋‘์ง€ ์•Š๊ธฐ
  • parameter/property๋งˆ๋‹ค description์„ ๋„ฃ๊ธฐ
  • request/response schema๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด components.schemas๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ

์˜ˆ์‹œ

Kubb๋งŒ ์ƒ์„ฑ

npx openapi-multitarget-codegen generate \
  --input ./specs/openapi.yaml \
  --output ./generated \
  --target kubb

์˜ˆ์‹œ ์ถœ๋ ฅ ์œ„์น˜ (--output ./generated๋ฅผ ์ค€ ๊ฒฝ์šฐ):

  • ./generated/kubb/...

๊ธฐ์กด Kubb config ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ

npx openapi-multitarget-codegen generate \
  --input ./specs/openapi.yaml \
  --output ./generated \
  --target kubb \
  --kubb-config ./kubb.config.ts \
  --kubb-arg=--logLevel \
  --kubb-arg=info

์ด ๋ชจ๋“œ์—์„œ๋Š” kubb generate --config ./kubb.config.ts --logLevel info ํ˜•ํƒœ๋กœ pass-through ๋ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ Kubb ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”ํ•˜๋ฉด ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์†Œ๋น„์ž ํ”„๋กœ์ ํŠธ์—์„œ ์ง์ ‘ ์„ค์น˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. --input, --output์€ ์ด ๋ž˜ํผ CLI์˜ ์‚ฌ์ „ ๊ฒ€์ฆ ๋ฐ --clean ๊ธฐ์ค€์„ ์œ„ํ•ด ๊ณ„์† ํ•„์š”ํ•˜์ง€๋งŒ, Kubb config ๋‚ด๋ถ€์˜ ์‹ค์ œ input/output ์„ค์ •์„ ๋ฎ์–ด์“ฐ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Python ํƒ€์ž…๋งŒ ์ƒ์„ฑ

npx openapi-multitarget-codegen generate \
  --input ./specs/openapi.yaml \
  --output ./generated \
  --target python

๊ธฐ๋ณธ ๋ชจ๋ธ ํƒ€์ž…์€ pydantic_v2.BaseModel์ด๋ฏ€๋กœ ๊ธฐ๋ณธ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋Š” --python-model-type์„ ์ƒ๋žตํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ถœ๋ ฅ ์œ„์น˜ (--output ./generated๋ฅผ ์ค€ ๊ฒฝ์šฐ):

  • ./generated/python/models.py

์ถœ๋ ฅ ๊ฒฝ๋กœ๊นŒ์ง€ ์„ธ๋ถ„ํ™”ํ•ด์„œ ์ƒ์„ฑ

npx openapi-multitarget-codegen generate \
  --input ./specs/openapi.yaml \
  --output ./generated \
  --target kubb \
  --target python \
  --target langgraph \
  --kubb-output-dir ./sdk/ts \
  --python-output-file ./sdk/python/api_models.py \
  --langgraph-output-dir ./agent/tools \
  --langgraph-file catalog_tools.py

์œ„ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ./generated/sdk/ts/...
  • ./generated/sdk/python/api_models.py
  • ./generated/agent/tools/catalog_tools.py

์ฃผ์˜: ์œ„ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋“ค์€ ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ --output ./generated ๊ธฐ์ค€์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

LangGraph ์ฝ”๋“œ๋งŒ ์ƒ์„ฑ

npx openapi-multitarget-codegen generate \
  --input ./specs/openapi.yaml \
  --output ./generated \
  --target langgraph

์˜ˆ์‹œ ์ถœ๋ ฅ ์œ„์น˜ (--output ./generated๋ฅผ ์ค€ ๊ฒฝ์šฐ):

  • ./generated/langgraph/langgraph_tools.py

์—ฌ๋Ÿฌ ํƒ€๊นƒ ๋™์‹œ ์ƒ์„ฑ

npx openapi-multitarget-codegen generate \
  --input ./specs/openapi.yaml \
  --output ./generated \
  --target kubb \
  --target python \
  --target langgraph \
  --clean

์˜ˆ์‹œ ์ถœ๋ ฅ ์œ„์น˜ (--output ./generated๋ฅผ ์ค€ ๊ฒฝ์šฐ):

  • ./generated/kubb/...
  • ./generated/python/models.py
  • ./generated/langgraph/langgraph_tools.py

์ŠคํŽ™ ์œ ํšจ์„ฑ ํ™•์ธ

npx openapi-multitarget-codegen check-spec --input ./specs/openapi.yaml

์ด ๋ช…๋ น์€ ๋‹ค์Œ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  • ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€
  • ๊ธฐ๋ณธ ๊ตฌ์กฐ(openapi, paths) ์กด์žฌ ์—ฌ๋ถ€
  • OpenAPI ๋ฌธ์„œ parse/validate
  • unresolved $ref, ์ž˜๋ชป๋œ ์Šคํ‚ค๋งˆ ๊ตฌ์กฐ ๋“ฑ ๋ฌธ์„œ ์ˆ˜์ค€ ์˜ค๋ฅ˜

๋‹ค๋งŒ ์ด ๋‹จ๊ณ„๊ฐ€ kubb, python, langgraph ๊ฐ ํƒ€๊นƒ ์ƒ์„ฑ๊ธฐ์˜ ์„ธ๋ถ€ ํ˜ธํ™˜์„ฑ๊นŒ์ง€ ๋ชจ๋‘ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํƒ€๊นƒ๋ณ„ ์ œ์•ฝ์€ ์‹ค์ œ generate ๋‹จ๊ณ„์—์„œ ์ถ”๊ฐ€ ํ™•์ธ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ˜„์žฌ ์ถœ๋ ฅ ์ •์ฑ…

์ถœ๋ ฅ ๋ฃจํŠธ๋Š” --output์œผ๋กœ ๋ฐ›๊ณ , ์•„๋ฌด ์ถ”๊ฐ€ ์˜ต์…˜์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • kubb โ†’ <output>/kubb
  • python โ†’ <output>/python/models.py
  • langgraph โ†’ <output>/langgraph/<langgraph-file>

ํ•„์š”ํ•˜๋ฉด ์•„๋ž˜ ์˜ต์…˜์œผ๋กœ ํƒ€๊นƒ๋ณ„ ๊ฒฝ๋กœ๋ฅผ ๋” ์„ธ๋ถ„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • --kubb-output-dir
  • --python-output-file
  • --langgraph-output-dir

์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” ๋ชจ๋‘ --output ๊ธฐ์ค€์œผ๋กœ ํ•ด์„๋˜๊ณ , ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.


ํ˜„์žฌ ๊ตฌํ˜„ ํŠน์ง•

Kubb

  • ์ž„์‹œ Kubb config๋ฅผ ์ƒ์„ฑํ•ด์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ ์ŠคํŽ™ ๊ฒฝ๋กœ์™€ ์ถœ๋ ฅ ๊ฒฝ๋กœ๋ฅผ ๋™์ ์œผ๋กœ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ client๋Š” fetch์ž…๋‹ˆ๋‹ค.

Python

  • uvx --from datamodel-code-generator datamodel-codegen ... ๊ธฐ๋ฐ˜์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ ํƒ€์ž…์€ --python-model-type์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

LangGraph

  • OpenAPI operation์„ ์ˆœํšŒํ•˜๋ฉด์„œ StructuredTool ์ดˆ์•ˆ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • path/query/body๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ณธ ๊ณจ๊ฒฉ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ์ถœ๋ ฅ ํŒŒ์ผ๋ช…์€ --langgraph-file๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™œ ์ด ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•œ๊ฐ€

์‹ค๋ฌด์—์„œ๋Š” ๊ฐ™์€ OpenAPI ์ŠคํŽ™์„ ๊ธฐ์ค€์œผ๋กœ ์—ฌ๋Ÿฌ ์–ธ์–ด/ํ”„๋ ˆ์ž„์›Œํฌ์šฉ ์ฝ”๋“œ๋ฅผ ๋™์‹œ์— ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด:

  • ํ”„๋ก ํŠธ์—”๋“œ๋Š” TypeScript client๊ฐ€ ํ•„์š”ํ•˜๊ณ 
  • Python ์„œ๋ฒ„/์Šคํฌ๋ฆฝํŠธ๋Š” ํƒ€์ž… ๋ชจ๋ธ์ด ํ•„์š”ํ•˜๊ณ 
  • ์—์ด์ „ํŠธ ๊ณ„์ธต์€ LangGraph ๋„๊ตฌ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŒจํ‚ค์ง€๋Š” ๊ทธ๋Ÿฐ ์ƒํ™ฉ์—์„œ OpenAPI๋ฅผ ๋‹จ์ผ source of truth๋กœ ๋‘๊ณ , ์—ฌ๋Ÿฌ ํƒ€๊นƒ์„ ํ•˜๋‚˜์˜ CLI ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •๋ฆฌํ•˜๋Š” ๋ฐ ๋ชฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


์˜ˆ์ œ ๊ฒ€์ฆ ์Šคํฌ๋ฆฝํŠธ

์ €์žฅ์†Œ์—๋Š” ์˜ˆ์ œ ์ŠคํŽ™ ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

npm run check:example-spec
npm run generate:example:kubb
npm run generate:example:python
npm run generate:example:langgraph
npm run generate:example:all

์˜ˆ์ œ ์ถœ๋ ฅ์€ ./.tmp-output ์•„๋ž˜์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.


๋Ÿฐํƒ€์ž„ ์š”๊ตฌ์‚ฌํ•ญ

  • Node.js 20+
  • npm ๋˜๋Š” pnpm
  • Python 3.11+
  • uvx ์‚ฌ์šฉ ๊ฐ€๋Šฅ ํ™˜๊ฒฝ (python ํƒ€๊นƒ์šฉ, ์˜ˆ: brew install uv)

LangGraph ์ƒ์„ฑ ๊ฒฐ๊ณผ๋ฅผ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋ณ„๋„๋กœ ์•„๋ž˜ Python ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • httpx
  • pydantic
  • langchain-core

์•„์ง ๋‚จ์•„ ์žˆ๋Š” ํ™•์žฅ ํฌ์ธํŠธ

ํ–ฅํ›„ ์•„๋ž˜ ํ•ญ๋ชฉ์€ ๋” ๋ฐœ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Kubb์˜ React Query / Zod / MSW ํ™•์žฅ ์˜ต์…˜
  • Python ์ถœ๋ ฅ์˜ dataclass / TypedDict preset ๋‹จ์ˆœํ™”
  • LangGraph naming / auth / filtering ์ „๋žต ์˜ต์…˜ํ™”
  • spec lint/report ์ „์šฉ ๋ช…๋ น ์ถ”๊ฐ€
  • dry-run / overwrite ์ •์ฑ… ์˜ต์…˜

ํ•œ ์ค„ ์š”์•ฝ

openapi-multitarget-codegen์€ OpenAPI ์ŠคํŽ™์„ ์ž…๋ ฅ๋ฐ›์•„ Kubb, Python ํƒ€์ž…, LangGraph ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ธ์ž ๊ธฐ๋ฐ˜ npm CLI ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages