๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ํ”„๋กœ์ ํŠธ/๐Ÿ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๐Ÿ 

[Spring] (MAC, IntelliJ, vue.js) OpenAPI์ธ Swagger ์ ์šฉํ•˜๊ณ  YAML ์ž‘์„ฑํ•ด๋ณด๊ธฐ.

by ._.sori 2025. 7. 17.

 

 

Swgger๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ
REST API๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.
๐Ÿ 

 

 


1. Swagger๋ž€?

2. Swagger ๋“ฑ๋กํ•˜๊ธฐ

3. Swagger ์ž‘์„ฑ ๋ฐฉ๋ฒ•

4. YAML์œผ๋กœ ์ž‘์„ฑํ•ด ๋ณด๊ธฐ

5. ๋งˆ๋ฌด๋ฆฌ


 

 

 

 

1. Swagger๋ž€?

 

Swagger๋Š” REST API๋ฅผ ์„ค๋ช…ํ•˜๊ณ , ๋ฌธ์„œํ™”ํ•˜๊ณ , ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค. Swagger๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋งŒ๋“  API์˜ ๋ช…์„ธ์„œ๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ฑฐ๋‚˜ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. ์ด๋•Œ Swagger๋Š” OpenAPI Specification์ด๋ผ๋Š” ํ‘œ์ค€ ๋ช…์„ธ์„œ ํฌ๋งท์„ ์‚ฌ์šฉํ•œ๋‹ค. (๊ทธ๋ž˜์„œ์ผ๊นŒ, OpenAPI๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋“ฏํ•˜๋‹ค.)

 

 

 


 

 

 

 

2. Swagger ๋“ฑ๋กํ•˜๊ธฐ.

 

โ–ก build.gradle์— ๋“ค์–ด๊ฐ€๊ธฐ.

 

 

โ–ก dependencies์— ์ฝ”๋“œ ๋“ฑ๋กํ•˜๊ธฐ.

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

 

 

โ–ก ์ฝ”๋ผ๋ฆฌ ๋ˆŒ๋Ÿฌ์„œ ๋‹ค์‹œ gradle ํ•˜๊ธฐ.

  • ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

 

  • ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

 

 

โ–ก ์ฃผ์†Œ์ฐฝ ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

  • ์ฃผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์†Œ๋Š” http://localhost:8080/swagger-ui/index.html ์ด๋‹ค.
http://localhost:8080/swagger-ui.html
http://localhost:8080/swagger-ui/index.html
http://localhost:8080/swagger-ui/

 

 

โ–ก ๊ฒฐ๊ณผ

 

 

 


 

 

 

 

3. Swagger ์ž‘์„ฑ ๋ฐฉ๋ฒ•

 

โ–ก ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ DTO ์ฝ”๋“œ์— ์ฃผ์„(@Operation)์œผ๋กœ ์„ค๋ช… ์ถ”๊ฐ€ํ•˜๊ธฐ.

  • ์ฝ”๋“œ์™€ ๋ช…์„ธ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ญ์ƒ ์ผ์น˜ํ•œ๋‹ค.
  • ์ฝ”๋“œ๋งŒ ๋ฐ”๊ฟ”๋„ ๋ช…์„ธ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐฑ์‹ ๋œ๋‹ค.
  • ๊ด€๋ฆฌ๊ฐ€ ํŽธํ•˜๊ณ , ํŒ€ ๋‚ด ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋น„์šฉ์ด ๋‚ฎ๋‹ค.
@Operation(summary = "ํšŒ์›๊ฐ€์ž…", description = "์‹ ๊ทœ ์‚ฌ์šฉ์ž๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.")
@PostMapping("/api/join")
public UserResponse join(@RequestBody...) {
}

 

 

โ–ก yaml/json ํŒŒ์ผ๋กœ ์ง์ ‘ ๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

  • ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ๊ฐ€ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ฌธ์„œ๋งŒ ๊ณต์œ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ์–ธ์–ด, ํŒ€์—์„œ ๋™์‹œ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋”ฐ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
openapi: 3.0.0
info:
  title: join-web
  version: 1.0.0
paths:
  /api/join:
    post:
      summary: ํšŒ์›๊ฐ€์ž…
      ...

 

 

