MSA ์•„ํ‚คํ…์ฒ˜์—์„œ API ๋ฌธ์„œ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ

1. ๊ฐœ์š”

ํ˜„์žฌ Spring Cloud๋ฅผ ์ด์šฉํ•ด์„œ MSA ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค.

 

๊ธฐ์กด์˜ ๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ž‘์„ฑํ•œ API๋ฅผ ํ•˜๋‚˜์˜ API ๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ MSA๋Š” ๊ฐ๊ฐ์˜ ๋„๋ฉ”์ธ์— ๋”ฐ๋ผ ํ”„๋กœ์ ํŠธ๊ฐ€ ์กด์žฌํ•˜๊ณ , ๊ฐ๊ฐ์˜ ๋„๋ฉ”์ธ๋งˆ๋‹ค API ๋ฌธ์„œ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 

์ด API ๋ฌธ์„œ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค ์ž…์žฅ์—์„  ๊ฐ๊ฐ์˜ API ๋ฌธ์„œ ์ฃผ์†Œ๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ต‰์žฅํžˆ ๋ถˆํŽธํ•˜๊ณ  ๋น„ํšจ์œจ์ ์ด๋‹ค. 

 

 

MSA ํ™˜๊ฒฝ์—์„œ API ๋ฌธ์„œ๋ฅผ ํ•œ ๊ณณ์— ๋ชจ์•„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์•˜๊ณ  ๊ณต์œ ํ•˜๊ณ ์ž ์ด ๊ธ€์„ ์ž‘์„ฑํ•œ๋‹ค. 

 

 

 

 

 

 

 

 

2. ์˜์กด์„ฑ ์ถ”๊ฐ€

๋จผ์ € Swagger ์‚ฌ์šฉ์„ ์œ„ํ•ด API Gateway์— ์˜์กด์„ฑ ์ถ”๊ฐ€๋ฅผ ํ•ด์ฃผ์ž. 

 

์—ฌ๊ธฐ ์—์„œ ๊ฐ ๋ฒ„์ „์— ๋งž๋Š” ์˜์กด์„ฑ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ๋‚˜๋Š” 24.08 ๊ธฐ์ค€ ๊ฐ€์žฅ ์ตœ์‹  ๋ฒ„์ „์ธ 2.6.0 ๋ฒ„์ „์„ ์‚ฌ์šฉํ–ˆ๋‹ค. 

์ฐธ๊ณ ๋กœ Spring Boot์˜ ๋ฒ„์ „์€ 3.3.2 ๋ฒ„์ „์ด๋‹ค. 

 

// swagger
implementation 'org.springdoc:springdoc-openapi-starter-webflux-ui:2.6.0'

 

spring-doc ์ด ์•„๋‹ˆ๋ผ webflux spring doc์ž„์„ ์žŠ์ง€๋ง์ž.

 

 

 

 

 

 

 

3. YML ํŒŒ์ผ ์„ค์ •

- apigateway-service์˜ application.yml ํŒŒ์ผ

springdoc:
  swagger-ui:
    urls[0]:
      name: user-service
      url: /user-service/v3/api-docs
    urls[1]:
      name: product-service
      url: /product-service/v3/api-docs
    urls[2]:
      name: order-service
      url: /order-service/v3/api-docs
    urls[3]:
      name: notification-service
      url: /notification-service/v3/api-docs
    urls[4]:
      name: board-service
      url: /board-service/v3/api-docs
    urls[5]:
      name: basket-service
      url: /basket-service/v3/api-docs
    use-root-path: true

 

์œ„์™€ ๊ฐ™์ด ๊ฐ micro service์˜ name๊ณผ url์„ ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

use-root-path: true ์˜ต์…˜์€ root url๋กœ ์ ‘์† ํ–ˆ์„ ๋•Œ swagger ui๋กœ ์ด๋™์‹œ์ผœ์ฃผ๋Š” ์„ค์ •์ด๊ณ , ๋‚˜๋Š” ํŽธ์˜๋ฅผ ์œ„ํ•ด ์„ค์ •ํ•ด์คฌ๋‹ค.  

 

 

 

 

 

 

 

4. ๊ฐ service์— swagger ์„ค์ •

์œ„์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ gradle ์˜์กด์„ฑ ์ถ”๊ฐ€ ํ›„ yml ์„ค์ • ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ด์ค€๋‹ค.

 

 

- gradle

implementation group: 'org.springdoc', name: 'springdoc-openapi-starter-webmvc-ui', version: '2.2.0'

 

 

 

- user-service ์˜ application.yml ํŒŒ์ผ

springdoc:
  api-docs:
    version: openapi_3_1
    enabled: true
    path: user-service/v3/api-docs
  enable-spring-security: true
  default-consumes-media-type: application/json
  default-produces-media-type: application/json

 

 

 

๊ฐ ์„œ๋น„์Šค๋งˆ๋‹ค swagger config ์„ค์ •์€ ํ•„์š”ํ•˜๋‹ค. 

@OpenAPIDefinition(
    info = @Info(title = "green-market user-service API ๋ช…์„ธ์„œ",
        version = "v1"))
@Configuration
public class SwaggerConfig {

    // JWT + swagger
    @Bean
    public OpenAPI openAPI() {
        SecurityScheme securityScheme = new SecurityScheme()
            .type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT")
            .in(SecurityScheme.In.HEADER).name("Authorization");
        SecurityRequirement securityRequirement = new SecurityRequirement().addList("bearerAuth");

        return new OpenAPI()
            .components(new Components().addSecuritySchemes("bearerAuth", securityScheme))
            .addServersItem(new Server().url("/"))
            .security(Arrays.asList(securityRequirement));
    }
}

 

 

 

์ด๋ ‡๊ฒŒ ์„ค์ •์„ ๋งˆ์น˜๊ณ  spring api gateway์˜ root url๋กœ ์ ‘๊ทผํ•ด๋ณด๋ฉด swagger๊ฐ€ ์ž˜ ๋œจ๊ณ , ๊ฐ service๋„ ์ž˜ ๋œจ๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

 

๊ตฌ๊ธ€๋ง ํ•ด๋ดค์„ ๋•Œ ๋ณดํ†ต์€ swagger ์™€ restdocs๋ฅผ ํ•ฉ์ณ ์กฐ๊ธˆ์€ ๋ฒˆ๊ฑฐ๋Ÿฌ์šด ๊ตฌ์ถ• ๊ณผ์ •์ด ๋งŽ์•˜๋‹ค.

 

๋ฌผ๋ก  ๊ทธ ๋ฐฉ๋ฒ•์ด ์•ˆ์ •์ ์ธ ์ธก๋ฉด์—์„œ ๋ดค์„ ๋• ๋” ์ข‹์ง€๋งŒ ๋‚˜๋Š” ํ† ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ๋ฐฉ์‹์„ ํƒํ–ˆ๋‹ค.