티스토리 뷰

반응형

오래된 레거시를 보니 swagger 1.x 기반이었는데, 세팅이 되다 말았는지 ui 형태로 볼수가 없었다. 그래서 과감하게 3.x 로 넘어가려고 했는데 오류가 나서 2.x 로 띄운걸 정리하고자 한다. 버전별로 swagger 를 볼 수 있는 주소가 다른데, 2.x 버전대는 정상적으로 세팅했다면 8080 포트로 띄웠다고 가정하면, 아래와 같은 url 로 로컬에서 확인이 가능하다. (참고로 swagger 버전별로 저 주소패턴도 달라진다)

  • API 주소 : http://127.0.0.1:8080/v2/api-docs
  • UI 주소 : http://127.0.0.1:8080/swagger-ui.html

의존성 추가하기

우선 과거에 있던 swagger 1.x 버전대는 제거하고 다음과 같이 maven 의존성을 추가했다.

참고로 나는 스프링부터 1.4.x 버전으로 꽤 낮은 버전인데도 swagger 2.x 버전대로 잘 동작했으니 참고하자.

 

pom.xml

<dependencies>
...
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>
...
</dependencies>

스프링부트 설정 코드 추가

스프링부트에서 Swagger 관련 정보를 추가하고, swagger-ui.html 을 로딩할 수 있도록 세팅하는 단계이다.

 

 

SwaggerConfig 관련 클래스 추가

package com.mypackage.sample;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
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 SwaggerConfig {

  /**
   * Swagger API 세팅.
   *
   * @return Swagger api 리턴
   */
  @Bean
  public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2)
      .useDefaultResponseMessages(false)
      .apiInfo(getApiInfo())
      .select()
      .apis(RequestHandlerSelectors.basePackage("com.mypackage.sample")) // 로딩될 패키지명
      .paths(PathSelectors.any())
      .build();
  }

  /**
   * API 정보.
   * @return API 정보를 담은값
   */
  public ApiInfo getApiInfo() {
      return new ApiInfoBuilder()
              .title("헬로 Swagger")
              .description("API 를 확인해봅시다.")
              .version("1.0")
              .build();
  }
}

Controller 에 정보 추가하기

지금까지는 Swagger2 를 보기위한 세팅이었고, Swagger 에서 정보를 추가하려면 Contoller 에서 swagger 용 어노테이션을 추가해줘야한다. 아래와 같이 @Api , @ApiOperation, @ApiParam 같은 어노테이션이 정보를 추가로 보여주기위한 용도이다.

 

참고로, swagger-ui 를 보는데, 로그에 다음과 같은 오류가 난다면, @ApiParam 에서 example 값을 채워주면 해결된다.

보통, PathVariable 의 타입이 long, int 인데, 빈값을 "" 으로 사용하려다가 실패난 케이스로 추정된다.

java.lang.NumberFormatException: For input string: ""

 

Swagger 어노테이션을 추가한 코드 샘플

//---- swagger 관련 어노테이션 start ------
@Api(value = "SampleContoller")
@SwaggerDefinition(tags = {@Tag(name = "SampleContoller",
        description = "샘플 컨트롤러")})
//---- swagger 관련 어노테이션 end ------        
        
@RestController
@RequestMapping("sample")
@ResponseBody
public SampleContoller {
...
  @ApiOperation(value = "delete sample",
    notes = "sample 에서 해당 id 기준의 값을 삭제한다.",
    httpMethod = "DELETE")
  @ResponseBody
  @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
  public void deleteSample(
      //---- swagger 관련 어노테이션 start ------
      @ApiParam(value = "sampleId", example = "1", defaultValue = "1", required = true)
      //---- swagger 관련 어노테이션 end ------     
      @PathVariable final Long sampleId) {
    sampleRepository.delete(sampleId);
  }
...
}

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함