โ–ก ๋‘˜์„ ํ˜ผํ•ฉํ•˜๋Š” ๋ฐฉ์‹

  • ์ดˆ๊ธฐ API ์„ค๊ณ„ ๋‹จ๊ณ„์—๋Š” yaml ๋“ฑ์œผ๋กœ ์ดˆ์•ˆ์„ ๋งŒ๋“ ๋‹ค.
  • ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์ฝ”๋“œ๋กœ ์ฃผ์„์„ ๋” ์ƒ์„ธํžˆ ๋‹ค๋Š” ์‹์œผ๋กœ ํ˜ผํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 


 

 

 

 

4. yaml์œผ๋กœ ์ž‘์„ฑํ•ด ๋ณด๊ธฐ. 

 

์ฃผ์„์œผ๋กœ ๋‹ค๋Š” ๊ฒƒ๊ณผ yaml์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ ๋ชจ๋‘ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. ์‹ค๋ฌด์—์„œ ์–ด๋–ค ๊ฑธ ๋” ์„ ํ˜ธํ• ์ง€ ๋ชจ๋ฅด๊ธฐ๋„ ํ•˜๊ณ , ํ•œ ๋ฒˆ๋„ ๊ฒช์–ด๋ณธ ์  ์—†์œผ๋‹ˆ ๋‘˜ ๋‹ค ํ•˜๋ฉด์„œ ๋ฌด์—‡์ด ๋” ํŽธ๋ฆฌํ•˜๊ณ  ๊ฐ ๋ฐฉ๋ฒ•์— ์–ด๋–ค ์ด์ ์ด ์žˆ๋Š”์ง€ ์ง์ ‘ ๋А๊ปด๋ณผ ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  ์ฒ˜์Œ ํ•ด๋ณด๋Š” ๊ฑฐ๋ผ ํ›„์— ๋ณ€๊ฒฝ๋  ๋‚ด์šฉ๊ณผ ์ž˜๋ชป๋œ ๋‚ด์šฉ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. 

 

 

โ–ก ํšŒ์›๊ฐ€์ž… ๊ด€๋ จ ์ฝ”๋“œ

  • ์ผ๋‹จ ํšŒ์›๊ฐ€์ž…๋งŒ ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ yaml์œผ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค.
  • ํ•ด๋‹น ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์ „ docs ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
  • docs ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” src์™€ ๊ฐ™์€ ์œ„์น˜์— ์žˆ๊ณ , docs์—์„œ File์„ ์—ด์–ด openapi.yaml์ด๋ผ๊ณ  ์ž‘์„ฑํ–ˆ๋‹ค.

openapi: 3.0.1
info:
  title: ํšŒ์›๊ฐ€์ž… API
  version: 1.0.0
paths:
  /api/register:
    post:
      summary: ํšŒ์›๊ฐ€์ž…
      description: ์ด๋ฆ„, ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ „ํ™”๋ฒˆํ˜ธ, ์ƒ๋…„์›”์ผ, ์ด๋ฉ”์ผ์„ ๋ฐ›๋Š”๋‹ค.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - userid
                - password
                - passwordConfirm
                - phone
                - birth
                - email
              properties:
                name:
                  type: string
                  description: ์ด๋ฆ„
                userid:
                  type: string
                  description: ์•„์ด๋””
                password:
                  type: string
                  format: password
                  description: ๋น„๋ฐ€๋ฒˆํ˜ธ
                passwordConfirm:
                  type: string
                  format: password
                  description: ๋น„๋ฐ€๋ฒˆํ˜ธํ™•์ธ
                phone:
                  type: string
                  description: ์ „ํ™”๋ฒˆํ˜ธ
                birth:
                  type: string
                  format: date
                  description: ์ƒ๋…„์›”์ผ(๋ณ€๋™๊ฐ€๋Šฅ์„ฑ์žˆ์Œ)
                email:
                  type: string
                  format: email
                  description: ์ด๋ฉ”์ผ

      responses:
        '200':
          description: ๊ฐ€์ž… ์„ฑ๊ณต
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                    example: success
                  id:
                    type: integer
                    example: 1
                  message:
                    type: string
                    example: ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

        '400':
          description: ๊ฐ€์ž… ์‹คํŒจ
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                    example: fail
                  message:
                    type: string
                    example: ์•„์ด๋””๊ฐ€ ์ค‘๋ณต์ž…๋‹ˆ๋‹ค or ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

 

 

