[빵빵] Swagger 적용하기

유보라·2022년 9월 19일
0

빵빵

목록 보기
2/2

안녕하세요! 오늘의 포스팅 주제는 Swagger입니다!

Spring boot를 이용하여 REST API를 개발하는 사람이라면, API 명세서를 작성해본 경험이 있을 것입니다. API 명세서는 해당 API에 대한 정보를 정리한 문서로, API를 사용하게 될 클라이언트와 다른 서버 개발자에게 공유하는 것이 그 목적입니다!

Swagger란?

Swagger는 Open Api Sepcification(OAS)를 위한 프레임워크로, API 문서 자동화와 테스트 기능을 제공해줍니다. Swagger를 이용하면 변경사항이 있을 때마다 API 명세서를 직접 작성하거나 API를 이해하기 위해 소스코드를 살펴 볼 필요가 없게 됩니다. 약속된 규칙에 따라 json, yml 형식으로 표현해주면 html 페이지로 문서화해주고, 이를 통해 API를 이해할 수 있게 됩니다.

Swagger 실습

Swagger 환경 설정

개발환경

Spring Boot 2.7.1
Swagger 3.0.0
Java 11

springfox 의존성 추가하기

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

SwaggerConfig 설정

@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

Swagger 화면

주소창에 다음 링크를 입력해봅시다.

localhost:{port#}/swagger-ui/
localhost:{port#}/swagger-ui/index.html

트러블 슈팅 : 404 error

처음에는 주소창에 localhost:{port#}/swagger-ui.html 으로 검색하였고, 다음과 같은 404 에러가 떴습니다.

이유는 springfox 3.0 이후 버전부터는 접속 링크가 다르기 때문이었습니다!
버전을 확인하셔서 올바른 링크로 접속하시면 될 것 같습니다.

자, 접속해보니 이런 화면이 뜹니다!

제가 적은 API_NAME, API_VERSION 등이 반영되어있습니다!

그러나 아직 각 API에 대한 설명이 부족하기 때문에, Controller에서 설명을 추가해줍시다.

Controller 코드 수정

@Api(tags = { "breads"})

Controller를 대표하는 최상단 타이틀 영역에 표시될 값을 적어줍니다.

@ApiOperation(value = "제목", notes = "설명")

각각의 함수 위에 제목과 설명을 표시해줍니다.

API를 알아볼 수 있도록 제목과 설명을 더해주었더니 위와 같이 바뀌었습니다 XD

이렇게 Example Value와 Response까지 알려줄 뿐더러, Try it out 버튼을 통해 테스트도 해볼 수 있습니다.

이제는 이런 방식으로 클라이언트 또는 다른 서버 개발자에게 간편하게 API를 전달하고 테스트할 수 있게 되었습니다.

profile
인하대학교 컴퓨터공학과 학생입니다😀

2개의 댓글

comment-user-thumbnail
2023년 2월 1일

글 잘봤습니다!. 근데 로컬에서 생성된 문서를 어떻게 다른사람한테 공유할 수 있죠?

1개의 답글