kakao-tech-campus-2nd-step3 / Team13_BE

13์กฐ ๋ฐฑ์—”๋“œ
4 stars 5 forks source link

Swagger ๊ตฌํ˜„ #25

Open pykido opened 1 week ago

pykido commented 1 week ago

๐Ÿ“ ์ด์Šˆ ์„ค๋ช…

API๊ฐ€ ๋งŽ์•„์ง€๋ฉด์„œ POSTMAN์œผ๋กœ ์ „๋ถ€ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ธฐ์—” ๋‹ค์†Œ ๋ถˆํŽธํ•œ ์‚ฌํ•ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ๋”ฐ๋ผ์„œ swagger๋ฅผ ๋„์ž…ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  1. Gradle ์˜์กด์„ฑ ์ถ”๊ฐ€
    • SpringDoc OpenAPI๋Š” ๋ณ„๋„์˜ ์ถ”๊ฐ€ ์„ค์ • ์—†์ด๋Š” ์ผ๋‹จ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒฝ๋กœ๊ฐ€ /swagger-ui.html ์ž…๋‹ˆ๋‹น!
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ํ•˜๊ณ , ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:8080/swagger-ui.html๋กœ ์ด๋™ํ•˜์—ฌ API ๋ฌธ์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ด์š”!
      dependencies {
      // SpringDoc OpenAPI (Swagger UI ํฌํ•จ)
      implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0'
      }
  1. ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์— API ์„ค๋ช… ์ถ”๊ฐ€
    • ์ปจํŠธ๋กค๋Ÿฌ ๋ ˆ์ด์–ด์— Swagger ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • @Tag, @Operation ์ถ”๊ฐ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!
@Tag(name = "[๊ด€๋ฆฌ์ž] ๋ณดํ˜ธ์ž (Guardian)", description = "๋ณดํ˜ธ์ž ์ •๋ณด ์กฐํšŒ ๋ฐ ์ˆ˜์ •")
@PreAuthorize("hasAnyAuthority('ROLE_SUPERMAN', 'ROLE_ADMIN')")
@RestController
@RequestMapping("/v1/admin/guardian")
@RequiredArgsConstructor
public class GuardianAdminController {

    private final GuardianService guardianService;

    @Operation(summary = "๋ณดํ˜ธ์ž ์ •๋ณด ์ƒ์„ธ ์กฐํšŒ")
    @GetMapping("/{guardianId}")
    public ResponseEntity<GuardianResponse> showOneGuardian(
        @PathVariable("guardianId") Long guardianId) {
        GuardianResponse guardianResponse = guardianService.getGuardianById(guardianId);
        return ResponseEntity.ok(guardianResponse);
    }
    ....
}
  1. Swagger ๊ธฐ๋ณธ ์„ค์ • ์ถ”๊ฐ€

    • ๋ณดํ˜ธ์ž, ๋Œ๋ด„๋Œ€์ƒ์ž์™€ ๊ฐ™์ด ๋„๋ฉ”์ธ๋ณ„๋กœ API ๋ฌธ์„œ๋ฅผ ๋‚˜๋ˆ„๋ฉด ์ข‹์„ ๋“ฏํ•ฉ๋‹ˆ๋‹ค! ์ฐธ๊ณ  ์ฝ”๋“œ
      
      @Configuration
      public class OpenApiConfiguration {

    @Bean public OpenAPI openAPI() { Info info = new Info() .title("๋Œ๋ด„๋‹ค๋ฆฌ API Document") .version("v1.0.0") .description("๋Œ๋ด„๋‹ค๋ฆฌ ์„œ๋ฒ„ API ๋ช…์„ธ์„œ์ž…๋‹ˆ๋‹ค."); return new OpenAPI() .components(new Components()) .info(info); }

    @Bean public GroupedOpenApi allApi() { return GroupedOpenApi.builder() .group("all") .displayName("All API") .pathsToMatch("/**") .build(); }

    @Bean public GroupedOpenApi adminApi() { return GroupedOpenApi.builder() .group("guardian") .displayName("Guardian API") .pathsToMatch("/v*/guardian/**") .build(); }

    
    4. Swagger UI ์ปค์Šคํ„ฐ๋งˆ์ด์ง• (์„ ํƒ)
    - ์š”๊ฑด ์„ ํƒ์‚ฌํ•ญ์ด๊ธด ํ•œ๋ฐ ํ•„์š”ํ•˜๋‹ค๋ฉด ํ•ด์ฃผ์„ธ์š”~!!

    springdoc: api-docs: enabled: true # API ๋ฌธ์„œํ™” ํ™œ์„ฑํ™” ์—ฌ๋ถ€ path: /api-docs # OpenAPI ๋ฌธ์„œ์˜ ๊ฒฝ๋กœ๋ฅผ ์„ค์ • (๊ธฐ๋ณธ: /v3/api-docs) swagger-ui: path: /swagger-ui.html # Swagger UI ๊ฒฝ๋กœ ์„ค์ • (๊ธฐ๋ณธ: /swagger-ui.html) operationsSorter: method # API ๋ชฉ๋ก์„ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹ (method๋กœ ์ •๋ ฌ) display-request-duration: true # ์š”์ฒญ ์‹œ๊ฐ„ ํ‘œ์‹œ defaultModelsExpandDepth: -1 # ๋ชจ๋ธ ํ™•์žฅ ๋ฐฉ์ง€ (Swagger UI์—์„œ ๋ชจ๋ธ์ด ํŽผ์ณ์ง€์ง€ ์•Š์Œ) tryItOutEnabled: true # Try it out ๋ฒ„ํŠผ ํ™œ์„ฑํ™” (API ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ) doc-expansion: none # Swagger UI์˜ ๊ธฐ๋ณธ ํ™•์žฅ ์ƒํƒœ (none์œผ๋กœ ์„ค์ • ์‹œ ๋ชจ๋‘ ์ ‘ํžŒ ์ƒํƒœ) deep-linking: true # URL์—์„œ ํŠน์ • ์—”๋“œํฌ์ธํŠธ๋กœ ๋ฐ”๋กœ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ

โ˜‘๏ธ TODO

hyyyh0x commented 6 hours ago

@Schema(description = "์ƒํ’ˆ ์ด๋ฆ„", example = "์ถ˜์‹์ด ์ž ์˜ท") ์ด๋Ÿฐ์‹์œผ๋กœ dto request์—๋Š” ๋”ฐ๋กœ ๋‹ฌ ํ•„์š” ์—†์„๊นŒ์š”?

pykido commented 5 hours ago

ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋‹ฌ์•„๋„ ์ข‹์„ ๊ฑฐ ๊ฐ™์•„์š”~!