โ–ก ํ‚ค์›Œ๋“œ ์‚ดํŽด๋ณด๊ธฐ. (์ฐธ๊ณ ๋กœ ์„ค๋ช…์ด ์™„๋ฒฝํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค)

  • ๋ช…์„ธ์„œ ์ž‘์„ฑ ์‹œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ YAML ํ‚ค์›Œ๋“œ์ด๋‹ค.
  • ์—ฌ๊ธฐ์— ์ ํžŒ ํ‚ค์›Œ๋“œ ์ค‘ ํ•„์š”ํ•œ ํ‚ค์›Œ๋“œ๋งŒ ์ž‘์„ฑํ•œ๋‹ค.
YAML ํ‚ค์›Œ๋“œ ์˜๋ฏธ
paths API ์—”๋“œํฌ์ธํŠธ ๊ฒฝ๋กœ๋ฅผ ์ ๋Š”๋‹ค.
summary ํ•ด๋‹น ๊ฒฝ๋กœ์—์„œ ๋ฌด์Šจ ์ผ์„ ํ•˜๋Š”์ง€ ์š”์•ฝํ•˜์—ฌ ์ ์–ด๋‘”๋‹ค.
description summary๋Š” ์š”์•ฝํ•ด์„œ ์ ์—ˆ์œผ๋ฉด description์€ ์–ด๋–ค ๋‚ด์šฉ์ธ์ง€ ์ž์„ธํ•˜๊ฒŒ ์ ๋Š”๋‹ค.
requestBody request๋ฅผ ๋ณด๋‚ผ ๋•Œ Body์— ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”์ง€ ์ •์˜ํ•œ๋‹ค. POST, PUT ๋“ฑ Body๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ required: true๋ผ๊ณ  ์ž‘์„ฑํ•œ๋‹ค.
content Body ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ํƒ€์ž…์œผ๋กœ ์˜ค๊ฐ€๋Š”์ง€ ์ •ํ•œ๋‹ค. json์ด๋ฉด application/json์œผ๋กœ ์ ๊ณ  form์ด๋ฉด application/x-www-form-urlencoded ๋˜๋Š” multipart/form-data๋กœ ์ ๋Š”๋‹ค.
schema Body์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ ๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ํšŒ์›๊ฐ€์ž…์˜ ๊ฒฝ์šฐ ์ด๋ฆ„, email, ์ „ํ™”๋ฒˆํ˜ธ ๋“ฑ ์ด๋Ÿฐ ๊ฒƒ๋“ค์ด Body์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.
properties ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์ ๋Š”๋‹ค.
format ๊ธฐ๋ณธ ํƒ€์ž…๋ณด๋‹ค ๋” ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์„ ๋ช…์‹œํ•œ๋‹ค.
$ref ์ด๋ฏธ ์ •์˜ํ•ด๋‘” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ฐธ์กฐํ•ด์„œ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
example ๊ฐ’์˜ ์˜ˆ์‹œ๋ฅผ ์ ๋Š”๋‹ค.
reponses ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.

 

 

  • format์€ type๋งŒ์œผ๋กœ ๋ถ€์กฑํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์ฒด์ ์ธ ํ˜•์‹์„ ์ถ”๊ฐ€๋กœ ๋ช…์‹œํ•œ๋‹ค.
format ๊ตฌ์ฒด์ ์ธ ํ˜•์‹
email ์ด๋ฉ”์ผ ํ˜•์‹
date ๋‚ ์งœ(YYYY-MM-DD)
date-time ๋‚ ์งœ/์‹œ๊ฐ„(ISO 8601)
password ๋น„๋ฐ€๋ฒˆํ˜ธ
int64 64๋น„ํŠธ ์ •์ˆ˜

 

 

 

 

โ–ก ์ฝ”๋“œ๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ธฐ

  • ์š”์ฒญ
paths:
  /api/register:
    post:
      summary: ํšŒ์›๊ฐ€์ž…
      description: ์ด๋ฆ„, ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ „ํ™”๋ฒˆํ˜ธ, ์ƒ๋…„์›”์ผ, ์ด๋ฉ”์ผ์„ ๋ฐ›๋Š”๋‹ค.
      requestBody:
        required: true
