์ด๋ฒ ๋ ๋ฒจ ์๊ตฌ ์ฌํญ์์ ๊ฒ์๊ธ ์ ์ฒด ์กฐํ ๊ธฐ๋ฅ๊ณผ ๊ฒ์๊ธ ๊ฒ์ ๊ธฐ๋ฅ์ด ๊ฐ๊ฐ ๋ถ๋ฆฌ๋์ด ์๋ ๊ฒ์ ๋ณด๊ณ ๋ ๊ธฐ๋ฅ์ api๋ฅผ ๋ถ๋ฆฌํ์๋ค.
public List<Post> findAllPost() {
return postRepository.findAll();
}
public List<Post> findAllPostByTitle(String keyword) {
if (keyword.length() < 1) {
throw new PostException(ErrorCode.BAD_REQUEST);
}
PostSearch postSearch = new PostSearch(keyword);
return postRepository.findAllByTitle(postSearch);
}
์ฐพ์๋ณด๋ API ๋ฌธ์๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉํ ํด์ด ๊ฝค ๋ง์๋ค.
Swagger, Notion, Postman ์ค์์ ๊ณ ๋ฏผํ๋ค๊ฐ Swagger๋ฅผ ์ ํํ๋ค.
๊ทธ ์ด์ ๋ Notion์ ๊ฒฝ์ฐ API ์คํ์ด ๋ณ๊ฒฝ๋๋ฉด ์ง์ ๋ชจ๋ ์์ ํด์ผ ํ๋ฏ๋ก ๊ท์ฐฎ์์ง ๊ฒ ๊ฐ์ ์ ์ธํ๊ณ , Postman์ ์ด๋์ ๋ ์๋ํ ํด์ฃผ๊ธด ํ์ง๋ง ๋ง์ฐฌ๊ฐ์ง๋ก ์ง์ ์์ฑํ ๋ถ๋ถ์ด ๊ฝค ์กด์ฌํ๋ค.
๊ทธ๋์ ์๋์ผ๋ก ๋ฌธ์๋ฅผ ์์ฑํด์ฃผ๋ Swagger๋ฅผ ํํ๋ค.
๋ฌด์๋ณด๋ค ๋ง์ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๊ทธ๋งํ ์ด์ ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค.
์์กด์ฑ์ ์ถ๊ฐํ๊ธฐ ์ํด์ build.gradle
ํ์ผ์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ์๋ค.
implementation 'io.springfox:springfox-boot-starter:3.0.0'
implementation 'io.springfox:springfox-swagger-ui:3.0.0'
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.OAS_30)
.useDefaultResponseMessages(true) // Swagger ์์ ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ณธ ์๋ต ์ฝ๋๋ฅผ ํ์ํ ๊ฒ์ด๋ฉด true
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("jscode.jscodestudy")) // Controller๊ฐ ๋ค์ด์๋ ํจํค์ง. ์ด ๊ฒฝ๋ก์ ํ์์ ์๋ api๋ง ํ์๋จ.
.paths(PathSelectors.any()) // ์ ํจํค์ง ์์ api ์ค ์ง์ ๋ path๋ง ๋ณด์ฌ์ค. (any()๋ก ์ค์ ์ ๋ชจ๋ api๊ฐ ๋ณด์ฌ์ง)
.build();
}
public ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("SpringBoot Rest API Documentation")
.description("jscode ์คํฐ๋์์ ์ฌ์ฉํ๋ API ๋ฌธ์์
๋๋ค.")
.version("0.1")
.build();
}
}
@Data
@ApiModel(value = "๊ฒ์๊ธ ์ ๋ณด")
public class PostDto {
@ApiModelProperty(name = "id", value = "์์ด๋", example = "1", required = true, dataType = "Long")
private Long id;
@NotBlank(message = "์ ๋ชฉ์ ๊ณต๋ฐฑ ์์ด 1๊ธ์ ์ด์ 15๊ธ์ ์ดํ์ฌ์ผ ํฉ๋๋ค.")
@Size(min = 1, max = 15, message = "์ ๋ชฉ์ ๊ณต๋ฐฑ ์์ด 1๊ธ์ ์ด์ 15๊ธ์ ์ดํ์ฌ์ผ ํฉ๋๋ค.")
@ApiModelProperty(name = "title", value = "์ ๋ชฉ", example = "์ ๋ชฉ", required = true, dataType = "String")
private String title;
@NotEmpty(message = "๋ด์ฉ์ 1๊ธ์ ์ด์ 1000๊ธ์ ์ดํ์ฌ์ผ ํฉ๋๋ค.")
@Size(min = 1, max = 1000, message = "๋ด์ฉ์ 1๊ธ์ ์ด์ 1000๊ธ์ ์ดํ์ฌ์ผ ํฉ๋๋ค.")
@ApiModelProperty(name = "content", value = "๋ด์ฉ", example = "๋ด์ฉ", required = true, dataType = "String")
private String content;
@ApiModelProperty(name = "createdTime", value = "์์ฑ์ผ์", required = true, dataType = "LocalDateTime")
private LocalDateTime createdTime;
Swagger์ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋
๊ณผ ์ด๋ฅผ ์ฌ์ฉํด์ ์ด๋ป๊ฒ API ๋ฌธ์๋ฅผ ์์ฑํ๋์ง ํ์ตํ๋ค.
Swagger์๋ springfox์ springdocs๊ฐ ์๋ค๊ณ ํ๋๋ฐ, ๋๋ springfox๋ฅผ ์ฌ์ฉํ๋ค.
Swagger ์ฌ์ฉ๋ฒ์ ์ตํ๋ฉด์ springdocs๋ ์ฌ์ฉํด์ ๋ค์ ์์ฑํด๋ณผ ์๊ฐ์ด๋ค.