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๋ฅผ ํฉ์ณ ์กฐ๊ธ์ ๋ฒ๊ฑฐ๋ฌ์ด ๊ตฌ์ถ ๊ณผ์ ์ด ๋ง์๋ค.
๋ฌผ๋ก ๊ทธ ๋ฐฉ๋ฒ์ด ์์ ์ ์ธ ์ธก๋ฉด์์ ๋ดค์ ๋ ๋ ์ข์ง๋ง ๋๋ ํ ์ด ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ๋ฐฉ์์ ํํ๋ค.