paths์— /api/register๋ผ๋Š” ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์—ˆ๋‹ค. post๋Š” HTTP ๋ฉ”์„œ๋“œ ๋ฐฉ์‹์œผ๋กœ GET, POST, PUT ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹ ์ค‘์— POST ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋‹ค. summary๋Š” ๊ฐ„๋žตํ•˜๊ฒŒ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ํ•˜๋Š”์ง€ ์ ์—ˆ๊ณ , description์€ ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์„ ์ ์—ˆ๋‹ค. ๋ฌผ๋ก  ์ด ๋ถ€๋ถ„์€ ํŒจ์Šคํ•ด๋„ ์ƒ๊ด€์—†๋‹ค. GET ๋ฐฉ์‹์€ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง(URL)์— ๋‚ด์šฉ์„ ๋„ฃ์–ด ๋ณด๋‚ธ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณด์•ˆ์— ์ข‹์ง€ ์•Š๋‹ค. ํšŒ์›๊ฐ€์ž…์€ ๋ณด์•ˆ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Body์— ๋‚ด์šฉ์„ ๋„ฃ์–ด ์ „๋‹ฌํ•˜๋Š” POST ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋‹ค.(๋ฌผ๋ก  POST ๋ฐฉ์‹์œผ๋กœ ์ „๋‹ฌํ–ˆ๋‹ค๊ณ  ๋ณด์•ˆ์ด ์™„๋ฒฝํ•œ ๊ฑด ์ ˆ๋Œ€ ์•„๋‹ˆ๋‹ค. ์•”ํ˜ธํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค) ๊ทธ๋ž˜์„œ requestBody์—์„œ required ๋ถ€๋ถ„์— true๋ผ๊ณ  ์ ์—ˆ๋‹ค. ์ •๋ณด๋ฅผ ์ฐพ์•„๋ณด๋ฉด required: true๋ฅผ ์ ์ง€ ์•Š์•„๋„ ๋”ฑํžˆ ๋ฌธ์ œ๋Š” ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค. (๋ฐ˜๋“œ์‹œ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์•Œ๋ฆฌ๋Š” ์ •๋„์˜ ์—ญํ• ๋งŒ ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค)

 

        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - userid
                - password
content์—๋Š” ์–ด๋–ค ํƒ€์ž…์œผ๋กœ ์˜ค๊ฐˆ์ง€ ์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์—ฌ๊ธฐ์„œ๋Š” json์ด๋ผ๊ณ  ์ ์—ˆ๋‹ค. form ๋ฐฉ์‹์€ ๋ณดํ†ต ํ…์ŠคํŠธ์™€ ํŒŒ์ผ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•จ๊ป˜ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ํšŒ์›๊ฐ€์ž…์€ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋งŒ ์˜ค๊ฐ€๋ฉด ๋˜๋‹ˆ๊นŒ json์œผ๋กœ ์ง€์ •ํ–ˆ๋‹ค. schema๋Š” Body์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ ๋Š”๋‹ค. ํšŒ์›๊ฐ€์ž…์„ ํ•  ๊ฒฝ์šฐ Body์— ์˜ฌ ๋ฐ์ดํ„ฐ๋“ค์€ ์ด๋ฆ„, ์•„์ด๋”” ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ์ด ์žˆ๋‹ค. required์— ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์ด ๋ฌด์—‡์ธ์ง€ ์ ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด type: object๋Š” ๋ญ˜๊นŒ? ํšŒ์›๊ฐ€์ž…์€ ์—ฌ๋Ÿฌ ๊ฐ’์„ ํ•œ ๋ฒˆ์— ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ { "name": "sori", "userid":"sori123" }์ด๋Ÿฐ ์‹์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค. ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์—ฌ์žˆ๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ‚ค:๊ฐ’์ด ์Œ์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ object ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค.

 

              properties:
                name:
                  type: string
                  description: ์ด๋ฆ„
                userid:
                  type: string
                  description: ์•„์ด๋””
                password:
                  type: string
                  format: password
                  description: ๋น„๋ฐ€๋ฒˆํ˜ธ
properties๋Š” ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์ ๋Š”๋‹ค. name๊ณผ userid, password๋Š” string ํƒ€์ž…์ด๋‹ค. ๊ทธ์ค‘ password๋Š” format์„ ํ†ตํ•ด ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. OpenAPI(Swagger)์—์„œ format: password๋กœ ํ•˜๋ฉด ์ž…๋ ฅ์ฐฝ์ด ๋น„๋ฐ€๋ฒˆํ˜ธ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ…Œ์ŠคํŠธํ•  ๋•Œ, ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ•ด์ค€๋‹ค.

 

  • ์‘๋‹ต
      responses:
        '200':
          description: ๊ฐ€์ž… ์„ฑ๊ณต
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                    example: success
                  id:
                    type: integer
                    example: 1
                  message:
                    type: string
                    example: ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
