
API 문서:
。API를 개발자가 파악하여 사용하도록 명확한가이드라인을 제공하는문서
▶ Web application 개발 시백엔드팀이 구축한API를swagger로문서화하여프론트엔드로 전달하여API logic의 이해를 높이는 역할을 수행.
ex) 카카오 REST API Document
API 문서 명세종류
。API의 문서화를 수행하기 위한API Specification format
▶API를문서화하여프론트엔드등의개발자가 쉽게 이해하고 테스트할 수 있도록함.
。API를 정해진 규칙에 맞게.jsonor.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:
。API를OAS사양으로API 명세를 정의하는Open API Document를 자동으로 생성하는프레임워크
▶어노테이션기반이므로 활용하기 간편
。Controller들을Controller class별로 자동으로 문서화.
。해당API가 어떤logic을 수행하고, 어떤Input을 요청하며,API의Output은 무엇인지 정리하여 자동으로문서화
▶개발자가API Document를 직접 작성할 필요가 없음.
。API 문서를JSON / YAML 포맷으로 제공(/v3/api-docs)하거나SwaggerUI를 통해웹상에서OAS API Document에 대한시각화 HTML 페이지를 쉽게 조회 및 테스트 가능
。Controller Class에요청 & 응답뿐만 아니라Swagger의API 문서화기능을 작성해야하므로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,YAML로API 문서를 자동 생성
▶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-docs에API 문서가JSON으로 생성 및Swagger UI를 통해웹에서API Document가시각화된HTML 페이지를 조회가능
Swagger UI:localhost:8080/swagger-ui/html
。OAS의API Document와 상호작용하여Web UI로 볼 수 있는 기능
▶/v3/api-docs의API Document를웹에서 시각화하는HTML 페이지가 자동생성
。Postman처럼 간편하게API 테스트를 수행할 수 있음
。Controller에서 사용되는Request & Response DTO에 대한Schema 정보도 조회가능
▶ 각DTO의field우측빨간색 별표는null이거나공백이면 안된다는 표시를 의미
OpenAPI JSON
http://localhost:8080/v3/api-docs
。OAS의API 명세에 대한정의를JSON Format으로 제공
▶ 해당페이지로 검색하는 경우API에 관한OpenAPI에 관한 정보를JSON format의API Document로 확인 가능
。클라이언트가 해당API의Resource,Action,HTTP Message Structure에 관한 정보를 손쉽게 확인가능
。openapi:OAS의 Version
。info:API 문서의metadata
。servers: 테스트가 가능한 서버에 관한 정보
。paths: 각Controller에서 Mapping한URL 엔드포인트에 대한 정보
。components:API에서 사용하는DTO의schema 정보
Swagger관련어노테이션
。어노테이션적용 시Swagger UI와/v3/api-docs의json에 반영
@Tag(name = "지정할 컨트롤러클래스명")
。Swagger에 의해 표시될Controller Class의명칭을 임의로 설정@Tag(name="멤버컨트롤러", description="설명") @RestController public class MemberController {}
▶컨트롤러 클래스별로 정의 시 다음처럼 도출됨.
@ApiResponse(responseCode = "HTTP상태코드" , description = "설명")
。해당Controller의API에서 발생할 수 있는 가능성이 존재하는HTTP Status Code및description를 정의하는어노테이션
▶ 이후Swagger를 통한API 문서에서 생성됨
。API 문서에는@ResponseStatus뿐만아니라 해당어노테이션의Http Status Code도 추가됨
@ApiResponses(value = { @ApiResponse(..) , @ApiResponse(..), .. })
。선언된Controller의API에서 발생할 수 있는 여러@ApiResponse들을그루핑하는어노테이션
▶Controller는200의http status code뿐만 아니라500등 해당API 컨트롤러에서 발생할 수 있는 모든CASE의Http 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 문서에서단위 Controller별API의 기능을 정의하는어노테이션
。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 );