This is an old revision of the document!
Swagger
Swagger는 REST API를 설계, 빌드, 문서화 및 사용하는 데 도움이 될 수 있는 OpenAPI 사양을 기반으로 구축된 오픈 소스 도구 세트이며, 이 swagger를 프로젝트에 적용 방법을 설명한다.
Configuration
의존성 설정 (gradle)
- ~/build.gradle 파일에 아래 내용 추가
dependencies {
compile 'io.springfox:springfox-swagger2:2.9.2'
compile 'io.springfox:springfox-swagger-ui:2.9.2'
}
설정 클래스 작성
- Application 클래스가 있는 패키지에(예, com.gsc.process.integration) config 패키지를 추가하고(com.gsc.process.integration.config가 된다), SwaggerConfiguration.java 파일을 생성하여 아래 내용을 입력한다.
package com.gsc.process.integration.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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 springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
private ApiInfo swaggerInfo() {
return new ApiInfoBuilder()
.title("GSC Process Integration - Swagger Examples")
.description("GSC Process Integration Sample API Document")
.version("0.0.1")
.build();
}
@Bean
public Docket swaggerApi() {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.select()
.apis(RequestHandlerSelectors.basePackage("com.gsc.process.integration"))
.paths(PathSelectors.ant("/api/**"))
//.paths(PathSelectors.ant("/**"))
.build()
.apiInfo(swaggerInfo());
}
}
- @Configuration: 설정 클래스 임을 나타내는 annotation
- @EnableSwagger2: Swagger2 버전 활성화 annotation
- ApiInfo swaggerInfo() : Swagger UI에 표시되는 설정 정보. title(), description(), version()
- Docket swaggerApi() : Swagger 설정의 핵심이되는 Bean, swagger 스프링 MVC 프레임워크를 사용해 스웨거 문서 생성을 구성하는 빌더 클래스
- useDefaultResponseMessages()
- false로 설정하면, Swagger에서 제공해주는 응답 코드(200, 401, 403, 404)에 대한 기본 메시지를 제거한다.
- 불필요한 응답 코드와 메세지 제거하기 위함이며, 컨트롤러에 명시한다.
- groupName()
- Docket Bean이 한 개일 경우 기본 값은 default이므로, 생략 가능하다.
- 여러 Docket Bean을 생성했을 경우 groupName이 충돌하지 않아야 하므로, 버전을 명시한다.
- select() : ApiSelectorBuilder를 생성한다.
- apis() :
- api 스펙이 작성되어 있는 패키지를 지정한다.
- RequestMapping( GetMapping, PostMapping )이 선언된 API를 문서화 한다.
- paths() : apis()로 선택되어진 API 중 특정 path 조건에 맞는 API들을 다시 필터링하여 문서화한다.
- apiInfo()
- 제목, 설명 등 문서에 대한 정보들을 보여주기 위해 호출한다.
- 파라미터 : title, description, version, termsOfServiceUrl, contact, license, licenseUrl, vendorExtensions
Model 작성 및 주요 annotation
- 어플리케이션의 Model을 작성할 때 swagger 어노테이션을 이용한다.
package com.gsc.process.integration.sample;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@SuperBuilder
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "공통 코드 모델")
public class SampleApiModel {
@ApiModelProperty("그룹 코드")
private String grpCd;
@ApiModelProperty("상세 코드")
private String dtlCd;
@ApiModelProperty("코드명")
private String cdNm;
@Data
public static class Criteria {
@ApiModelProperty("사용여부")
private String useYn;
}
}
- @ApiModel: 스웨거 모델의 추가 정보를 제공
- @ApiModelProperty(name = “”, example = “”): 모델 속성의 데이터를 추가하고 조작
- name : 이름
- example : 설명
Controller 작성 및 주요 annotation
- 어플리케이션의 Controller를 작성할 때 swagger 어노테이션을 이용한다.
package com.gsc.process.integration.sample;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@Api("OpenAPI for GSC Process Integration Project")
@RestController
public class SampleApiController {
@Autowired SampleApiService sampleApiService;
@GetMapping("/api/sample/return-map-api")
@ApiOperation(value = "Map 반환 API", notes = "Map을 반환하는 API")
public Map<String, Object> returnMapApi() {
Map<String, Object> map = new HashMap<>();
map.put("test1", 1);
map.put("test2", 2);
return map;
}
@GetMapping("/api/sample/cmm-code")
@ApiOperation(value = "공통 코드 반환", notes = "공통 코드 전체 리스트 반환")
public List<SampleApiModel> getAllCommonCode(@ApiParam(value = "사용 여부", required = false, example = "Y") @RequestParam String useYn) {
return sampleApiService.getAll(null);
}
}
- @Api(value = “”, tags = “”) : 해당 클래스가 Swagger 리소스라는 것을 명시한다.
- value : 태그를 작성한다.
- tags : tags를 사용하여 여러 개의 태그를 정의한다.
- @ApiOperation(value = “”, notes =“”) : 한 개의 operation(즉 API URL과 Method)을 선언한다.
- value : API에 대한 간략한 설명(제목 같은 느낌으로)으로 작성한다.
- notes : 자세한 설명을 작성한다.
- @ApiResponse(code = number, message = “” : operation의 가능한 response 명시
- code : 응답 코드를 작성한다.
- message : 응답에 대한 설명을 작성한다.
- responseHeaders : 헤더를 추가한다.(Optional)
- @ApiResponses: 여러 ApiResponse 객체 리스트를 허용하는 래퍼
- @ApiParam(value = “”, required = boolean, example = “”) : 파라미터에 대한 정보 명시
- value : 파라미터 정보를 작성한다.
- required : 필수 파라미터이면 true, 아니면 false를 작성한다.
- example : 테스트를 할 때, 보여줄 예시를 작성한다.
- @ApiImplicitParam(name = “”, value = “”, required = true/false, dataType = “”, paramType = “”, defaultValue = “”) : Request Parameter 설명
- @ApiIgnore : @ApiImplictParam으로 선언하지않은 parameter 정보들을 swagger UI에서 제외.
접근 방법
- 웹 브라우저의 주소창에 http://localhost:8080/swagger-ui.html 입력하여 접속
기타
기타 annotation
- @Authorization: 리소스나 오퍼레이션에 사용되는 권한 부여 체계를 선언
- @AurhorizationScope: OAuth2 인증 범위를 설명
- @ResponseHeader: 응답의 일부로 제공될 수 있는 헤더를 나타낸다
- @SwaggerDefinition: 생성된 스웨거 정의에 추가할 정의 레벨 속성
- @Info: 스웨거 정의의 일반 메타 데이터
- @Contact: 스웨거 정의를 위해 연락할 사람을 설명하는 속성
- @License: 스웨거 정의의 라이센스를 설명하는 속성
official swagger site
- main : https://swagger.io
- swagger2 document : https://swagger.io/docs/specification/2-0/basic-structure/