Swagger를 자세하게 작성해보자.
사실 프로젝트를 진행해가며 이렇게 자세하게 Swagger를 적어놓았던 적은 없었다.
이렇게 자세하게 적지 않아도 어느정도 알았을 뿐 아니라, 어차피 보여지는 부분도 아니라서 그냥 어느정도 알아 볼 수 있게만 했었었다.
하지만 이번에는 프론트 하는 팀원 중에 프로젝트를 처음하는 사람도 있고, 프로젝트를 모두 Public으로 공개할 것이라서 보기도 좋게 자세하게 작성해보려 한다.
일단 Swagger 설정
당연히 gradle에 의존성을 추가 해야한다.
그리고 항상 까먹는 이것
spring.mvc.pathmatch.matching-strategy = ant_path_matcher
application.properties에 이렇게 작성을 해야 Swagger를 추가하고 실행 할 때에 에러가 발생하지 않는다.
그 다음은 Swagger의 Config 작성
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.produces(getProduceContentTypes())
.useDefaultResponseMessages(true)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("cobo.blog"))
.paths(PathSelectors.any())
.build();
}
private Set<String> getProduceContentTypes() {
Set<String> produces = new HashSet<>();
produces.add("application/json;charset=UTF-8");
return produces;
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("CoBo")
.description("CoBo 기술 블로그 Swagger 입니다.")
.version("1.0.0")
.build();
}
}
항상 이렇게 작성해서 쓰다보니 이 부분은 복붙해 가는 것 같다.
이번에 추가한 게 있다면, produces에 어떤 content-type으로 응답하는 지 명시한 것
이제 Swagger에 json으로 응답한다고 표시가 된다.
가장 큰 단위인 컨트롤러부터 명시를 해보자.
컨트롤러에
@Api(tags = {"01. Home 화면에 사용하는 API"})
이렇게 annotation을 달아준다.
여기에 description도 달아줄 수 있지만, 이번에는 그냥 제목에 해당하는 tag만 넣으면 될 거 같아 추가하지 않았다.
이렇게 작성을 하면
이런 식으로 Controller에 이름이 달리게 된다.
이렇게 이름을 달아주면 페이지 단위로 API를 구분할 때 편하지 않을까?
그 다음은 API에 달아주는 annotation이다.
@GetMapping("/posts")
@ApiOperation(
value = "Tech Post 의 정보를 List 응답",
notes = "현재 전부 넘기고 있어서 몇페이지로 자를 건지 협의가 필요",
response = TechPostRes.class
)
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "페이지 번호", example = "1", required = true)
})
@ApiResponses({
@ApiResponse(code = 200, message = "응답 성공")
})
public ResponseEntity<List<TechPostRes>> getPosts(@RequestParam("pageNum") Integer pageNum){
return techService.getPosts(pageNum);
}
가장 위의 @GetMapping은 Get으로 호출한다이니까 그냥 pass
@ApiOperation의 value에 API의 제목?을 작성해준다. 이 부분이 가장 메인으로 나가게 되고, 그 다음에 무언가를 알려야 한다면 notes에 적어준다. 이 부분은 스웨거를 펼치면 나타나게 된다.
response는 어떤 DTO로 응답이 되는지를 알려주는 부분인데, 이게 Swagger의 어느 부분에 나타나는 지는 모르겠다...
@ApiImplicitParams는 필요한 Parameter에 대한 정보를 나타내는 부분이다.
@ApiImplicitParam로 하나만 작성할 수 있지만, 그래도 @ApiImplicitParams로 괄호를 열어서 사용한다.
name에는 어떤 parameter를 사용하는지, 그리고 value에는 그 파라미터에 대한 설명과 example로 데이터의 예시를 보여주고 required로 필수여부를 나타낸다.
@ApiResponses는 응답 코드에 대한 내용을 적어준다.
이부분도 @ApiResponse로 하나만 적을 수 있지만 그래도 s를 붙이고 괄호를 열어 사용한다.
code에 응답 코드를 작성하고, message에 해당 코드에 대한 정보를 나타낸다. 아직 예외처리를 하지 않아 현재는 200 하나만 작성이 되어 있다.
이렇게 작성을 하면
이런 식으로 Swagger가 보이게 된다.
마지막으로 DTO에 작성하는 부분이다.
@ApiModelProperty(
value = "TechPost 작성일자",
example = "20230723"
)
private String createdAt;
이런 식으로 value에는 해당하는 데이터가 어떤 데이터인지, example은 그 데이터에 대한 예시를 class의 멤버들에게 적어준다.
이렇게 작성을 하면
예시에는
이렇게 보이게 되고, Schema에는
이런식으로 어떤 데이터가 응답이 되는지 설명까지 나오게 된다.
여기까지 내가 사용한 Swagger 정리였다.
물론 대표적인 것들만 사용해 아직 모르는 부분들도 있겠지만, 이정도면 충분하다고 생각해 글을 작성하게 되었다.
'블로그 개발 프로젝트' 카테고리의 다른 글
CORS Error (0) | 2023.07.28 |
---|---|
JPA으로 Paging (0) | 2023.07.24 |
JPA TopBy (0) | 2023.07.24 |
@ManyToOne, @OneToMany (0) | 2023.07.24 |
스프링 초반 구조 설계 (0) | 2023.07.20 |