Swagger, API document automation

GEONNYΒ·2024λ…„ 8μ›” 12일

Building-API

λͺ©λ‘ 보기
20/28
post-thumbnail

πŸ“ŒSwagger

API λ¬Έμ„œ μžλ™ν™” 라이브러리인 Swagger 에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μŠ€μ›¨κ±°(Swagger)λŠ” κ°œλ°œμžκ°€ REST μ›Ή μ„œλΉ„μŠ€λ₯Ό 섀계, λΉŒλ“œ, λ¬Έμ„œν™”, μ†ŒλΉ„ν•˜λŠ” 일을 λ„μ™€μ£ΌλŠ” λŒ€ν˜• 도ꡬ μƒνƒœκ³„μ˜ 지원을 λ°›λŠ” μ˜€ν”ˆ μ†ŒμŠ€ μ†Œν”„νŠΈμ›¨μ–΄ ν”„λ ˆμž„μ›Œν¬μ΄λ‹€. λŒ€λΆ€λΆ„μ˜ μ‚¬μš©μžλ“€μ€ μŠ€μ›¨κ±° UI 도ꡬλ₯Ό 톡해 μŠ€μ›¨κ±°λ₯Ό μ‹λ³„ν•˜λ©° μŠ€μ›¨κ±° νˆ΄μ…‹μ—λŠ” μžλ™ν™”λœ λ¬Έμ„œν™”, μ½”λ“œ 생성, ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 생성 지원이 ν¬ν•¨λœλ‹€.

wikipedia 에 λ‚˜μ™€ μžˆλŠ” μ„€λͺ…μž…λ‹ˆλ‹€. 말 κ·ΈλŒ€λ‘œ API 에 λŒ€ν•œ Operation λ¬Έμ„œλ₯Ό μ›ΉμœΌλ‘œ μ œκ³΅ν•΄ μ£ΌλŠ” ν”„λ ˆμž„μ›Œν¬ μž…λ‹ˆλ‹€.

πŸ“ŒSwagger 의 ν•„μš”μ„±

APIκ°€ 개발되면 ν΄λΌμ΄μ–ΈνŠΈκ°€ ν™œμš©ν•  수 μžˆλ„λ‘ μΈν„°νŽ˜μ΄μŠ€ μ •μ˜μ„œλ₯Ό λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€. Operation 의 μ’…λ₯˜μ™€ μˆ˜μš©ν•  수 μžˆλŠ” λ§€κ°œλ³€μˆ˜μ™€ νƒ€μž…, 응닡 λ°μ΄ν„°μ˜ ꡬ쑰와 νƒ€μž… 등을 μƒμ„Έν•˜κ²Œ μ œκ³΅ν•΄μ•Ό ν΄λΌμ΄μ–ΈνŠΈκ°€ 효율적으둜 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 이런 λ‚΄μš©λ“€μ΄ ν¬ν•¨λœ λ¬Έμ„œλ₯Ό λ§Œλ“€κ³  배포해야 ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ¬Έμ„œ 배포 방식은 지속적인 관리가 μ–΄λ ΅κ³ , μ΄λ‘œμΈν•΄ λ¬Έμ„œμ™€ μ‹€μ œ API κ°„ 뢈일치 λ¬Έμ œκ°€ 자주 λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.
μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜λ©΄μ„œλ„ μ •ν™•ν•œ 정보λ₯Ό μ œκ³΅ν•  수 있게 κ³ μ•ˆλœ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ Swagger μž…λ‹ˆλ‹€.

πŸ“ŒSwagger 의 μž₯점

πŸ“μžλ™ν™”λœ λ¬Έμ„œν™”

Operation 만 μΆ”κ°€ν•˜λ©΄ μžλ™μœΌλ‘œ Swagger에 μ μš©λ©λ‹ˆλ‹€.

πŸ“κ°œλ°œμž κ°„μ˜ μ˜μ‚¬μ†Œν†΅ ν–₯상

Operation 각각 μ„€λͺ…을 μΆ”κ°€ν•  수 있고, 응닡, μš”μ²­ 객체가 μžλ™ μ„€μ •λ˜κ³ , μ»€μŠ€ν…€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“μΌκ΄€μ„± μžˆλŠ” API λͺ…μ„Έ

μžλ™μœΌλ‘œ λ¬Έμ„œν™” 되기 λ•Œλ¬Έμ— μ½”λ“œ μˆ˜μ •λ§ŒμœΌλ‘œλ„ 일관성 μžˆλŠ” λͺ…μ„Έκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

πŸ“ŒSwagger 의 단점

πŸ“μ΄ˆκΈ° μ„€μ •μ˜ λ³΅μž‘μ„±

πŸ“ŒSwagger μ„€μ • 방법

πŸ“Dependency μΆ”κ°€

springdoc openapi starter maven 을 κ²€μƒ‰ν•˜μ—¬ μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0'

springfox 의 swagger λŠ” 2020λ…„ 이후 μ—…λ°μ΄νŠΈκ°€ μ—†κΈ° λ•Œλ¬Έμ— ν˜„μž¬μ—λ„ ν™œλ°œνžˆ μ—…λ°μ΄νŠΈκ°€ μ΄λ£¨μ–΄μ§€λŠ” springdoc 의 μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.
λ‹¨μˆœνžˆ μ˜μ‘΄μ„± μΆ”κ°€λ§ŒμœΌλ‘œλ„ swagger page 에 접속이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
http://localhost:13713/my-api/swagger-ui/index.html URI λ₯Ό λΈŒλΌμš°μ €μ— μž…λ ₯ν•΄λ΄…λ‹ˆλ‹€.

