====== 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 returnMapApi() { Map map = new HashMap<>(); map.put("test1", 1); map.put("test2", 2); return map; } @GetMapping("/api/sample/cmm-code") @ApiOperation(value = "공통 코드 반환", notes = "공통 코드 전체 리스트 반환") public List 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/ ==== a ==== * [[https://bcp0109.tistory.com/326|Spring Boot Swagger 3.x 적용]] * [[https://blog2.deliwind.com/20201127/java-swagger-ui-3-0-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/|java-swagger-ui-3.0-사용하기]]