@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에 적용하도록 설정
▶ 우측에Authorize 버튼이 생성되었으며 클릭 시JWT 토큰값을 입력하는 창이 도출
Swagger에서 추가된JWT토큰을HTTP Request의Authorization Header에 추가하도록 설정
。@Configuration 클래스에서@SecurityRequirement(name = "Bearer Authentication")를 추가 정의
▶.addSecuritySchemes()에서 지정된key명을name으로 설정
。이후Swagger로API 요청시 해당API 요청에Swagger에서 추가한JWT토큰이 포함되어 전송됨@Configuration @SecurityRequirement(name = "Bearer Authentication") // 추가정의 public class SwaggerConfiguration { @Bean public OpenAPI openAPI() { return new OpenAPI() .components( new Components() .addSecuritySchemes( "Bearer Authentication", new SecurityScheme() .type(SecurityScheme.Type.HTTP) .scheme("bearer") .bearerFormat("JWT") ) ) } }
- 별도로
JWT 토큰을 요구하는Controller에 대해서만JWT 토큰추가 시 사용하도록 설정하기
。@SecurityRequirement를@Controller 클래스의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패턴/**")를 정의해야함.
GroupedOpenApi.pathsToExclude("/URL패턴/**")
。해당URL패턴을 가지는API를그룹에서 제외하도록 설정@Bean public GroupedOpenApi AdminApi() { return GroupedOpenApi.builder() // 해당 URL 패턴을 가지는 API만 포함 .pathsToMatch("/admin/**", "/auth/**") .group("Admin API") .build(); } @Bean public GroupedOpenApi UserApi() { return GroupedOpenApi.builder() .group("User API") // 해당 URL 패턴을 제외한 API만 포함 .pathsToExclude("/admin/**") .build(); }
▶ 설정된URL 패턴을 가지는API만 따로 표시하는것을 확인 가능