๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring

[OAS] Swagger Codegen ํ•„์š”์„ฑ (With. Spring Boot)

by ํ‘์‹œ๋ฐ” 2024. 12. 26.

๐Ÿ“— ์„ค๊ณ„ ์šฐ์„  ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ OAS!

์„ค๊ณ„ ์šฐ์„  ์ ‘๊ทผ ๋ฐฉ์‹(Design-First Approach)์€ API ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ API์˜ ์„ค๊ณ„๋ฅผ ๋จผ์ € ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„์„ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ API์˜ ๋ช…ํ™•ํ•œ ์ •์˜์™€ ๋ฌธ์„œํ™”๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์›ํ™œํ•˜๊ฒŒ ํ•˜๊ณ , API์˜ ์ผ๊ด€์„ฑ๊ณผ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๋ฐ ์ค‘์ ์„ ๋‘”๋‹ค.

 

OpenAPI Specification(OAS)์€ RESTful API๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ํ™”๋œ ํ˜•์‹์ด๋‹ค. OAS๋Š” API์˜ ์—”๋“œํฌ์ธํŠธ, HTTP ๋ฉ”์„œ๋“œ, ์š”์ฒญ ๋ฐ ์‘๋‹ต ํ˜•์‹, ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋“ฑ์„ JSON ๋˜๋Š” YAML ํ˜•์‹์œผ๋กœ ๊ธฐ์ˆ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. OAS๋Š” API์˜ ์„ค๊ณ„, ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ฌธ์„œํ™”, ์œ ์ง€๋ณด์ˆ˜ ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ๊ณ„์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, API์˜ ์ผ๊ด€์„ฑ๊ณผ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

 

์„ค๊ณ„ ์šฐ์„  ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ OAS๋Š” API ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์„œ๋กœ๋ฅผ ๋ณด์™„ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์„ค๊ณ„ ์šฐ์„  ์ ‘๊ทผ ๋ฐฉ์‹์€ API์˜ ๊ตฌ์กฐ์™€ ๋™์ž‘์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž์™€ ์ดํ•ด๊ด€๊ณ„์ž ๊ฐ„์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์›ํ™œํ•˜๊ฒŒ ํ•œ๋‹ค. OAS๋Š” ์ด๋Ÿฌํ•œ ์ •์˜๋ฅผ ํ‘œ์ค€ํ™”๋œ ํ˜•์‹์œผ๋กœ ๋ฌธ์„œํ™”ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด API์˜ ์ผ๊ด€์„ฑ๊ณผ ํ’ˆ์งˆ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด API ๊ฐœ๋ฐœ์˜ ํšจ์œจ์„ฑ๊ณผ ํ’ˆ์งˆ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“— Swagger Codegen?

Swagger Codegen์€ OpenAPI Specification(OAS) ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋งž๋Š” ํด๋ผ์ด์–ธํŠธ SDK, ์„œ๋ฒ„ ์Šคํ…, ๋ฌธ์„œ ๋“ฑ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค. Spring Boot์™€ ๊ฒฐํ•ฉํ•˜์—ฌ Swagger Codegen์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

1. ์ž๋™ํ™”๋œ ์„œ๋ฒ„ ์Šคํ… ์ƒ์„ฑ

Swagger Codegen์„ ์‚ฌ์šฉํ•˜๋ฉด OpenAPI ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Spring Boot ์„œ๋ฒ„ ์Šคํ…์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋ฐ˜๋ณต์ ์ด๊ณ  ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๋Š” ์ž‘์—…์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ฒ„ ์Šคํ…์€ API ์—”๋“œํฌ์ธํŠธ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์ผ๊ด€๋œ API ๋ฌธ์„œํ™”

OpenAPI Specification์€ API๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฌธ์„œํ™”ํ•˜๋Š” ํ‘œ์ค€์ด๋‹ค. Swagger Codegen์„ ์‚ฌ์šฉํ•˜๋ฉด OpenAPI ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ผ๊ด€๋œ API ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž์™€ ์‚ฌ์šฉ์ž ๋ชจ๋‘ API๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, API ๋ฌธ์„œ์™€ ์‹ค์ œ ๊ตฌํ˜„ ๊ฐ„์˜ ๋ถˆ์ผ์น˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

3. ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘

Swagger Codegen์„ ์‚ฌ์šฉํ•˜๋ฉด API์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” API ์„ค๊ณ„๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ฆํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ API์˜ ๊ตฌ์กฐ์™€ ๋™์ž‘์„ ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค. Spring Boot์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

4. ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด์„ฑ

Swagger Codegen์„ ์‚ฌ์šฉํ•˜๋ฉด API ๋ฌธ์„œ์™€ ์ฝ”๋“œ๊ฐ€ ํ•ญ์ƒ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. API๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค OpenAPI ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  Swagger Codegen์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ์ตœ์‹  ์ƒํƒœ์˜ ์„œ๋ฒ„ ์Šคํ…์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•ด์ง€๊ณ , ์ฝ”๋“œ์™€ ๋ฌธ์„œ ๊ฐ„์˜ ๋ถˆ์ผ์น˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

5. ํ˜‘์—… ํ–ฅ์ƒ

Swagger Codegen์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž, QA, ๋ฌธ์„œ ์ž‘์„ฑ์ž ๋“ฑ ๋‹ค์–‘ํ•œ ํŒ€ ๊ตฌ์„ฑ์› ๊ฐ„์˜ ํ˜‘์—…์ด ํ–ฅ์ƒ๋œ๋‹ค. OpenAPI ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์™€ ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ํŒ€ ๊ตฌ์„ฑ์›๋“ค์ด API์˜ ๋™์ž‘์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ์›ํ™œํ•ด์ง€๊ณ , ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

6. ํ…Œ์ŠคํŠธ ์ž๋™ํ™”

Swagger Codegen์„ ์‚ฌ์šฉํ•˜๋ฉด API ํ…Œ์ŠคํŠธ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋™ ์ƒ์„ฑ๋œ ํด๋ผ์ด์–ธํŠธ SDK๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด API์˜ ๋™์ž‘์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋†’์ด๊ณ , API์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

7. ๋‹ค์–‘ํ•œ ์–ธ์–ด ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›

Swagger Codegen์€ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋งž๋Š” ํด๋ผ์ด์–ธํŠธ SDK๋‚˜ ์„œ๋ฒ„ ์Šคํ…์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Spring Boot ์„œ๋ฒ„ ์Šคํ…์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ JavaScript, Python, Ruby ๋“ฑ ๋‹ค์–‘ํ•œ ์–ธ์–ด์— ๋งž๋Š” ํด๋ผ์ด์–ธํŠธ SDK๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

8. ํ‘œ์ค€ํ™”๋œ API ์„ค๊ณ„

OpenAPI Specification์„ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ์„ค๊ณ„ํ•˜๋ฉด ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ API๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด API์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋‚˜ ํŒ€๊ณผ์˜ ํ˜‘์—…์ด ์šฉ์ดํ•ด์ง„๋‹ค. Swagger Codegen์€ ์ด๋Ÿฌํ•œ ํ‘œ์ค€ํ™”๋œ API ์„ค๊ณ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, API์˜ ํ’ˆ์งˆ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

9. ๊ฐœ๋ฐœ ์†๋„ ํ–ฅ์ƒ

Swagger Codegen์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ์ˆ˜์ž‘์—…์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ํ–ฅ์ƒ๋œ๋‹ค. Spring Boot์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์„œ๋ฒ„ ์Šคํ…์„ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋” ๋น ๋ฅด๊ฒŒ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ , ์ œํ’ˆ ์ถœ์‹œ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด์™€ ๊ฐ™์ด Spring Boot์—์„œ Swagger Codegen์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™ํ™”๋œ ์ฝ”๋“œ ์ƒ์„ฑ, ์ผ๊ด€๋œ API ๋ฌธ์„œํ™”, ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘, ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด์„ฑ, ํ˜‘์—… ํ–ฅ์ƒ, ํ…Œ์ŠคํŠธ ์ž๋™ํ™”, ๋‹ค์–‘ํ•œ ์–ธ์–ด ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›, ํ‘œ์ค€ํ™”๋œ API ์„ค๊ณ„, ๊ฐœ๋ฐœ ์†๋„ ํ–ฅ์ƒ ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” API ๊ฐœ๋ฐœ์˜ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ณ , ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

REFERENCE

https://swagger.io/docs/open-source-tools/swagger-codegen/codegen-v3/about/

https://swagger.io/blog/code-first-vs-design-first-api/

https://www.baeldung.com/spring-boot-openapi-api-first-development

๋Œ“๊ธ€