์ด๋ฒ์ 1์ธ ํ ์ด ํ๋ก์ ํธ๋ฅผ ์งํ ํด๋ณด๋ ค๊ณ ํ๋ค.
๋ฐฑ์๋๋ REST API ์ค๊ณ ๋ฐ ๋ฌธ์ํ ๋ฑ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ Swagger๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ค์ด๋ณด๋ ค๊ณ ํ๋ค.
์ค์จ๊ฑฐ(Swagger) ๋ Open Api Specification(OAS)๋ฅผ ์ํ ํ๋ ์์ํฌ์ด๋ค.
์ฆ, ๊ฐ๋จํ ๋งํด API ์คํ์ ๋ช ์ธ, ๊ด๋ฆฌํ ์ ์๋ ํ๋ก์ ํธ/๋ฌธ์๋ผ๊ณ ์ ์ํ ์ ์๋ค.
์งํํ๋ ค๋ ํ ์ดํ๋ก์ ํธ๋ ๊ฐ์ธ ํ๋ก์ ํธ์ด๋ค ๋ณด๋ ๋์์ธ๋ ๊น๋ํ๊ฒ ์ ๋์ค๊ณ , ๋ฌธ์ํ์ ์๊ฐ์ ๋ง์ด ์ฐ๊ณ ์ถ์ง ์์๋ค.์ด๋ ๊ฒ ๊ท์ฐฎ์ ์ผ์ ์๋ํ ์ํค๋ ๊ฒ ํ๋ฅญํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ ์ด๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Swagger๋ผ ์๊ฐ๋ค์ด ์ฌ์ฉํ๊ฒ ๋์๋ค.
Swagger ์ฌ์ฉ์ ์ํด pom.xml์ ํด๋น ์์กด์ฑ ์ถ๊ฐ ํด์ผํ๋ค.
<!-- springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- springfox-swager-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
swagger ์ค์ ์ ์ํด SwaggerConfig ํด๋์ค๋ฅผ ์์ฑํ๋ค.
@EnableSwagger2
@Configuration
public class SwaggerConfig {
@Bean
public Docket api(){
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.select()
.apiInfo(getApiInfo())
.apis(RequestHandlerSelectors.basePackage("com"))
.paths(PathSelectors.any())
.build();
}
private ArrayList<ResponseMessage> getArrayList() {
ArrayList<ResponseMessage> lists = new ArrayList<ResponseMessage>();
lists.add(new ResponseMessageBuilder().code(500).message("500Error").build());
lists.add(new ResponseMessageBuilder().code(403).message("403Error").build());
lists.add(new ResponseMessageBuilder().code(401).message("401rror").build());
return lists;
}
public ApiInfo getApiInfo() {
return new ApiInfo(
"Service REST API Documentation",
"REST Api Documentation",
"1.0",
"localhost:8080",
new Contact("hongjun","","hongjun@velog.com"),
"Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList<VendorExtension>());
}
}
useDefaultResponseMessages()
select()
apiInfo()
apis()
paths()
๐ก ์์ธํ Docket Bean์ ์ค์ ๋ฐฉ๋ฒ ๋ฐ ์ค๋ช ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@Api(value = "SwaggerController")
@RequestMapping("/v1/api")
@RestController
public class SwaggerController {
@ApiOperation(value = "this is test!", notes = "note!!!!!")
@GetMapping(value = "/board")
public Map<String, String> selectOneBoard(@ApiParam(name = "first param", value = "first value", required = true) String input) {
Map<String, String> result = new HashMap<>();
result.put("author", "hongjun");
result.put("content", "V1 API ๋ด์ฉ");
return result;
}
}
value
: ์ฌ์ฉ์ ์ง์ ์ด๋ฆ์ ๋ถ์ผ ์ ์๋ค. tags ์ฌ์ฉ์ ๋ฌด์๋๋ค. tags
: ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ ํ๊ทธ๋ฅผ ์ ์ํ ์๋ ์๋ค. value
: API์ ๋ํ ์์ฝ์ ์์ฑํ๋ค. ์ ๋๋ก ํ์๋๋ ค๋ฉด 120์ ์ดํ์ฌ์ผ ํ๋ค. notes
: API์ ๋ํ ์์ธํ ์ค๋ช
์ ์์ฑํ๋ค. name
: ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ์์ฑํ๋ค. value
: ํ๋ผ๋ฏธํฐ ์ค๋ช
์ ์์ฑํ๋ค. required
: ํ์ ํ๋ผ๋ฏธํฐ์ด๋ฉด true, ์๋๋ฉด false๋ฅผ ์์ฑํ๋ค. ์ฌ๊ธฐ๊น์ง ๊ธฐ๋ณธ์ ์ธ Swagger๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์๋ค.
๋ด๊ฐ ๊ฐ๋ฐ์ ํ ๊ฒ์ ์ฝ๊ฒ ๋ฌธ์ํ ํ ์์๊ณ , ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฝ๊ฒ ์์๋ณผ ์ ์๋๋ก ํ๋ค๋ ์ ์์ Swagger๋ฅผ ๋ง์ด ํ์ฉํ ๊ฒ์ผ๋ก ์์ํ๋ค ๐