Swagger site κ°€ μ—°κ²°λ˜κ³ , 이전에 μž‘μ„±ν•˜μ˜€λ˜ Operation λͺ©λ‘μ΄ ν‘œμΆœλ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“application.yml μ„€μ • μΆ”κ°€

application.yml 에 Swagger κ΄€λ ¨ν•œ μ£Όμš” 섀정을 μΆ”κ°€ν•˜κ² μŠ΅λ‹ˆλ‹€.

springdoc:
  api-docs:
    path: /api-docs
  default-consumes-media-type: application/json
  default-produces-media-type: application/json
  swagger-ui:
    path: /swagger-ui.html
    operations-sorter: alpha
    tags-sorter: alpha
    display-request-duration: true
    doc-expansion: none
    display-operation-id: true
    filter: true

🎈springdoc.api-docs.path

API 에 λŒ€ν•œ 정보λ₯Ό Json type 으둜 μ „λ‹¬ν•˜λŠ” api-docs 의 μ£Όμ†Œλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. API 에 λŒ€ν•œ λͺ¨λ“  정보λ₯Ό ν¬ν•¨ν•˜κΈ° λ•Œλ¬Έμ— λ‹€μ–‘ν•œ κΈ°λŠ₯ κ΅¬ν˜„μ— ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

🎈default-consumes-media-type, default-produces-media-type

κΈ°λ³Έ 응닡 Operation 의 μš”μ²­, 응닡 νƒ€μž…μ„ μ„€μ •ν•©λ‹ˆλ‹€. 아무 섀정이 없을 경우 default media type 을 μ°Έκ³ ν•©λ‹ˆλ‹€.

🎈swagger-ui.path

swagger 접속 μ£Όμ†Œλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. μ„€μ •ν•œ URI μž…λ ₯ μ‹œ index page 둜 redirect λ©λ‹ˆλ‹€.

🎈operations.sorter

operation을 μ •λ ¬ μˆœμ„œλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. alpha : μ•ŒνŒŒλ²³ 순으둜 μ •λ ¬ 와 method : HTTP method 순으둜 μ •λ ¬ λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

alpha

method (Delete -> Get -> Post -> Put)

🎈tags-sorter

tag λͺ…을 μ •λ ¬ ν•©λ‹ˆλ‹€. default λŠ” Swagger-UI 에 μ˜ν•΄ κ²°μ •λœ μˆœμ„œ(μ½ν˜€μ§„μˆœμ„œ 인것 κ°™λ„€μš”) 이고 alpha μ˜΅μ…˜μœΌλ‘œ μ•ŒνŒŒλ²³μˆœμœΌλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€.

🎈display-request-duration

응닡에 κ±Έλ¦° μˆœμ„œλ‘œ default λŠ” false 이며 true μ„€μ •μ‹œ API μš”μ²­μ— κ±Έλ¦° μ‹œκ°„μ΄ ν‘œμΆœλ©λ‹ˆλ‹€.

🎈doc-expansion

tag λ₯Ό Operation이 μ—΄λ¦°μƒνƒœλ‘œ μ‘°νšŒν•  것인가에 λŒ€ν•œ μ˜΅μ…˜μ΄κ³ , default λŠ” list 둜 tag만 μ—΄λ¦° μƒνƒœλ‘œ ν‘œμΆœλ©λ‹ˆλ‹€. 이외, full : operation κΉŒμ§€ μ—΄λ¦°μƒνƒœλ‘œ ν‘œμΆœ, none : 전체 λ‹«νžŒ μƒνƒœλ‘œ ν‘œμΆœ 이 μžˆμŠ΅λ‹ˆλ‹€.

🎈display-operation-id

λ‹€μŒμ— μ„€μ •ν•΄λ³Ό operation-id 의 ν‘œμΆœμ—¬λΆ€ μ„€μ • μ˜΅μ…˜μž…λ‹ˆλ‹€. 기본적으둜 ν•΄λ‹Ή Method λͺ…이 ν‘œμΆœλ˜μ§€λ§Œ true μ„€μ •ν•˜κ³  @Operation에 operationId 속성을 μΆ”κ°€ν•˜λ©΄ operation-idκ°€ ν‘œμΆœλ©λ‹ˆλ‹€.

🎈filter

tagλ₯Ό κ²€μƒ‰ν• μˆ˜ μžˆμ„ μ˜μ—­μ„ μΆ”κ°€ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€. default λŠ” false 이고 ture μž…λ ₯ μ‹œ filtering 을 ν• μˆ˜ μžˆλŠ” μ˜μ—­μ΄ Swagger page 상단에 μΆ”κ°€λ©λ‹ˆλ‹€.

🎈enable

Swagger 에 접속여뢀λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. false μ˜΅μ…˜ μ„€μ • μ‹œ 접속이 λΆˆκ°€ν•©λ‹ˆλ‹€. profile μ„€μ •μœΌλ‘œ prod μ„€μ •μ‹œμ—λŠ” 접속할 수 μ—†κ²Œ μ„€μ •ν•©λ‹ˆλ‹€. default λŠ” true

---
spring:
  config:
    activate:
      on-profile: prod
springdoc:
  swagger-ui:
    enabled: false

πŸ“šμ°Έκ³ 

πŸ“• Spring μ„€μ • νŒŒμΌμ„ ν†΅ν•œ Swagger μ„€μ •

application.yml νŒŒμΌμ„ ν†΅ν•œ λ‹€λ₯Έ μ˜΅μ…˜ 섀정은 Link λ₯Ό ν™•μΈν•˜μ„Έμš”!

πŸ“™ 상세 섀계

μƒμ„Έν•œ μ„€κ³„λŠ” λ‹€μŒ μž‘μ„± κΈ€ μ°Έκ³ ~

profile
Back-end developer

0개의 λŒ“κΈ€