responses๋Š” ์‘๋‹ต์œผ๋กœ '200'์ด๋ž€ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ ์—ˆ๋‹ค. content์™€ schema๋Š” ๋™์ผํ•˜๊ฒŒ ์ ์–ด์ฃผ์—ˆ๋‹ค. ์‹ค์ œ body ๋‚ด์šฉ์—๋Š” result์™€ id ๊ทธ๋ฆฌ๊ณ  message๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค. result๋Š” ์‘๋‹ต์ƒํƒœ๊ฒฐ๊ณผ์ด๋ฉฐ, id๋Š” ๋กœ๊ทธ์ธํ•  ๋•Œ ์“ฐ๋Š” ์•„์ด๋””๊ฐ€ ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ž๋™์œผ๋กœ ๋ถ€์—ฌํ•˜๋Š” ๊ณ ์œ ํ•œ ์ˆซ์ž์ด๋‹ค. ํšŒ์›๊ฐ€์ž…์ด ์„ฑ๊ณต์ด ๋๋Š”์ง€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•œ message๊นŒ์ง€ ๋„ฃ์—ˆ๋‹ค. ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค๋ผ๋Š” ๋ฌธ๊ตฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

 

        '400':
          description: ๊ฐ€์ž… ์‹คํŒจ
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                    example: fail
                  message:
                    type: string
                    example: ์•„์ด๋””๊ฐ€ ์ค‘๋ณต์ž…๋‹ˆ๋‹ค or ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ฐ€์ž…์ด ์‹คํŒจํ–ˆ์„ ๋•Œ '400'์ด๋ž€ ์‘๋‹ต์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด๋ฉฐ, result์— fail์„ ๋‹ด์•„ ์„œ๋ฒ„์—์„œ ํ”„๋ก ํŠธ๋กœ ๋ณด๋‚ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ํšŒ์›๊ฐ€์ž…์ด ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ message์— ๋‹ด์•„ ๋ณด๋‚ธ๋‹ค.

 

 

โ–ก Swagger Editor ์‚ฌ์šฉํ•˜๊ธฐ.

  • ์ฝ”๋“œ๋ฅผ ๋ณต๋ถ™ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

https://editor.swagger.io/

 

Swagger Editor

 

editor.swagger.io

 

 

 


 

 

 

5. ๋งˆ๋ฌด๋ฆฌ

 

YAML์œผ๋กœ OpenAPI(Swagger)๋ฅผ ์ž‘์„ฑํ•ด ๋ดค๋‹ค. ์ฒ˜์Œ ์ž‘์„ฑํ•ด ๋ณด๋Š” ๊ฑฐ๋ผ ๋งž๋Š”์ง€๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์•„๋งˆ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด๋‚˜ ๋นผ๋จน์€ ๋ถ€๋ถ„์ด ๋งŽ์•„์„œ ์ถ”ํ›„์— ์ˆ˜์ •์„ ํ•˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค. ์ผ๋‹จ์€ ํšŒ์›๊ฐ€์ž… ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, ๊ฐ„ํŽธ ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ๋“ฑ ๋‹ค๋ฅธ ํŒŒํŠธ๋Š” ๋‚˜์ค‘์— ํ•ด๋ณด๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค. (๋„ˆ๋ฌด ํž˜๋“ค์—ˆ๋‹ค...)

 

 

 


 

 

์•„๋ž˜์— ์ถœ์ฒ˜๋ฅผ ๋‚จ๊ฒจ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ธ”๋กœ๊ทธ์—” ์ œ๊ฐ€ ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•œ ๋‚ด์šฉ๊นŒ์ง€๋งŒ ์ ๋Š” ๊ฑฐ๋ผ
์ถœ์ฒ˜์— ๋“ค์–ด๊ฐ€์‹œ๋ฉด ๋” ๋งŽ์€ ๋‚ด์šฉ์ด ์žˆ์–ด ๊ณต๋ถ€ํ•˜์‹œ๋Š”๋ฐ ๋„์›€ ๋˜์‹ค ๊ฒ๋‹ˆ๋‹ค.

 

๐Ÿชฝ

ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”

 

 


 

https://swagger.io/specification/v3/

