[Spring] Spring 버전에 따른 Swagger 적용 방식

기존의 Spring 2.x.x 버전에서 사용하던 Swagger 적용 방법

기존의 방식은 springfox를 이용하여 적용하는 방식이였음.

build.gradle

implementation 'io.springfox:springfox-boot-starter:3.0.0'
implementation 'io.springfox:springfox-swagger-ui:3.0.0'

SwaggerConfig

@Configuration
public class SwaggerConfig {

    TypeResolver typeResolver = new TypeResolver();

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.OAS_30)
                .alternateTypeRules(AlternateTypeRules.newRule(typeResolver.resolve(Pageable.class), typeResolver.resolve(Page.class)))
                .useDefaultResponseMessages(true) // Swagger 에서 제공해주는 기본 응답 코드 (200, 401, 403, 404) 등의 노출 여부
                .apiInfo(apiInfo()) // Swagger UI 로 노출할 정보
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.waffleeungaebackend")) // api 스펙이 작성되어 있는 패키지 (controller)
                .paths(PathSelectors.any()) // apis 에 위치하는 API 중 특정 path 를 선택
                .build();
    }

    public ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Eungae")
                .description("eungae swagger.")
                .version("0.2")
                .build();
    }

    @Getter
    @Setter
    @ApiModel
    static class Page {
        @ApiModelProperty(value = "페이지 번호(0..N)")
        private Integer page;

        @ApiModelProperty(value = "페이지 크기", allowableValues="range[0, 100]")
        private Integer size;

        @ApiModelProperty(value = "정렬(사용법: 컬럼명,ASC|DESC)")
        private List<String> sort;
    }
}

Spring 3.x.x 버전부터 바뀐 Swagger 적용 방식

3버전부터는 Springdocs를 사용하여 적용되어야 한다.

이걸 모르고 죽어라 검색하고 뭐 접속도 안되네 뭐가 문제지 하고 SecurityConfig에 permit 부분만 죽어라 바꾸고 그래들만 죽어라 바꿔봤는데 일주일 후에 알게됨…

build.gradle

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0'

SwaggerConfig

@RequiredArgsConstructor
@Configuration
public class SwaggerConfig {

    @Bean
    public OpenAPI JmtApi() {
        Info info = new Info()
                .title("JMT 프로젝트 API") // 타이틀
                .version("v1") // 문서 버전
                .description("잘못된 부분이나 오류 발생 시 바로 말씀해주세요.") // 문서 설명
                .contact(new Contact() // 연락처
                        .name("GDSC DJU")
                        .email("anes53027@gmail.com"));

        // Security 스키마 설정
        SecurityScheme bearerAuth = new SecurityScheme()
                .type(SecurityScheme.Type.HTTP)
                .scheme("bearer")
                .bearerFormat("JWT")
                .in(SecurityScheme.In.HEADER)
                .name(HttpHeaders.AUTHORIZATION);

        // Security 요청 설정
        SecurityRequirement addSecurityItem = new SecurityRequirement();
        addSecurityItem.addList("JWT");

        return new OpenAPI()
                // Security 인증 컴포넌트 설정
                .components(new Components().addSecuritySchemes("JWT", bearerAuth))
                // API 마다 Security 인증 컴포넌트 설정
                .addSecurityItem(addSecurityItem)
                .info(info);
    }
}

application.properties

springdoc.packages-to-scan=com.gdsc.projectmiobackend.controller
springdoc.default-consumes-media-type=application/json;charset=UTF-8
springdoc.default-produces-media-type=application/json;charset=UTF-8
springdoc.api-docs.groups.enabled=true
springdoc.cache.disabled=true
springdoc.api-docs.path=/api-docs

Leave a comment