@OpenAPIDefinition
。@Configuration 클래스에 선언하여OpenAPI Specification에 따르는어플리케이션의API 문서에 대한 정보를 선언된클래스에서 설정하도록하는어노테이션
info = @Info(설정)
。어플리케이션 API에 대한title,version,description등을 설정하는@Info 어노테이션을 설정@Configuration @OpenAPIDefinition( info = @Info( title = "테크업 쇼핑몰", version = "0.0.1", description = "테크업 쇼핑몰 API 명세 " ) )
▶API 문서상단에 다음 설정이 정의
Swagger로 구축한API 문서에JWT 토큰을 등록할Authorization 버튼생성 및Header에 포함하도록 설정하기
。해당 기능을 통해JWT 토큰을 입력 시 향후Swagger에서 수행하는API 요청에 자동으로토큰이인증헤더에 추가
@Configuration 클래스내OpenAPI 객체에 설정을 정의한 후@Bean을 통해Spring Bean으로 등록@Bean public OpenAPI openAPI() { return new OpenAPI() .components( new Components() .addSecuritySchemes( "Bearer Authentication", // 키명 new SecurityScheme() .type(SecurityScheme.Type.HTTP) .scheme("bearer") .bearerFormat("JWT") ) ); }▶
"Bearer Authentication"는키명으로서 적용할컨트롤러 클래스에@SecurityRequirement(name = "Bearer Authentication")으로 선언하여Swagger API전송 시헤더에토큰을 포함하도록 설정
▶ 우측에Authorize 버튼이 생성되었으며 클릭 시JWT 토큰값을 입력하는 창이 도출
Swagger에서 추가된JWT토큰을HTTP Request의Authorization Header에 추가하도록 해당컨트롤러에@SecurityRequirement(name = "키명")을 지정
。@SecurityRequirement(name = "Bearer Authentication")를@Controller 클래스의Controller별로 설정하여 해당JWT 토큰을 요구하도록 설정가능
▶.addSecuritySchemes()에서 지정된key명을name으로 설정
。이후Swagger로API 요청시 해당API 요청에Swagger에서 추가한JWT토큰이 포함되어 전송됨
- 별도로
JWT 토큰을 요구하는Controller에 대해서만JWT 토큰추가 시 사용하도록 설정하기@GetMapping("/{id}") @ResponseStatus(HttpStatus.OK) @SecurityRequirement(name = "Bearer Authentication") public MemberResponse.Details detail(@PathVariable Long id){ return memberservice.getMember(id); }
▶ 해당API에 대해서 사용 시JWT 토큰을 사전에 설정해야 사용가능
Swagger에서프로필 환경별서버 접속설정
Profile
。Swagger접속 시어플리케이션에서 활성화된프로필에 따라 각각서버에 대한API를 구분해서 도출하도록 설정
▶dev 환경에서prod 환경 서버로API 요청을 전송하는것을 방지하기 위해 설정.
@Configuration 클래스내OpenAPI 객체에 설정을 정의한 후@Bean을 통해Spring Bean으로 등록
。Enviroment 객체를주입받아서 현재 활성화 된프로필가져오기
▶switch 문에 따라프로필별로URL을 전달@Configuration @RequiredArgsConstructor public class SwaggerConfiguration { private final Environment environment; private String getServerUrl(){ // 현재 활성화된 프로필 가져오기 String profile = environment.getActiveProfiles()[0]; // 활성화 된 프로필별로 각각의 서버 URL을 반환 return switch(profile){ case "dev" -> "http://localhost:8081"; case "test" -> "http://localhost:8082"; default -> "http://localhost:8080"; }; } @Bean public OpenAPI openAPI() { return new OpenAPI() .servers( List.of(new Server().url(getServerUrl()) ) ); } }
▶test로프로필설정 시swagger에서http://localhost:8082로 접속되었음을 확인 가능
Swagger내API를그룹별로 분리하기
。해당API들을URL 패턴별로그룹으로 분리를 수행
ex )/users/...로 시작하는API만 따로그룹으로 분리
@Configuration 클래스내GroupedOpenApi 객체에 대한 설정을 정의 후Spring Bean으로 등록
▶ 해당객체는builder 패턴으로 정의되어있으므로GroupedOpenApi.builder()...으로 설정을 수행하면 됨.
GroupedOpenApi.pathsToMatch("/URL패턴1", "/URL패턴2" , ... )
。해당URL패턴을 가지는API를 대상으로 별도의그룹으로 분리
。 분리 시중복을 방지하기위해 다른API 그룹을 정의하는GroupedOpenApi에 대해서GroupedOpenApi.pathsToExclude("/URL패턴/**")를 정의해야함.
。URL 엔드포인트중간에PathVariable을 포함하는 경우 다음처럼*로 표시
▶/api/posts/{id}/comments인 경우/api/posts/*/comments로 설정@Bean public GroupedOpenApi commentApi(){ return GroupedOpenApi.builder() .pathsToMatch("/api/posts/*/comments/**","/api/requests/*/comments/**") .group("Comment API") .build(); }
GroupedOpenApi.pathsToExclude("/URL패턴1", "/URL패턴2" , ...)
。해당URL패턴을 가지는API를그룹에서 제외하도록 설정@Bean public GroupedOpenApi userApi(){ return GroupedOpenApi.builder() // 해당 URL 패턴을 가지는 API만 포함 .pathsToMatch("/api/v1/users/**") // 해당 URL 패턴을 제외한 API만 포함 .pathsToExclude("/api/v1/users/me/friends/**", "/api/v1/users/me/npcs/**", "/api/v1/users/me/inventory/**") .group("유저") .build(); }
▶ 설정된URL 패턴을 가지는API만 따로 표시하는것을 확인 가능