안녕하세요! 오늘의 포스팅 주제는 Swagger입니다!
Spring boot를 이용하여 REST API를 개발하는 사람이라면, API 명세서를 작성해본 경험이 있을 것입니다. API 명세서는 해당 API에 대한 정보를 정리한 문서로, API를 사용하게 될 클라이언트와 다른 서버 개발자에게 공유하는 것이 그 목적입니다!
Swagger는 Open Api Sepcification(OAS)를 위한 프레임워크로, API 문서 자동화와 테스트 기능을 제공해줍니다. Swagger를 이용하면 변경사항이 있을 때마다 API 명세서를 직접 작성하거나 API를 이해하기 위해 소스코드를 살펴 볼 필요가 없게 됩니다. 약속된 규칙에 따라 json, yml 형식으로 표현해주면 html 페이지로 문서화해주고, 이를 통해 API를 이해할 수 있게 됩니다.
Spring Boot 2.7.1
Swagger 3.0.0
Java 11
build.gradle > dependencies 우클릭 > generate > 'springfox' 검색
아래 3개를 Add해줍니다! springfox-boot-starter 만 add 해도 된다고 알고 있는데, 우선 전 다 해줬습니다😀
그리고 swagger가 spring boot 2.6 이후 버전에서는 path가 달라 오류가 발생한다고 해서 application.yml에 다음 코드를 추가해주었습니다. 이렇게 지정해주면 오류가 발생하지 않는다고 하네요!
spring:
mvc:
pathmatch:
matching-strategy:ant_path_matcher
@Configuration
@EnableSwagger2
public class SwaggerConfig {
private static final String API_NAME = "Bbang0 API";
private static final String API_VERSION = "0.0.1";
private static final String API_DESCRIPTION = "Bbang0 API 명세서입니다.";
@Bean
public Docket api() {
Parameter parameterBuilder = (Parameter) new ParameterBuilder()
.name(HttpHeaders.AUTHORIZATION)
.description("Access Tocken")
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false)
.build();
List<Parameter> globalParameters = new ArrayList<>();
globalParameters.add(parameterBuilder);
return new Docket(DocumentationType.SWAGGER_2)
.globalOperationParameters(globalParameters)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.bbang0.adapter.controller"))
.paths(PathSelectors.any())
.build();
}
public ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title(API_NAME)
.version(API_VERSION)
.description(API_DESCRIPTION)
.build();
}
}
ApiInfo
-> API의 이름이 무엇이고 현재 버전은 어떻게 되는지 정보를 적어주면 됩니다.
ParameterBuilder
-> API를 테스트 할 때 모든 API에 전역 파라미터를 설정해줍니다.
RequestHandlerSelectors.basePackage(String packageName)
-> 스웨거를 적용해줄 클래스의 package 명을 적어줍니다.
PathSelectors.any()
-> 해당 package 하위에 있는 모든 url에 적용해줍니다.
출처 : https://kim-jong-hyun.tistory.com/49
주소창에 다음 링크를 입력해봅시다.
localhost:{port#}/swagger-ui/
localhost:{port#}/swagger-ui/index.html
처음에는 주소창에 localhost:{port#}/swagger-ui.html 으로 검색하였고, 다음과 같은 404 에러가 떴습니다.
이유는 springfox 3.0 이후 버전부터는 접속 링크가 다르기 때문이었습니다!
버전을 확인하셔서 올바른 링크로 접속하시면 될 것 같습니다.
자, 접속해보니 이런 화면이 뜹니다!
제가 적은 API_NAME, API_VERSION 등이 반영되어있습니다!
그러나 아직 각 API에 대한 설명이 부족하기 때문에, Controller에서 설명을 추가해줍시다.
@Api(tags = { "breads"})
Controller를 대표하는 최상단 타이틀 영역에 표시될 값을 적어줍니다.
@ApiOperation(value = "제목", notes = "설명")
각각의 함수 위에 제목과 설명을 표시해줍니다.
API를 알아볼 수 있도록 제목과 설명을 더해주었더니 위와 같이 바뀌었습니다 XD
이렇게 Example Value와 Response까지 알려줄 뿐더러, Try it out 버튼을 통해 테스트도 해볼 수 있습니다.
이제는 이런 방식으로 클라이언트 또는 다른 서버 개발자에게 간편하게 API를 전달하고 테스트할 수 있게 되었습니다.
글 잘봤습니다!. 근데 로컬에서 생성된 문서를 어떻게 다른사람한테 공유할 수 있죠?