Java/Spring Boot

[Java] Spring Boot 3.x 환경에서 Swagger3 이해하고 적용하기 -2 : @RequestParam, @PathVariable, @RequestBody, @RequestHeader 정의 방법

adjh54 2024. 11. 30. 17:59
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를 통해 시각화합니다.

https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-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 엔드포인트에 대한 보안 요구사항을 정의합니다. 클래스 또는 메서드 레벨

 

 

io.swagger.v3.oas.annotations package summary - swagger-annotations 2.2.25 javadoc

Latest version of io.swagger.core.v3:swagger-annotations https://javadoc.io/doc/io.swagger.core.v3/swagger-annotations Current version 2.2.25 https://javadoc.io/doc/io.swagger.core.v3/swagger-annotations/2.2.25 package-list path (used for javadoc generatio

javadoc.io

 

 

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 - swagger-annotations 2.2.25 javadoc

Latest version of io.swagger.core.v3:swagger-annotations https://javadoc.io/doc/io.swagger.core.v3/swagger-annotations Current version 2.2.25 https://javadoc.io/doc/io.swagger.core.v3/swagger-annotations/2.2.25 package-list path (used for javadoc generatio

javadoc.io

 

💡 아래와 같이 @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 형태로 전달됨이 확인되었습니다.

 

 

 

 

오늘도 감사합니다. 😀

 

 

 

 

 

 

그리드형