-Swagger

 

OpenAPI Specification - Version 2.0 | Swagger

OpenAPI Specification (fka Swagger RESTful API Documentation Specification) Version 2.0 The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted

swagger.io

 

 

 

- Swagger ์‚ฌ์šฉ๋ฒ•

 

Swagger API ๋ช…์„ธ ๋งŒ๋“œ๋Š” ๋ฒ• 1 - Swagger Hub์—์„œ yaml ํŒŒ์ผ ์ƒ์„ฑ

https://app.swaggerhub.com/search ์—์„œ Create New > Create New API๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด ๋ณธ๋‹ค. ์ฒ˜์Œ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , name๋งŒ ์ถ”๊ฐ€ํ•˜์—ฌ์„œ ์ƒ์„ฑํ•ด๋ณธ๋‹ค. (Template: Petstore๋ผ๋Š”

velog.io

 

 

 

- YAML ์ž‘์„ฑ๋ฐฉ๋ฒ•

 

TIL > API ๋ฌธ์„œ ์ž‘์„ฑํ•˜๊ธฐ (swagger)

์ œ๊ฐ€ ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ๋‹จ์ˆœํžˆ ๊ธฐ๋ก(๋ณด์—ฌ์ฃผ๊ธฐ)ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค!!!!!!!!! ์•„๋ž˜์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ Swagger ์˜ yaml ํ˜•์‹์œผ๋กœ OpenAPI ๋ช…์„ธ์„œ๋ฅผ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. - ์กฐํšŒ ๋ธ”๋กœ๊ทธ ๊ธ€ ์ „์ฒด ์กฐํšŒ ํŠน์ • ๋ธ”

sororiri.tistory.com

 

 

 

- JSON, FORM์˜ ์ฐจ์ด์ 

 

FormData์™€ JSON(body)์˜ ์ฐจ์ด์ : ์–ธ์ œ ์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

body๋ฅผ FormData๋กœ ๋ฐ”๊ฟ€ ๋•Œ์˜ ์ฐจ์ด์™€ ๊ทธ์— ๋”ฐ๋ฅธ ์žฅ๋‹จ์ ์€ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก ๋ฐฉ์‹๊ณผ ํŒŒ์ผ ์ „์†ก ํ•„์š”์„ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. <span style="color:์ „์†ก ํ˜•์‹: ๋ฐ์ดํ„ฐ๋Š” JSON ํ˜•์‹์œผ๋กœ ์ „์†ก์ด ๋ฐฉ์‹์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ

velog.io

 

 

 

- YAML ์ž‘์„ฑ ๋ฐฉ๋ฒ•

 

Swagger API Yaml ๊ธฐ๋ณธ ํŒŒ์ผ ์ž‘์„ฑ

Yaml ํŒŒ์ผ ์ƒ์„ฑ

velog.io

 

 

 

- Swagger ์ ์šฉ

 

[Swagger] ์Šคํ”„๋ง 3.x Swagger ์ ์šฉ(With. SpringDocs)

์Šคํ”„๋ง ๋ฒ„์ „์ด 3.x๋Œ€๋กœ ๋„˜์–ด์˜ค๋ฉด์„œ ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ Springfox๊ฐ€ ํ˜ธํ™˜์ด ๋˜์ง€์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์„ ์œ„ํ•œ SpringDocs ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ ํฌ์ŠคํŒ… ์˜ˆ์ „ ์Šคํ”„๋ง 2.x๋Œ€์—์„œ ์‚ฌ์šฉํ•˜๋˜ Springfox ๋ผ์ด

infinitecode.tistory.com

 

 

 

- Swagger ์‚ฌ์šฉ

 

Swagger๋ฅผ ์ด์šฉํ•œ API ๋ฌธ์„œ ์ž๋™ํ™”

API ๋ฌธ์„œ ์ž๋™ํ™” ํ”„๋ ˆ์ž„์›Œํฌ์ธ Swagger๋ฅผ ํ•™์Šตํ•˜๊ณ  ํ™œ์šฉํ•ด๋ณด์ž. 1. Swagger๋ž€? ์ฒ˜์Œ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ, API ์„œ๋ฒ„๊ฐ€ ์–ด๋–ค Spec์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”์ง€์— ๋Œ€ํ•œ ๋ฌธ์„œ์ž‘์—…์ด ๊ผญ ํ•„

jjingho.tistory.com