728x170
해당 글에서는 Spring Boot 환경에서 Swagger를 정의하여 활용하는 방법들에 대해 알아봅니다
💡 [참고] Swagger에 대해 상세히 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
분류 | 링크 |
RESTful API 설계 방법 -1 : 이해하기 | https://adjh54.tistory.com/150 |
RESTful API 설계 방법 -2 : 구성하기 | https://adjh54.tistory.com/151 |
Spring Boot 2.x 환경에서 Swagger 이해하고 적용하기 : SpringDoc openAPI UI | https://adjh54.tistory.com/72 |
Spring Boot 3.x 환경에서 Swagger3 이해하고 적용하기-1 : SpringDoc OpenAPI Starter WebMVC UI 및 구성 방법 | https://adjh54.tistory.com/561 |
Spring Boot 3.x 환경에서 Swagger3 이해하고 적용하기 -2 : @RequestParam, @PathVariable, @RequestBody, @RequestHeader 정의 방법 | https://adjh54.tistory.com/618 |
Spring Boot 환경에서 Swagger 예제 Repository | https://github.com/adjh54ir/blog-codes/tree/main/spring-boot-swagger |
1) Swagger
💡 Swagger
- RESTful 웹 서비스를 설계, 구축, 문서화 및 사용할 수 있는 오픈 소스 소프트웨어 프레임워크를 의미합니다.
- 이를 통해 API의 구조와 동작을 정의하기 위한 도구와 사양 세트를 제공하여 API를 개발하고 유지하는 것을 더욱 쉽게 만들어줍니다. API의 엔드포인트, 매개변수, 응답 등을 정의하고 문서화할 수 있습니다.
- 어노테이션을 기반으로 작동하고 사용이 되며 API의 구조와 동작에 대해 정의를 합니다. 또한 Swagger를 이용하기 위해서는 라이브러리인 SpringFox나 SpringDoc OpenAPI를 사용해야 합니다.
- REST API에서 설계 과정 중 'API 문서화 단계'에서 이를 사용합니다.
1. Swagger를 활용하는 라이브러리
라이브러리 | 특징 | Spring Boot 호환성 | OpenAPI 버전 |
SpringFox Swagger2 | - Spring 기반 애플리케이션용 - 자동 Swagger 2.0 문서 생성 - 최근 업데이트 중단 |
Spring Boot 2.x까지 | Swagger2 |
SpringDoc OpenAPI UI | - Spring Boot 애플리케이션용 - 자동 OpenAPI 3 문서 생성 - 활발한 유지보수 |
Spring Boot 1.x, 2.x | Swagger3 |
SpringDoc OpenAPI Starter WebMVC UI | - Spring Boot 3.x용 - WebMVC 애플리케이션 지원 - Swagger UI 통합 |
Spring Boot 3.x | Swagger3 |
2. SpringDoc OpenAPI Starter WebMVC UI
💡 SpringDoc OpenAPI Starter WebMVC UI
- Spring Boot 3.x 버전과 호환되는 OpenAPI (Swagger) 문서 생성 라이브러리입니다.
- Spring Boot 3.x에서 WebMVC 애플리케이션을 위한 OpenAPI 3 (Swagger) 지원을 제공합니다.
- 자동으로 API 문서를 생성하고 Swagger UI를 통해 시각화합니다.
2) SpringDoc OpenAPI Starter WebMVC UI 주요 어노테이션
💡 SpringDoc OpenAPI Starter WebMVC UI 주요 어노테이션
- Spring Boot 3.x 버전으로 활용되는 SpringDoc OpenAPI Starter WebMVC UI 주요 어노테이션에 대해 알아봅니다.
1. 주요 어노테이션
어노테이션 | 설명 | 사용위치 |
@OpenAPIDefinition | API 문서의 전체적인 정보를 정의합니다. 제목, 설명, 버전 등을 설정할 수 있습니다. | 클래스 레벨 |
@Tag | API 그룹을 정의합니다. 컨트롤러나 메서드에 태그를 지정하여 API를 분류할 수 있습니다. | 클래스 또는 메서드 레벨 |
@Operation | API 엔드포인트에 대한 상세 정보를 제공합니다. 요약, 설명, 응답 등을 설정할 수 있습니다. | 메서드 레벨 |
@Hidden | Swagger UI에서 특정 API 엔드포인트나 모델을 문서에서 제외시킵니다. | 클래스, 메서드, 또는 필드 레벨 |
@Parameter | API 메서드의 파라미터에 대한 설명을 추가합니다. | 메서드 파라미터 레벨 |
@Parameters | 여러 개의 @Parameter 어노테이션을 그룹화하여 한번에 정의할 수 있습니다. | 메서드 레벨 |
@RequestBody | 요청 본문에 대한 설명을 추가합니다. 요청 데이터의 구조와 유효성을 정의할 수 있습니다. | 메서드 파라미터 레벨 |
@ApiResponse | API 응답에 대한 설명을 추가합니다. 상태 코드, 설명, 응답 스키마 등을 정의할 수 있습니다. | 메서드 레벨 |
@Schema | 모델 클래스나 필드에 대한 스키마 정보를 정의합니다. 데이터 타입, 설명, 제약조건 등을 설정할 수 있습니다. | 클래스 또는 필드 레벨 |
@Content | 요청/응답 본문의 미디어 타입과 스키마를 정의합니다. mediaType과 schema 속성을 통해 상세 설정이 가능합니다. | 메서드 또는 파라미터 레벨 |
@Hidden | 특정 API 엔드포인트나 모델을 문서에서 숨깁니다. | 클래스, 메서드, 또는 필드 레벨 |
@SecurityScheme | API 보안 스키마를 정의합니다. 인증 방식 등을 설정할 수 있습니다. | 클래스 레벨 |
@SecurityRequirement | 특정 API 엔드포인트에 대한 보안 요구사항을 정의합니다. | 클래스 또는 메서드 레벨 |
3) Swagger 활용하기-1 : API 파라미터(@RequestParam, @PathVariable) 정의하기
1. Spring Boot Web @RequestParam 어노테이션 활용방법
💡 Spring Boot Web @RequestParam 어노테이션 활용방법
- [GET] /api/v1/code/code, [GET] /api/v1/code/code2 엔드포인트의 API가 있습니다.
- 두 개의 API에서는 필수적으로 API 호출 요청 시 파라미터로 codeSq, codeNm를 받고 있습니다. 이에 대해서 정의를 합니다.
- 첫 번째, [GET] /api/v1/swagger/parameter API에서는 @Parameter 어노테이션을 통해서 각각을 명시하였습니다.
- 두 번째, [GET] /api/v1/swagger/parameters API에서는 @Parameters 어노테이션을 통해 일괄적으로 파라미터들에 대해 정의를 하였습니다.
어노테이션 | 설명 | 사용 위치 |
@Tag | API 그룹을 정의합니다. 컨트롤러나 메서드에 태그를 지정하여 API를 분류할 수 있습니다. | 클래스 또는 메서드 레벨 |
@Operation | API 엔드포인트에 대한 상세 정보를 제공합니다. 요약, 설명, 응답 등을 설정할 수 있습니다. | 메서드 레벨 |
@ApiResponse | API 응답에 대한 설명을 추가합니다. 상태 코드, 설명, 응답 스키마 등을 정의할 수 있습니다. | 메서드 레벨 |
@Parameter | API 메서드의 파라미터에 대한 설명을 추가합니다. | 메서드 파라미터 레벨 |
@Parameters | 여러 개의 @Parameter 어노테이션을 그룹화하여 한번에 정의할 수 있습니다. | 메서드 레벨 |
/**
* Swagger 테스트를 위해 구성한 Controller
*/
@Tag(name = "Swagger-Controller", description = "Swagger Parameter 관리 API 엔드포인트")
@RestController
@RequestMapping("/api/v1/swagger")
public class SwaggerParamController {
/**
* 어노테이션 @RequestParam으로 전달된 파라미터에 대해 Swagger 정의: @Parameter 활용
*
* @param codeSq
* @param codeNm
* @return
*/
@GetMapping("/parameter")
@Operation(summary = "@Parameter 활용예시", description = "@RequestParam + @Parameter 활용한 예시입니다.") // Swagger API 메서드 정의
@ApiResponse(responseCode = "200", description = "성공") // Swagger 응답값 반환
public ResponseEntity<List<CodeDto>> selectCode(
@RequestParam @Parameter(description = "코드 시퀀스", required = true) int codeSq, // Swagger 파리미터 정의
@RequestParam @Parameter(description = "코드 이름", required = true) String codeNm // Swagger 파라미터 정의
) {
List<CodeDto> temp = new ArrayList<>();
return new ResponseEntity<>(temp, HttpStatus.OK);
}
/**
* 어노테이션 @RequestParam으로 전달된 파라미터에 대해 Swagger 정의: @Parameters 활용
*
* @param codeSq
* @param codeNm
* @return
*/
@GetMapping("/parameters")
@Operation(summary = "@Parameters 활용예시", description = "@RequestParam + @Parameters 활용예시입니다.") // Swagger API 메서드 정의
@ApiResponse(responseCode = "200", description = "성공") // Swagger 응답값 반환
// Swagger 파리미터들 일괄 정의
@Parameters({
@Parameter(name = "codeSq", required = true, description = "코드 시퀀스"),
@Parameter(name = "codeNm", required = true, description = "코드 이름")
})
public ResponseEntity<List<CodeDto>> selectCode2(@RequestParam int codeSq, @RequestParam String codeNm) {
List<CodeDto> temp = new ArrayList<>();
return new ResponseEntity<>(temp, HttpStatus.OK);
}
}
1.1. @RequestParam + @Parameter Swagger 구성 확인
💡 @RequestParam + @Parameter Swagger 구성 확인
- [GET] /api/v1/swagger/parameter에 대해서 명시한 API 메서드 설명과 파라미터 설명을 확인하였습니다.
1.2. @RequestParam + @Parameters Swagger 구성 확인
💡 @RequestParam + @Parameters Swagger 구성 확인
- [GET] /api/v1/swagger/paramters에 대해서 명시한 API 메서드 설명과 파라미터 설명을 확인하였습니다.
2. Spring Boot Web @PathVariable 어노테이션 활용방법
💡 Spring Boot Web @PathVariable 어노테이션 활용방법
- [GET] /api/v1/swagger/{codeSq}/{codeNm} 엔드포인트의 API가 있습니다.
- API에서는 경로 변수로 codeSq, codeNm를 받고 있습니다.
- @Parameters 어노테이션을 통해 경로 변수에 대한 설명을 추가할 수 있습니다.
/**
* Swagger 테스트를 위해 구성한 Controller
*/
@Tag(name = "Swagger-Controller", description = "Swagger Parameter 관리 API 엔드포인트")
@RestController
@RequestMapping("/api/v1/swagger")
public class SwaggerParamController {
/**
* 어노테이션 @PathVariable 전달된 파라미터에 대해 Swagger 정의 : @Parameters 활용
*
* @return
*/
@GetMapping("/{codeSq}/{codeNm}")
@Operation(summary = "@Parameters 활용예시", description = "@PathVariable + @Parameters 활용예시입니다.") // Swagger API 메서드 정의
@ApiResponse(responseCode = "200", description = "성공") // Swagger 응답값 반환
// Swagger 파리미터들 일괄 정의
@Parameters({
@Parameter(name = "codeSq", description = "코드 시퀀스", required = true),
@Parameter(name = "codeNm", description = "코드 이름", required = true)
})
public ResponseEntity<List<CodeDto>> selectCode3(@PathVariable int codeSq, @PathVariable String codeNm) {
List<CodeDto> temp = new ArrayList<>();
return new ResponseEntity<>(temp, HttpStatus.OK);
}
}
2.1. @PathVariable Swagger 구성 확인
💡 @Parameters Swagger 구성 확인
- [GET] /api/v1/swagger/{codeSq}/{codeNm}에 대해서 명시한 API 메서드 설명과 파라미터 설명을 확인하였습니다.
3. Spring Boot Web @RequestParam / @PathVariable + @Parameter 사전 데이터 구성 : example 속성 활용
💡 Spring Boot Web @RequestParam / @PathVariable + @Parameter 사전 데이터 구성 : example 속성 활용
- 클라이언트로부터 전달받은 파라미터 @RequestParam / @PathVariable에 대해서 사전 데이터 구성을 위해 ‘example’ 속성을 활용합니다.
💡 [참고] @Parameter 속성
속성 | 리턴 값 | 설명 |
allowEmptyValue | boolean | 파라미터가 빈 값을 허용하는지 여부 |
allowReserved | boolean | 예약된 문자(:/?#[]@!$&'()*+,;=)를 인코딩하지 않고 허용할지 여부 |
array | ArraySchema | 배열 타입 파라미터의 스키마 정의 |
content | Content[] | 파라미터의 미디어 타입과 스키마 정의 |
deprecated | boolean | 파라미터가 더 이상 사용되지 않는지 여부 |
description | String | 파라미터에 대한 설명 |
example | String | 파라미터의 예시 값 |
examples | ExampleObject[] | 여러 예시 값들을 정의 |
explode | boolean | 객체나 배열 파라미터를 분리하여 처리할지 여부 |
extensions | Extension[] | Swagger/OpenAPI 확장 속성 정의 |
hidden | boolean | Swagger UI에서 파라미터를 숨길지 여부 |
in | ParameterIn | 파라미터 위치(query, path, header, cookie) |
name | String | 파라미터 이름 |
ref | String | 파라미터 정의의 참조 위치 |
required | boolean | 필수 파라미터 여부 |
schema | Schema | 파라미터의 데이터 타입과 형식 정의 |
style | ParameterStyle | 파라미터 직렬화 방식(simple, form, matrix 등) |
💡 아래와 같이 @Parameter 어노테이션 내에 속성 example을 이용하여 각각 지정하였습니다. 이를 통해 default 값을 지정되었습니다.
/**
* Swagger 테스트를 위해 구성한 Controller
*/
@Tag(name = "Swagger-Controller", description = "Swagger Parameter 관리 API 엔드포인트")
@RestController
@RequestMapping("/api/v1/swagger")
public class SwaggerParamController {
/**
* 어노테이션 @PathVariable 전달된 파라미터에 대해 Swagger 정의 : @Parameters 활용
*
* @return
*/
@GetMapping("/{codeSq}/{codeNm}")
@Operation(summary = "@Parameters 활용예시", description = "@PathVariable + @Parameters 활용예시입니다.") // Swagger API 메서드 정의
@ApiResponse(responseCode = "200", description = "성공") // Swagger 응답값 반환
// Swagger 파리미터들 일괄 정의
@Parameters({
@Parameter(name = "codeSq", description = "코드 시퀀스", required = true, example = "1"),
@Parameter(name = "codeNm", description = "코드 이름", required = true, example = "HA264")
})
public ResponseEntity<List<CodeDto>> selectCode3(@PathVariable int codeSq, @PathVariable String codeNm) {
List<CodeDto> temp = new ArrayList<>();
return new ResponseEntity<>(temp, HttpStatus.OK);
}
}
3.1. @Parameters의 example 속성 활용
💡 @Parameters의 example 속성 활용
- 위에서 지정한 example 값을 통해서 기본적인 파라미터의 default 값을 지정하였습니다.
4) Swagger 활용하기-2 : API JSON 데이터 (@RequestBody) 정의하기
💡 Swagger 활용하기-2 : API JSON 데이터 (@RequestBody) 정의하기
- Parameter로 전달되는 값 외에 JSON 형태로 데이터 통신을 수행할 수 있습니다. 이에 대해서 JSON 타입 데이터에 대한 Swagger 정의를 알아봅니다.
💡 [참고] @Operation 정의하기
속성 | 리턴값 | 설명 |
deprecated | boolean | 작업을 더 이상 사용되지 않음으로 표시할 수 있습니다. |
description | String | 작업에 대한 자세한 설명을 제공합니다. |
extensions | Extension[] | 선택적 확장 기능 목록입니다. |
externalDocs | ExternalDocumentation | 이 작업에 대한 추가 외부 문서입니다. |
hidden | boolean | 작업을 숨김으로 표시할 수 있습니다. |
ignoreJsonView | boolean | 작업과 타입을 해석할 때 JsonView 어노테이션을 무시합니다. |
method | String | 이 작업의 HTTP 메서드입니다. |
operationId | String | 이 작업을 고유하게 식별하기 위해 타사 도구에서 사용하는 ID입니다. |
parameters | Parameter[] | 메서드 자체에서 자동으로 감지된 매개변수에 추가될 선택적 매개변수 배열입니다. |
requestBody | RequestBody | 작업과 관련된 요청 본문입니다. |
responses | ApiResponse[] | 이 작업을 실행할 때 반환되는 가능한 응답 목록입니다. |
security | SecurityRequirement[] | 이 작업에 사용할 수 있는 보안 메커니즘에 대한 선언입니다. |
servers | Server[] | 이 작업을 서비스하기 위한 대체 서버 배열입니다. |
summary | String | 이 작업에 대한 간단한 설명을 제공합니다. |
tags | String[] | 리소스나 다른 한정자로 작업을 논리적으로 그룹화하는 데 사용할 수 있는 태그입니다. |
1. RequestBody 활용 방법 -1 : 멤버변수(필드) 단위에서 정의하기
1.1. 객체 설정
💡 객체 설정
- 아래와 같이 @Schema 속성을 이용하여서 클래스 단위, 멤버변수(필드) 단위로 Swagger에 보일 내용을 정의할 수 있습니다.
어노테이션 | 설명 | 사용위치 |
@Schema | 모델 클래스나 필드에 대한 스키마 정보를 정의합니다. | 클래스 또는 필드 레벨 |
package com.adjh.springboot3tierform.model.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* 코드 관리 DTO
*
* @author : jonghoon
* @fileName : CodeDto
* @since : 29/11/24
*/
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Schema(description = "코드 관리 DTO")
public class CodeDto {
@Schema(description = "코드 시퀀스")
private int codeSq;
@Schema(description = "코드")
private String code;
@Schema(description = "코드명")
private String codeNm;
@Schema(description = "코드 타입")
private String codeType;
@Builder(toBuilder = true)
public CodeDto(int codeSq, String code, String codeNm, String codeType) {
this.codeSq = codeSq;
this.code = code;
this.codeNm = codeNm;
this.codeType = codeType;
}
}
1.2. Controller 지정
💡 Controller 지정
- Swagger의 @RequestBody 어노테이션을 통해서 각각을 설명합니다.
- 해당 RequestBody 내용이 위에 구성한 CodeDto 객체이기에 content 속성을 통해 참조하였습니다.
어노테이션 | 설명 | 사용위치 |
@OpenAPIDefinition | API 문서의 전체적인 정보를 정의합니다. 제목, 설명, 버전 등을 설정할 수 있습니다. | 클래스 레벨 |
@Tag | API 그룹을 정의합니다. 컨트롤러나 메서드에 태그를 지정하여 API를 분류할 수 있습니다. | 클래스 또는 메서드 레벨 |
@Operation | API 엔드포인트에 대한 상세 정보를 제공합니다. 요약, 설명, 응답 등을 설정할 수 있습니다. | 메서드 레벨 |
@RequestBody | 요청 본문에 대한 설명을 추가합니다. 요청 데이터의 구조와 유효성을 정의할 수 있습니다. | 메서드 파라미터 레벨 |
@Schema | 모델 클래스나 필드에 대한 스키마 정보를 정의합니다. 데이터 타입, 설명, 제약조건 등을 설정할 수 있습니다. | 클래스 또는 필드 레벨 |
@Content | 요청/응답 본문의 미디어 타입과 스키마를 정의합니다. mediaType과 schema 속성을 통해 상세 설정이 가능합니다. | 메서드 또는 파라미터 레벨 |
💡 [참고] @RequestBody 속성 값
요소 | 리턴 값 | 설명 |
content | Content[] | 요청 본문의 미디어 타입과 스키마를 정의합니다. |
description | String | 요청 본문에 대한 설명을 제공합니다. |
extensions | Extension[] | 사용자 정의 확장 기능을 추가할 수 있습니다. |
ref | String | 다른 스키마를 참조할 때 사용되는 참조 경로입니다. |
required | boolean | 요청 본문이 필수인지 여부를 지정합니다. |
useParameterTypeSchema | boolean | 파라미터 타입의 스키마를 사용할지 여부를 결정합니다. |
package com.adjh.springboot3tierform.controller;
import com.adjh.springboot3tierform.model.dto.CodeDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* Swagger 테스트를 위해 구성한 Controller
*/
@Tag(name = "Swagger-Controller", description = "Swagger Parameter 관리 API 엔드포인트")
@RestController
@RequestMapping("/api/v1/swagger")
public class SwaggerRequestBodyController {
/**
* 어노테이션 @RequestBody 형태로 전달받은 JSON 데이터에 대해 Swagger 정의: @io.swagger.v3.oas.annotations.parameters.RequestBody 활용
*
* @return
*/
@PostMapping("/requestBody")
@Operation(
summary = "swagger.@RequestBody 활용예시",
description = "swagger.@RequestBody + @RequestBody 활용한 예시입니다."
) // Swagger API 메서드 정의
@ApiResponse(responseCode = "200", description = "성공") // Swagger 응답값 반환
public ResponseEntity<List<CodeDto>> selectCodeList(
// @RequestBody 값 지정
@io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "@RequestBody를 위한 요청 데이터",
required = true,
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = CodeDto.class)
)
)
CodeDto codeDto
) {
List<CodeDto> temp = new ArrayList<>();
return new ResponseEntity<>(temp, HttpStatus.OK);
}
}
1.3. 결과 확인
💡 결과 확인
- 아래와 같이 전달받을 JSON 형태의 구조가 확인되었습니다.
- 해당 탭은 Example Value를 기준으로 출력이 됩니다. 별도의 example 값을 지정하지 않고, 초기값을 지정하지 않았기에 아래와 같은 형태로 출력이 됩니다.
💡 아래와 같이 Schema 탭을 확인합니다
- 해당 탭에서는 지정한 각각 데이터에 대한 설명과 타입에 대해 출력이 됨을 확인할 수 있습니다.
2. RequestBody 활용 방법 -2 : example 속성을 통한 테스트 데이터 구성(DTO)
2.1. 기존 방식 확인
💡 기존 방식 확인
- 기존의 방식의 경우는 클라이언트 개발자와 함께 협업을 하는 경우라면, 매번 JSON 데이터에 대해 추가하면서 테스트를 해보아야 하는 상황이 발생할 수 있습니다. 그리고 어떤 데이터 값이 들어가는지 혼동되는 경우가 발생할 수 있습니다.
- 그렇기에 example 값을 통해 예측이 가는 데이터를 제공함으로써 좀 더 쉽게 API 테스트를 할 수 있도록 제공합니다.
2.2. 객체 내에서 example 속성 사용 : DTO 내에서 각각 구성 방법
💡 객체 내에서 example 속성 사용 : DTO 내에서 각각 구성 방법
- Example 데이터를 구성하기 위해서는 @Schema 어노테이션의 example 속성을 활용합니다.
-이를 통해 Swagger UI에서 테스트할 때 사용할 기본 데이터를 미리 정의할 수 있습니다.
💡 DTO 내에서 아래와 같이 멤버 변수에 대해서 @Schema 어노테이션 내에 example 속성을 각각 추가하였습니다.
(* 해당 속성은 모두 String 형태로 구성해야 합니다)
package com.adjh.springboot3tierform.model.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* 코드 관리 DTO
*
* @author : jonghoon
* @fileName : CodeDto
* @since : 29/11/24
*/
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Schema(description = "코드 관리 DTO")
public class CodeDto {
@Schema(description = "코드 시퀀스", example = "1")
private int codeSq;
@Schema(description = "코드", example = "CODE001")
private String code;
@Schema(description = "코드명", example = "테스트 코드")
private String codeNm;
@Schema(description = "코드 타입", example = "TYPE_A")
private String codeType;
@Builder(toBuilder = true)
public CodeDto(int codeSq, String code, String codeNm, String codeType) {
this.codeSq = codeSq;
this.code = code;
this.codeNm = codeNm;
this.codeType = codeType;
}
}
💡 Controller 구성
- Controller 내에서는 동일하게 example 속성 값을 지정하지 않고, CodeDto.class만 참조하도록 구성만 하였습니다.
/**
* Swagger 테스트를 위해 구성한 Controller
*/
@Tag(name = "Swagger-Controller", description = "Swagger Parameter 관리 API 엔드포인트")
@RestController
@RequestMapping("/api/v1/swagger")
public class SwaggerRequestBodyController {
/**
* 어노테이션 @RequestBody 형태로 전달받은 JSON 데이터에 대해 Swagger 정의: @io.swagger.v3.oas.annotations.parameters.RequestBody 활용
*
* @return
*/
@PostMapping("/requestBody")
@Operation(
summary = "swagger.@RequestBody 활용예시",
description = "swagger.@RequestBody + @RequestBody 활용한 예시입니다."
) // Swagger API 메서드 정의
@ApiResponse(responseCode = "200", description = "성공") // Swagger 응답값 반환
public ResponseEntity<List<CodeDto>> selectCodeList(
// @RequestBody 값 지정
@io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "@RequestBody를 위한 요청 데이터",
required = true,
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = CodeDto.class)
)
)
CodeDto codeDto
) {
List<CodeDto> temp = new ArrayList<>();
return new ResponseEntity<>(temp, HttpStatus.OK);
}
}
2.3. 결과 확인
💡 결과 확인
- 아래와 같이 전송할 데이터에 대해서 값들을 각각 지정해 주어서 바로 API 호출을 할 수 있도록 구성하였습니다.
3. RequestBody 활용 방법 -3 : example 속성을 통한 테스트 데이터 구성(Controller)
💡 RequestBody 활용 방법 -3 : example 속성을 통한 테스트 데이터 구성(Controller)
- 위에 방법과 같이 DTO 내에 지정하는 방법 외에 Controller에 즉시 지정하는 방법에 대해 알아봅니다.
3.1. Controller에서 example 속성 사용
💡 Controller에서 example 속성 사용
- @io.swagger.v3.oas.annotations.parameters.RequestBody 어노테이션 내에서 examples 속성을 활용합니다.
- example은 @ExampleObject()를 활용하여서 JSON 데이터를 문자열로 구성합니다.
package com.adjh.springboot3tierform.controller;
import com.adjh.springboot3tierform.model.dto.CodeDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* Swagger 테스트를 위해 구성한 Controller
*/
@Tag(name = "Swagger-Controller", description = "Swagger Parameter 관리 API 엔드포인트")
@RestController
@RequestMapping("/api/v1/swagger")
public class SwaggerRequestBodyController {
/**
* 어노테이션 @RequestBody 형태로 전달받은 JSON 데이터에 대해 Swagger 정의: @io.swagger.v3.oas.annotations.parameters.RequestBody 활용
*
* @return
*/
@PostMapping("/requestBody2")
@Operation(
summary = "swagger.@RequestBody 활용예시",
description = "swagger.@RequestBody + @RequestBody 활용한 예시입니다."
) // Swagger API 메서드 정의
@ApiResponse(responseCode = "200", description = "성공") // Swagger 응답값 반환
public ResponseEntity<List<CodeDto>> selectCodeList2(
@io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "@RequestBody를 위한 요청 데이터",
required = true,
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = CodeDto.class),
examples = {
@ExampleObject(
name = "기본 예시",
value = """
{
"codeSq": 1,
"code": "CODE001",
"codeNm": "테스트 코드",
"codeType": "TYPE_A"
}
"""
)
}
)
)
CodeDto codeDto
) {
List<CodeDto> temp = new ArrayList<>();
return new ResponseEntity<>(temp, HttpStatus.OK);
}
}
3.2. 결과 확인
💡 결과 확인
- 아래와 같이 각각 다른 example을 구성할 수도 있고, 각각에 대한 정의가 잘되었음을 확인하였습니다.
5) Swagger 활용하기-3 : Header 정의하기
💡 Swagger 활용하기 : Header
- Header 파라미터는 HTTP 요청 헤더에 포함되는 값들을 정의하고 문서화하는 데 사용됩니다.
- Swagger에서는 @Parameter 어노테이션을 사용하여 헤더 파라미터를 정의할 수 있습니다.
1. 단일 Header 구성
💡 단일 Header 구성
- 해당 API에서는 Header 값을 @RequestHeader 어노테이션으로 “x-api-key”, “authToken” 형태로 받습니다.
- 이에 대해서 Header에 대한 정의를 수행합니다.
- @Parameter 어노테이션의 in = ParameterIn.HEADER를 통해서 Header 데이터임을 지정하며 name 속성으로 매핑되는 키 값을 지정합니다.
package com.adjh.springbootswagger.controller;
import com.adjh.springbootswagger.dto.CodeDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* Swagger Header 테스트를 위해 구성한 Controller
*/
@Tag(name = "Swagger-Controller", description = "Swagger Parameter 관리 API 엔드포인트")
@RestController
@RequestMapping("/api/v1/swagger")
public class SwaggerHeaderController {
/**
* 어노테이션 @PathVariable 전달된 파라미터에 대해 Swagger 정의 : @Parameters 활용
*
* @return
*/
@GetMapping("/header")
@Operation(summary = "@Parameters 활용예시", description = "@RequestHeader 활용예시입니다.") // Swagger API 메서드 정의
@ApiResponse(responseCode = "200", description = "성공") // Swagger 응답값 반환
// Swagger 파리미터들 일괄 정의
@Parameters({
@Parameter(in = ParameterIn.HEADER, name = "x-api-key", description = "API 인증 키"),
@Parameter(in = ParameterIn.HEADER, name = "authToken", description = "Bearer 인증 토큰")
})
public ResponseEntity<List<CodeDto>> addHeader(
@RequestHeader(value = "x-api-key") String apiKey,
@RequestHeader(value = "authToken") String authToken
) {
List<CodeDto> temp = new ArrayList<>();
return new ResponseEntity<>(temp, HttpStatus.OK);
}
}
1.1. 결과확인
💡 결과 확인
- 아래와 같은 API 내에서 parameter로 Header를 정의하여 수행하였을 때 header로 전달됨을 확인하였습니다.
2. 전역 헤더 설정
💡 전역 헤더 설정
- 모든 API에 공통적으로 적용되는 헤더는 OpenAPI 구성 클래스에서 전역으로 설정할 수 있습니다
💡 사용예시
- 아래의 예시에서는 모든 API 호출 시 JWT를 받아서 bearer Token 형태로 데이터 통신을 하도록 공통 구성한 내용입니다.
- Bearer Token 형식으로 전달되며, HTTP Authorization 헤더를 통해 전송됩니다.
- 모든 API 엔드포인트에 대해 자동으로 인증 헤더가 적용됩니다
- SecurityScheme에서 정의된 대로 HTTP 타입의 bearer 스키마를 사용하며, JWT 형식으로 포맷됩니다
package com.adjh.springbootswagger.config;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Swagger springdoc-ui 구성 파일
*/
@Configuration
public class OpenApiConfig {
@Bean
public OpenAPI openAPI() {
Info info = new Info()
.title("데모 프로젝트 API Document")
.version("v0.0.1")
.description("데모 프로젝트의 API 명세서입니다.");
return new OpenAPI()
.components(new Components())
.addSecurityItem(new SecurityRequirement().addList("Authentication"))
.components(new Components()
.addSecuritySchemes("Authentication",
new io.swagger.v3.oas.models.security.SecurityScheme()
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT")))
.info(info);
}
}
2.1. 결과 확인
💡 결과 확인 -1
- Authorize 버튼이 생겼습니다. 이 버튼을 누릅니다.
💡 결과 확인 -2
- 발급된 토큰 값을 Value에 값을 넣고 ‘Authorize’ 버튼을 누릅니다.
💡 결과 화인 -3
- 아래와 같이 사전에 JWT에 대한 키를 입력하여서 API 통신 때마다 header 내에 이를 포함하지 않아도 됩니다.
💡 결과 확인 -4
- API 호출 시 Header에 Authentication 키 값을 통해서 Bearer Token 형태로 전달됨이 확인되었습니다.
오늘도 감사합니다. 😀
그리드형