API Documentation - Swagger

TopOfTheHead·2025년 10월 30일
post-thumbnail

API 문서 :
API를 개발자가 파악하여 사용하도록 명확한 가이드라인을 제공하는 문서
▶ Web application 개발 시 백엔드팀이 구축한 APIswagger문서화하여 프론트엔드로 전달하여 API logic의 이해를 높이는 역할을 수행.
ex) 카카오 REST API Document

API 문서 명세 종류
API의 문서화를 수행하기 위한 API Specification format
API문서화하여 프론트엔드 등의 개발자가 쉽게 이해하고 테스트할 수 있도록함.

API를 정해진 규칙에 맞게 .json or .yaml으로 정의됨

  • Swagger Specification :
    。초창기 API 설계에 대한 API 문서화 표준

    JSON , YAML을 지원.

    현재 OAS ( Open API specification )으로 이름이 변경되어 대체
    Swagger라는 키워드는 Documentation tool의 일종으로 사용됨.

  • OAS ( Open API Specification ) :
    Swagger Specification 기반으로 발전된 형태의 현재 API 문서의 공식 표준

    JSON , YAML을 지원.
    。누구나 사용하도록 API endpoint가 개방됨.
    ▶ 이를 통해 API Source code를 보거나 추가적인 API Document를 참고할 필요 없이 서비스를 이해할 수 있음.

    OAS명세로서 swagger를 통해 /v3/api-docs에서 다음처럼 출력

API Documentation Tool
Swagger, RestDocs가 존재

  • Swagger :
    APIOAS 사양으로 API 명세를 정의하는 Open API Document자동으로 생성하는 프레임워크
    어노테이션 기반이므로 활용하기 간편

    Controller들을 Controller class 별로 자동으로 문서화.

    。해당 API가 어떤 logic을 수행하고, 어떤 Input을 요청하며, APIOutput은 무엇인지 정리하여 자동으로 문서화
    개발자API Document를 직접 작성할 필요가 없음.

    API 문서JSON / YAML 포맷으로 제공( /v3/api-docs )하거나 SwaggerUI를 통해 상에서OAS API Document에 대한 시각화 HTML 페이지를 쉽게 조회 및 테스트 가능

    Controller Class요청 & 응답 뿐만 아니라 SwaggerAPI 문서화 기능을 작성해야하므로 SRP 원칙 위배
    유지보수 가 어렵다.

API 문서 생성 시 고려사항

  • API 개발클라이언트에게 전달해야하는 사항
    클라이언트가 다음 사항을 잘 알고 있어야 API를 사용 가능
    ▶ 다음 내용들을 Swagger를 통해 자동 생성

    Resource ( 자원 )
    Actions ( 수행 작업 )
    Validation을 포함한 HTTP Request & Response에 사용되는 DTO 구조

  • API Document가 최신으로 Up-to-date 되었는지, 코드와 정확하게 동기화되었는지 확인

  • API Document일관된 형식을 유지하는지 보장
    。일반적인 기업에서는 수백개의 API가 존재하므로 사용자 입장에서 각자 일관된 형식으로 구성되어야 사용이 간편

API 문서 자동 생성
Swagger를 활용하여 OAS( Open API Document )를 자동 생성

  • springdoc-openapi 라이브러리 Dependency 추가하여 API 문서 생성
    springdoc-openapi : spring-doc 사이트
    Spring 프로젝트를 기반으로 OAS API 문서의 자동 생성을 수행하는 라이브러리

    Application Runtime@RestController, @RequestMapping, @GetMapping, @RequestParam 등의 어노테이션을 검사하여 API를 추론.

    JSON, YAMLAPI 문서를 자동 생성
    Swagger UI와 자동으로 연동되어 에서 확인가능

    springdoc-openapi v2.6.0 기준 OpenAPI 3, Spring-boot v3, swagger-ui를 지원.
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0'

。해당 의존성build.gradle에 정의 시 /v3/api-docsAPI 문서JSON으로 생성 및 Swagger UI를 통해 에서 API Document시각화HTML 페이지를 조회가능

  • Swagger UI : localhost:8080/swagger-ui/html
    OASAPI Document와 상호작용하여 Web UI로 볼 수 있는 기능
    /v3/api-docsAPI Document에서 시각화하는 HTML 페이지가 자동생성

    Postman처럼 간편하게 API 테스트를 수행할 수 있음


    Controller에서 사용되는 Request & Response DTO에 대한 Schema 정보도 조회가능
    ▶ 각 DTOfield 우측 빨간색 별표null이거나 공백이면 안된다는 표시를 의미


  • OpenAPI JSON
    http://localhost:8080/v3/api-docs
    OASAPI 명세에 대한 정의JSON Format으로 제공
    ▶ 해당 페이지로 검색하는 경우 API에 관한 OpenAPI에 관한 정보를 JSON formatAPI Document로 확인 가능

    클라이언트가 해당 APIResource, Action, HTTP Message Structure에 관한 정보를 손쉽게 확인가능

    openapi : OAS의 Version
    info : API 문서metadata
    servers : 테스트가 가능한 서버에 관한 정보
    paths : 각 Controller에서 Mapping한 URL 엔드포인트에 대한 정보
    components : API에서 사용하는 DTOschema 정보

