- 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를 통해 시각화합니다.
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’ 속성을 활용합니다.
- 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 형태로 전달됨이 확인되었습니다.