Maven POM에 다음과 같이 Boot와 Swagger를 추가합니다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<properties>
<java.version>1.8</java.version>
<spring.boot.version>2.3.5.RELEASE</spring.boot.version>
<swagger.version>3.0.0</swagger.version>
<maven.compiler.version>3.8.1</maven.compiler.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- =================== -->
<!-- Tomcat Dependency -->
<!-- =================== -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!-- ==================== -->
<!-- Swagger Dependency -->
<!-- ==================== -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${swagger.version}</version>
</dependency>
</dependencies>
<!-- ======================= -->
<!-- Dependency Management -->
<!-- ======================= -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Spring Boot에서 Swagger 3.0.0을 제대로 동작하려면 다음과 같이 WebMVC 설정을 해야 합니다.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
public class WebMvcConfiguration implements WebMvcConfigurer {
private final String baseUrl;
public WebMvcConfiguration(@Value("${springfox.documentation.swagger-ui.base-url:}") String baseUrl) {
this.baseUrl = baseUrl;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String baseUrl = StringUtils.trimTrailingCharacter(this.baseUrl, '/');
registry.addResourceHandler(baseUrl + "/swagger-ui/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
.resourceChain(false);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/", "/swagger-ui/");
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.viewResolver(new InternalResourceViewResolver());
}
}
Swagger API Doc을 추가하기 위해서 다음과 같이 Swagger Boot Configuration을 생성합니다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@Configuration
@EnableOpenApi
public class SwaggerConfiguration {
@Bean
public Docket apiV1() {
version = "V1";
title = "Welcome API " + version;
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.groupName(version)
.select()
.apis(RequestHandlerSelectors.basePackage("io.datadynamics"))
.paths(PathSelectors.ant("/v2/api/**"))
.build()
.apiInfo(apiInfo(title, version));
}
private ApiInfo apiInfo(String title, String version) {
return new ApiInfo(
title,
"Swagger로 생성한 API Docs",
version,
"www.example.com",
new Contact("Contact Me", "www.example.com", "foo@example.com"),
"Licenses",
"www.example.com",
new ArrayList<>());
}
}
컨트롤러를 명세하기 위해서 다음과 같이 Swagger Annotation을 사용합니다.
@RestController
@Api(value = "Welcome")
@RequestMapping("/v1/api")
public class WelcomeController {
@ApiOperation(value = "exam", notes = "예제입니다.")
@ApiResponses({
@ApiResponse(code = 200, message = "OK !!"),
@ApiResponse(code = 500, message = "Internal Server Error !!"),
@ApiResponse(code = 404, message = "Not Found !!")
})
@GetMapping(value = "/welcome")
public ResponseEntity<String> welcome(@ApiParam(value = "이름", required = true, example = "홍길동") @RequestParam String name) {
return ResponseEntity.ok(name);
}
}