Swagger 관련 어노테이션

어노테이션 적용 시 Swagger UI/v3/api-docsjson에 반영

  • @Tag(name = "지정할 컨트롤러클래스명")
    Swagger에 의해 표시될 Controller Class명칭을 임의로 설정
@Tag(name="멤버컨트롤러", description="설명")
@RestController
public class MemberController {}


컨트롤러 클래스 별로 정의 시 다음처럼 도출됨.

  • @ApiResponse(responseCode = "HTTP상태코드" , description = "설명")
    。해당 ControllerAPI에서 발생할 수 있는 가능성이 존재하는 HTTP Status Codedescription를 정의하는 어노테이션
    ▶ 이후 Swagger를 통한 API 문서에서 생성됨

    API 문서에는 @ResponseStatus뿐만아니라 해당 어노테이션Http Status Code도 추가됨

  • @ApiResponses(value = { @ApiResponse(..) , @ApiResponse(..), .. })
    。선언된 ControllerAPI에서 발생할 수 있는 여러 @ApiResponse들을 그루핑하는 어노테이션
    Controller200http status code 뿐만 아니라 500 등 해당 API 컨트롤러에서 발생할 수 있는 모든 CASEHttp Status Code를 고려해야함

    @ApiResponses 또는 @ApiResponse 들을 API들에 공통적으로 적용하는 경우 클래스 레벨 , 특정 API에만 선언 시 메서드 레벨에 선언하여 적용
@ApiResponses(value = {
		@ApiResponse(responseCode="400", description = "유효성 검사 실패"),
		@ApiResponse(responseCode = "500", description = "서버 에러")
	})
	@PostMapping("/members")
	@ResponseStatus(HttpStatus.CREATED)
	public void create(@Valid @RequestBody MemberCreateRequest request) {}


▶ 추가된 HTTP Status Code를 확인 가능

  • Swagger 어노테이션 추상화
    。복수의 Controller에서 동일한 Swagger 어노테이션을 사용하는 경우 추상클래스추상화하여 동일하게 상속받도록 구현할 수 있다.
    어노테이션을 선언한 클래스 상속 시 해당 어노테이션선언한 것과 동일한 효과가 존재

    // Swagger에 표시할 각 API의 HTTP Status를 API 전체에 일괄적으로 적용하기위해  클래스 레벨 선언
    @ApiResponses(value = {
    	@ApiResponse(responseCode="400", description = "유효성 검사 실패"),
    	@ApiResponse(responseCode = "500", description = "서버 에러")
    })
    public abstract class SwaggerSupporter {
    }


  • @Hidden
    API 문서내 포함하지 않을 클래스를 설정하는 용도로 사용하는 어노테이션
    ▶ 주로 @RestControllerAdvice 등이 선언된 클래스에 함께 선언

  • @Schema(name = "API문서에서 표현될 명칭")
    。해당 DTO 또는 클래스API문서내에서 표현될 별칭을 지정하는 어노테이션
    ▶ 주로 인터페이스 또는 중첩 클래스로 구현된 DTO에 별칭을 부여시 주로 활용됨.
    <SPAN
    。주로 클래스명칭 중복을 방지하는 용도로 사용
    명칭 중복될 경우 덮어쓰기되므로.

  • @Parameter(hidden=true)
    Controller매개변수에 선언하여 API 문서에 해당 매개변수를 표시할건지의 여부를 설정

  • @Operation
    메서드 레벨에서 선언하여 Swagger 문서에서 단위 ControllerAPI의 기능을 정의하는 어노테이션

    parameters 지정 시 DTO 같은 경우는 자동으로 Swagger가 식별하여 이름과 설명을 작성하므로 QueryString이나 PathVariable에 대해서만 해당 parameter를 작성하는게 좋은거같다.
	@Operation(
		summary = "비밀번호 변경",
		description = "계정의 비밀번호 변경 관련 API",
		parameters = {
			@Parameter(name = "accountId" , description = "계정 ID")
		}
	)
	ResponseEntity<ApiResult<Void>> updatePassword(
		UUID accountId,
		AccountRequest.UpdatePassword request
	);

profile
공부기록 블로그

0개의 댓글