본문 바로가기
자바

API 문서 자동화 - Swagger

by 뇽꾸리 2022. 8. 19.
반응형
  //gradle 
  implementation 'io.springfox:springfox-swagger2:2.8.0'
  implementation 'io.springfox:springfox-swagger-ui:2.8.0'
  
  //maven
  <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
      <version>2.8.0</version>
   </dependency>
  <dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.8.0</version>
  </dependency>
package com.spring2.nyong.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableWebMvc
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {
	
    //extends는 클래스를 확장하는 거고 implements는 인터페이스를 구현하는 것이다.
    //extends WebMvcConfigurationSupport 도 가능하다. 
    
    @Bean
    public Docket swaggerApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(swaggerInfo()).select()
                .apis(RequestHandlerSelectors.basePackage("com.spring2.nyong.controller"))
                .paths(PathSelectors.any())
                .build()
                .useDefaultResponseMessages(false); // 기본으로 세팅되는 200,401,403,404 메시지 표시 x
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
        // -- Static resources
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css");
        registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");
        registry.addResourceHandler("/images/**").addResourceLocations("classpath:/static/images/");
    }

    private ApiInfo swaggerInfo() {
        return new ApiInfoBuilder().title("Spring Nyong API Documentation")
                .description("뇽이 서버 API에 대한 연동 문서입니다.")
                .license("nyong").licenseUrl("https://crazynyong.tistory.com/")
                .version("1")
                .build();
    }
}
package com.spring2.nyong.config;


import com.spring2.nyong.jwt.JwtAuthenticationFilter;
import com.spring2.nyong.jwt.JwtTokenProvider;
import com.spring2.nyong.service.CustomUserDetailService;
import com.spring2.nyong.util.AES256Util;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import java.io.UnsupportedEncodingException;


@EnableWebSecurity
@RequiredArgsConstructor
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final JwtTokenProvider jwtTokenProvider;
    private final CustomUserDetailService userDetailService;


    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable()

                //h2
                .headers()
                .frameOptions()
                .sameOrigin()

                // 시큐리티는 기본적으로 세션을 사용
                // 여기서는 세션을 사용하지 않기 때문에 세션 설정을 Stateless 로 설정
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()

                //권한
                .authorizeRequests()
                .antMatchers("/api/**","/resources/**","/css/**", "/images/**","/configuration/**", "/js/**", "/h2-console/**","/v2/api-docs", "/configuration/**", "/swagger*/**", "/webjars/**")
                .permitAll()
                //.antMatchers("/**").hasRole("USER")
                .anyRequest().authenticated()   // 나머지 API 는 전부 인증 필요
                .and()
                .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider,userDetailService), UsernamePasswordAuthenticationFilter.class)
              ;
    }



}
package com.spring2.nyong.controller;

import com.spring2.nyong.dto.UserDTO;
import com.spring2.nyong.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

@Api(tags = {"1. User"}) // UserController를 대표하는 최상단 타이틀 영역에 표시될 값 세팅
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/")
public class UserApiController {

    private final UserService userService;

    @ApiOperation(value = "회원 가입", notes = "회원을 입력한다.")
    @PostMapping("signup")
    public Long signUp(@RequestBody UserDTO userDTO) throws Exception{
        return userService.signUp(userDTO);
    }
  
}

http://localhost:8080/swagger-ui.html 

그리고 들어가면 예쁘게 api 문서가 나온다.

근데 난 swagger 좀 불편한거같다. postman이나 junit test 코드가 더 테스트하기 편하다. 수정사항도 더 적고 

반응형

'자바' 카테고리의 다른 글

java DTO,VO List 정렬  (0) 2022.08.19
SptringBoot Rest Api Exception  (0) 2022.05.31
자바 dto,vo 리스트 정렬 list sort  (0) 2022.04.21
string을 VO로 변환, json을 VO로 변환  (0) 2022.01.26
자바 스택/리스트  (0) 2020.06.24

댓글