Spring ํ๋ก์ ํธ์ Swagger2 ์ ์ฉ
Swagger2 ์ ์ฉ
API ๋ฌธ์ ์๋ํ๋ฅผ ํด์ฃผ๋ Swagger2๋ฅผ ์คํ๋ง ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด์.
์์กด์ฑ ์ถ๊ฐ
gradle์ ์ด์ฉํ๋ค๋ฉด build.gradle์ ๋ค์๊ณผ ๊ฐ์ ์์กด์ฑ์ ์ถ๊ฐํด ์ค๋ค.
compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
Swagger2Config
Config ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ Config ํด๋์ค๋ฅผ ๋ง๋ค์ด์ค๋ค.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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;
@EnableSwagger2
@Configuration
public class Swagger2Config {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.cadi.team3"))
.paths(PathSelectors.ant("/api/**"))
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("cadi project")
.version("1.0")
.description("movie & sns project apis")
.build();
}
}
config์ ๋ฑ๋ก๋ Docket Bean์ผ๋ก Swagger๊ฐ ์ ์ฉ๋ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ค์ ํด ์ค๋ค.
base๊ฐ ๋๋ package์ Swagger2๋ก ํ์ธํ api์ ์์ฒญ ๊ฒฝ๋ก๋ฅผ ์ค์ ํด ์ค ์ ์๊ณ , ๋ฐ๋ก ๋ฐ์ ์ ์ธํ apiInfo ๋ฉ์๋๋ฅผ apiInfo๋ก ์ง์ ํ ์ ์๋ค.
apiInfo()๋ ApiInfoBuilder()๋ฅผ ์ด์ฉํด ์ง๊ด์ ์ผ๋ก api ๋ฌธ์์ ๋ํ ์ ๋ณด๋ฅผ ์ค์ ํ ์ ์๋ค.
๋ฌธ์์ ์ด๋ฆ, ๋ฒ์ , ์ค๋ช
๋ฑ์ ์ค์ ํ๊ณ build() ํด์ค๋ค.
Controller์์ api ๋ถ๊ฐ ์ ๋ณด ์ค์
๋ค์๊ณผ ๊ฐ์ด swagger-ui์ ๋ฑ๋กํ api ์ค๋ช ์ ์ค์ ํ ์ ์๋ค.
@RequiredArgsConstructor
@RestController
@RequestMapping("/api")
public class AccountController {
private final AccountService accountService;
@PostMapping("/sign-up")
@ApiOperation(value = "ํ์๊ฐ์
", notes = "signupDto๋ก ์ ์ก")
public ResponseEntity<?> singUpRequest(@RequestBody @Valid SignupDto signupDto, Errors errors){
return accountService.signUp(signupDto, errors);
}
@GetMapping("/get-account")
@ApiOperation(value = "๋ก๊ทธ์ธ ํ์์ ๋ณด ์กฐํ")
public ResponseEntity<?> getAccount(@AuthenticationPrincipal AccountPrincipal accountPrincipal){
return new ResponseEntity<>(accountPrincipal, HttpStatus.OK);
}
}
@ApiOperation(value = "ํ์๊ฐ์ ", notes = "signupDto๋ก ์ ์ก")
@ApiOperation์ ์ด์ฉํด value ๊ฐ๊ณผ notes๋ก ๋ถ๊ฐ ์ค๋ช ์ ๋ฑ๋กํ ์ ์๋ค.
Spring Security ์ค์
์คํ๋ง ์ํ๋ฆฌํฐ์ Swagger2๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด Security์ ๋ณด์์ ์ํด swagger2์ ui๊ฐ ์๋ ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด๋ฅผ ์ํด WebSecurityConfigurerAdapter
๋ฅผ ์์ํ SecurityConfig์์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ฒ๋ผ์ด๋ฉ ํด์ค๋ค.
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/v2/api-docs/**");
web.ignoring().antMatchers("/swagger.json");
web.ignoring().antMatchers("/swagger-ui.html");
web.ignoring().antMatchers("/swagger-resources/**");
web.ignoring().antMatchers("/webjars/**");
}
Swagger ํ์ธ
baseUrl ๋ค์ "/swagger-ui.html"์ ๋ถ์ฌ์ฃผ๊ณ ์น์์ ์ ์ํด๋ณด์.
ํ๋ฉด์ ๋์ค๋ api๋ฅผ swagger2๋ฅผ ํตํด ์ ๊ฒํ๊ณ ํ์ธํด ๋ณผ ์ ์๋ค.