[Spring] ์ค์จ๊ฑฐ(Swagger) ์ค์
- -
๋งค๋ฒ Thymeleaf, Jsp, Pebble, Freemarker ๋ฑ๋ฑ ํ ํ๋ฆฟ ์์ง๋ง ์ฌ์ฉํ๋ค ๋ณด๋ ํผ๋ธ๋ฆฌ์ฑ ์์ ๋ณธ์ ๋ฐ์์ ์ฌ์ฉ์ ํ๋ฉด์ ์์ฑํ๋ ์์ ์ ์ฃผ๋ก ํ๊ฒ ๋์๋๋ฐ, ์ด๋ฒ์๋ ์๋กญ๊ฒ JPA์ React ๋๋ Vue๋ฅผ ์ฌ์ฉํ์ฌ Back / Front๋ฅผ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ๊ณ Back ์ชฝ์์๋ Front ์ชฝ์ผ๋ก API ๊ท๊ฒฉ์๋ง ์ ๋ฌํ๋ ค๊ณ ํฉ๋๋ค.
์ด๋, ์ฌ์ด๋ ํ๋ก์ ํธ๋ก ์งํํ๋ค ๋ณด๋๊น ์๊ฐ์ ์ฌ์ ๊ฐ ๋ง์ง๊ฐ ์์์ API ์ฐ๋๊ท๊ฒฉ์๊น์ง ์์ฑํ๊ธฐ์๋ ์ด๋ ค์์ด ์์์ต๋๋ค. (ํ๊ณ์ธ๊ฑฐ ๋ค๋ค ์์์ฃ ?)
ํด์.. ์ด๋ฒ ๊ธฐํ์ ์ค์จ๊ฑฐ(Swagger) API๋ฅผ ํ์ฉํด์ API ์ฐ๋๊ท๊ฒฉ์๋ Swagger์๊ฒ ๋งก๊ฒจ๋ณด๋ ค๊ณ ํฉ๋๋ค.
#1. Swagger ์ค์
1. gradle ์ค์
// swagger
implementation 'io.springfox:springfox-boot-starter:3.0.0'
implementation 'io.springfox:springfox-swagger-ui:3.0.0'
2. maven ์ค์
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
3. SwaggerConfig.java ์๋ฐํ์ผ ์์ฑ ๋ฐ ์ค์
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
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 java.util.HashSet;
import java.util.Set;
/**
* ์ค์จ๊ฑฐ ์ค์
* @ApiIgnore ๋ฅผ ํตํด์ ์ ์ธ ๊ฐ๋ฅ
*/
@Configuration
@EnableWebMvc
public class SwaggerConfig {
private ApiInfo swaggerInfo() {
return new ApiInfoBuilder()
.title("SAMPLE API")
.description("SAMPLE API Docs")
.version("1.0")
.build();
}
@Bean
public Docket swaggerApi() {
return new Docket(DocumentationType.SWAGGER_2)
.consumes(getConsumeContentTypes())
.produces(getProduceContentTypes())
.apiInfo(swaggerInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("kr.co.sample"))
.paths(PathSelectors.any())
.build()
.useDefaultResponseMessages(false);
}
private Set<String> getConsumeContentTypes() {
Set<String> consumes = new HashSet<>();
consumes.add("application/json;charset=UTF-8");
consumes.add("application/x-www-form-urlencoded");
return consumes;
}
private Set<String> getProduceContentTypes() {
Set<String> produces = new HashSet<>();
produces.add("application/json;charset=UTF-8");
return produces;
}
}
- .apis()๋ Swagger API ๋ฌธ์๋ก ๋ง๋ค๊ธฐ ์ํ๋ BasePackage ๊ฒฝ๋ก. (ํ์)
- .path()๋ URL ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ฌ ํด๋น URL์ ํด๋นํ๋ ์์ฒญ๋ง Swagger API ๋ฌธ์๋ก ๋ง๋ ๋ค. (ํ์)
- .apiInfo()๋ Swagger API ๋ฌธ์์ ๋ํ ์ค๋ช ์ ํ๊ธฐํ๋ ๋ฉ์๋. (์ ํ)
- .consume()๊ณผ .produces()๋ ๊ฐ๊ฐ Request Content-Type, Response Content-Type์ ๋ํ ์ค์ . (์ ํ)
#2. Swagger Annotations ์ข ๋ฅ
1. @ApiOperation
@ApiOperation(
value = "์ฌ์ฉ์ ์ ๋ณด ์กฐํ"
, notes = "์ฌ์ฉ์์ ID๋ฅผ ํตํด ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์กฐํํ๋ค."
)
- ๋ฉ์๋ ์ค๋ช ์ด๋ ธํ ์ด์
2. @ApiImplicitParam
//๋จ์ผ
@ApiImplicitParam(
name = "id"
, value = "์ฌ์ฉ์ ์์ด๋"
, required = true
, dataType = "string"
, paramType = "path"
, defaultValue = "None"
)
//๋ณต์๊ฐ
@ApiImplicitParams({
@ApiImplicitParam(
name = "id"
, value = "์๊ฒฉ์ฆ ์์ด๋"
, required = true
, dataType = "string"
, paramType = "path"
, defaultValue = "None"
),
@ApiImplicitParam(
name = "fields"
, value = "์๋ต ํ๋ ์ข
๋ฅ"
, required = false
, dataType = "string"
, paramType = "query"
, defaultValue = ""
)
})
- Request Parameter ์ค๋ช ์ด๋ ธํ ์ด์
- dataType, paramType, required์ ๊ฒฝ์ฐ ํด๋น name์ ์ ๋ณด๊ฐ ์๋์ผ๋ก ์ฑ์์ง๋ฏ๋ก ์๋ต ๊ฐ๋ฅ
- @ApiImplictParams๋ก @ApiImplictParam์ ๋ณต์๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ
3. @ApiResponse
//๋จ์ผ
@ApiResponse(
code = 200
, message = "์ฑ๊ณต์
๋๋ค."
)
//๋ณต์๊ฐ
@ApiResponses({
@ApiResponse(code = 200, message = "์ฑ๊ณต์
๋๋ค.")
, @ApiResponse(code = 400, message = "์ ๊ทผ์ด ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค.")
})
- Response ์ค๋ช ์ด๋ ธํ ์ด์
- useDefaultResponseMessages(false)๋ฅผ SwaggerConfig.java์ ์ค์ ํด ์ฃผ๋ฉด, @ApiResponse๋ก ์ค๋ช ํ์ง ์์ 401, 403, 404 ์๋ต๋ค์ด ์ฌ๋ผ์ง
4. @ApiParam
@ApiParam(value = "์ฌ์ฉ์ ID", required = true)
- Dto Field ์ค๋ช
- @ApiParam Annotation์ผ๋ก DTO์ field์ ๋ํ ์ค๋ช ์ถ๊ฐ ๊ฐ๋ฅ
5. @ApiModelProperty
@ApiModelProperty(
name = "id"
, example = "example1"
)
- Dto Field ์์ ์ค๋ช
- @ApiModelProperty Annotation์ ์ฌ์ฉํ๋ DTO Class Field์ ์ถ๊ฐํ๋ฉด, ํด๋น DTO Field์ ์์ Data ์ถ๊ฐ ๊ฐ๋ฅ
6. @ApiIgnore
@ApiIgnore
- Swagger UI ์ ๋ฌด์ (์ ์ธ)
'Back-End > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Filter, Interceptor, AOP ์ ๋ฆฌ (0) | 2024.02.21 |
---|---|
[SpringBoot] ์คํ ๋ฐฐ๋ ๋ณ๊ฒฝ ๋ฐฉ๋ฒ (0) | 2023.02.06 |
[SpringBoot] ์๋ฐ ํ์ผ์ด ์ธ์๋์ง ์์ ๋ (0) | 2023.02.04 |
[Spring] @Controller, @RestController ์ฐจ์ด์ (0) | 2023.02.04 |
[SpringBoot] IntelliJ์์ Springboot + gradle ์คํํ๊ธฐ (0) | 2023.02.04 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค. ๐