Programing/Springboot

[API documentation 자동화] spring boot swagger UI 적용 방법

리커니 2023. 1. 26. 12:07
반응형

API의 Document를 자동으로 제공해주는 swagger UI 설정방법을 알아보겠습니다.

 

springboot 2.7.7

springsecurity

gradle

 

 

1. dependencies 를 추가

/*swagger*/
implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0'
/*security*/
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '2.7.5'

 

2.WebMvcConfig.java 생성

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiKey;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;


@Configuration
@EnableSwagger2
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/swagger-ui/")
                .setViewName("forward:/swagger-ui/index.html");
    }
    
    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/swagger-ui/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
                .resourceChain(false);
    }
    
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .consumes(getConsumeContentTypes())
                .produces(getProduceContentTypes())
                .select()
                .apis(RequestHandlerSelectors.basePackage("API 패키지명"))
                .paths(PathSelectors.any())
                .build();
    }


    private Set<String> getConsumeContentTypes() {
        Set<String> consumes = new HashSet<>();
        consumes.add(MediaType.APPLICATION_JSON_VALUE);
        consumes.add("application/x-www-form-urlencoded");
        return consumes;
    }

    private Set<String> getProduceContentTypes() {
        Set<String> produces = new HashSet<>();
        produces.add(MediaType.APPLICATION_JSON_VALUE);
        return produces;
    }
    /**기타 설정*/
}

 

swagger 페이지 연결에 필요한 설정을 해줍니다.

 

 

3.security 에 swagger 연결 경로 허용 추가

import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.security.web.SecurityFilterChain;

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@RequiredArgsConstructor
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                    .csrf().disable() 
					/*...*/
                    /*swagger 관련 허용*/
                    .antMatchers("/v2/api-docs",  "/configuration/ui",
                        "/swagger-resources/**", "/configuration/security",
                        "/swagger-ui/**", "/webjars/**","/swagger/**").permitAll()
                    .anyRequest().authenticated()
					/*...*/
                    .and().build();
    }
}

 

4. swagger 접속확인

 

http://localhost:{설정 port}/{설정 context}/swagger-ui/index.html 로 접속을 확인합니다.

 

 

이렇게 설정만 하게 되면 API document를 따로 생성할 필요 없이 자동으로 생성되게 됩니다.

제공되는 API 부터 각 API의 Method, 파라메터, 예상결과, Model, 테스트 까지 깔끔한 UI로 제공되게 됩니다.

반응형