๐ ๊ฐ์
Swagger๋ฅผ ์ฌ์ฉํ์ฌ API ๋ช ์ธ๋ฅผ ์์ฑํด๋ณด๊ณ ์ ํ๋ค.
๐ ๊ฐ๋ฐ ํ๊ฒฝ
SpringBoot : 3.3.5
JDK : 17
build Tools : gradle
Editor : InteliJ
๐ ์์กด์ฑ ์ถ๊ฐ
Spring Boot 3.x ๋ฒ์ ์์์ Swagger ์ ์ฉ์ ์ํ ์์กด์ฑ ์ถ๊ฐ
// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.4'
๐ Swagger Config ์์ฑ
package withbeetravel.config;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration // ์ค์ ํ์ผ์ ์ฝ๊ธฐ ์ํ annotation
public class SwaggerConfig {
@Bean
public OpenAPI openAPI() {
// Swagger์์ ๋ณด์ฌ์ค API ์ ๋ณด ์ค์
Info info = new Info()
.version("1.0.0") // ์๋น์ค ๋ฒ์
.title("WithBee Travel") // ํ์ดํ
.description("WithBee Travel๐๐ซ Project API"); // ์ค๋ช
return new OpenAPI().info(info);
}
}
๐ Swagger ์ ์ ํ์ธ
๊ธฐ๋ณธ์ ์ธ swagger ์ ์ URL์ ๋ค์๊ณผ ๊ฐ๋ค.
{์๋น์ค ๊ธฐ๋ณธ URL}/swagger-ui/index.html
ํ์ฌ ๋ก์ปฌ์์ ์ ์ ํ ์คํธ๋ฅผ ํด๋ณผ ๊ฒ์ด๊ณ ,
์ฐ๋ฆฌ ํ๋ก์ ํธ์์ ๋ฐ๋ก ์ง์ ํด์ค context-path
๊ฐ ์์ผ๋ ๋ค์ URL๋ก ์ ์ํ๋ค.
http://localhost:8080/swagger-ui/index.html
๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ด swagger์ ์ ์ํ ์ ์๋ค.
๐ Swagger ์์ฑ์ ์ํ Annotation
๐ @Tag
API ๊ทธ๋ฃน์ ์ ์ํ๊ณ ์ค๋ช ํ ์ ์๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ์ฌ, API ์๋ํฌ์ธํธ๋ฅผ ๊ธฐ๋ฅ๋ณ๋ก ๋ฌถ์ด ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋์์ค๋ค.
@Tag
๋ ์ผ๋ฐ์ ์ผ๋ก ํด๋์ค ๋ ๋ฒจ์ ์ ์ฉ๋๋ค.
๊ฐ @RestController
ํด๋์ค๋ ํน์ API ๊ทธ๋ฃน์ ๋ํํ๋ ํด๋์ค์ ์ถ๊ฐํ์ฌ ํด๋น ๊ทธ๋ฃน์ ์ค๋ช
์ ์์ฑํ ์ ์๋ค.
package withbeetravel.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/travels/{travelId}/payments")
@Tag(name = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ API", description = "์ ๋ํ ์ค๋ช
์
๋๋ค.")
public class PaymentController {
...
}
name
: ํ๊ทธ ์ด๋ฆ ์ง์ description
: ํ๊ทธ์ ๋ํ ์ค๋ช ์ ์ถ๊ฐํ์ฌ ํด๋น API ๊ทธ๋ฃน์ ์ญํ ๊ณผ ๊ธฐ๋ฅ์ ์ค๋ช ํ ์ ์๋ค.
์์ ๊ฐ์ด @Tag
annotation์ ๋ถ์ฌ์ฃผ๋ฉด swagger์์ ๋ค์๊ณผ ๊ฐ์ด ํ์ธํ ์ ์๋ค.
๐ @Operation
OpenAPI ๋ฌธ์์ ํน์ API ์๋ํฌ์ธํธ์ ์์ธํ ์ ๋ณด๋ฅผ ์ถ๊ฐํ ๋ ์ฌ์ฉ๋๋ค.
@Operation
์ ๋ฉ์๋ ๋ ๋ฒจ์์ ์ ์ฉ๋๋ฉฐ
API์ ๊ธฐ๋ฅ, ์ค๋ช , ์์ฒญ๊ณผ ์๋ต์ ์ธ๋ถ์ฌํญ ๋ฑ์ ์ ์ํ ์ ์๋ค.
package withbeetravel.controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import withbeetravel.dto.ChooseParticipantsRequestDto;
import withbeetravel.dto.SuccessResponseDto;
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/travels/{travelId}/payments")
@Tag(name = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ API", description = "์ ๋ํ ์ค๋ช
์
๋๋ค.")
public class PaymentController {
@Operation(
summary = "์ ์ฐ ์ธ์ ์ ํ",
description = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ์ ๋ํ ์ ์ฐ ์ธ์์ ์ ํํ ์ ์์ต๋๋ค.",
tags = {"User Management"}
)
@PatchMapping("/{sharedPaymentId}/participants")
public ResponseEntity<String> chooseParticipant(@PathVariable Long travelId,
@PathVariable Long sharedPaymentId,
@RequestBody ChooseParticipantsRequestDto requestDto) {
return null;
}
}
summary
:
API ์๋ํฌ์ธํธ์ ๊ฐ๋ตํ ์ค๋ช ์ ์ ๊ณตํ๋ค.
Swagger UI์์ API ์ ๋ชฉ์ผ๋ก ํ์๋๋ฉฐ, ์๋ํฌ์ธํธ์ ์ฃผ์ ๊ธฐ๋ฅ์ ํ๋์ ํ์ ํ ์ ์๋ค.description
:
API ์๋ํฌ์ธํธ์ ๋ํ ์์ธ ์ค๋ช ์ ์ถ๊ฐํ ์ ์๋ค.
์ด ํ๋๋ API์ ๋์ ๋ฐฉ์์ด๋ ์ถ๊ฐ์ ์ธ ์ธ๋ถ์ฌํญ์ ์ ๋ฌํ๋ ๋ฐ ์ ์ฉํ๋ค.tags
:
API๋ฅผ ํน์ ํ๊ทธ์ ์ฐ๊ฒฐํ ์ ์๋ค.
ํ๊ทธ๋ฅผ ํตํด ์๋ํฌ์ธํธ๋ฅผ ๊ธฐ๋ฅ๋ณ๋ก ๊ทธ๋ฃนํํ์ฌ Swagger UI์์ ๊ด๋ฆฌํ ์ ์๋ค.parameters
:
API๊ฐ ์ฌ์ฉํ๋ ํ๋ผ๋ฏธํฐ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์๋ค.
URL ๊ฒฝ๋ก์ ์๋@PathVariable
์ด๋@RequestParam
๋ฑ์ ๋ํด ์ค๋ช ์ ์ถ๊ฐํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
(์๋์ ๋ ์์ธํ ๋ค๋ฃจ๊ฒ ๋ค.)
์์ ๊ฐ์ด @Operation
annotation์ ๋ถ์ฌ์ฃผ๋ฉด swagger์์ ๋ค์๊ณผ ๊ฐ์ด ํ์ธํ ์ ์๋ค.
User Management
ํ๊ทธ๋ฅผ ๋ฑ๋กํ API๋ ๋ฐ๋ก ๋ชจ์๋ณผ ์ ์๋ค.
๐ @Parameter
@Operation
์ด๋ @RequestMapping
, @GetMapping
, @PostMapping
๋ฑ์ ๋ฉ์๋ ๋ ๋ฒจ annotation๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ
API์ ์์ฒญ ํ๋ผ๋ฏธํฐ(์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, ๊ฒฝ๋ก ํ๋ผ๋ฏธํฐ, ํค๋, ์์ฒญ ๋ณธ๋ฌธ ๋ฑ)๋ฅผ ์ค๋ช ํ๋ค.
package withbeetravel.controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import withbeetravel.dto.ChooseParticipantsRequestDto;
import withbeetravel.dto.SuccessResponseDto;
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/travels/{travelId}/payments")
@Tag(name = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ API", description = "์ ๋ํ ์ค๋ช
์
๋๋ค.")
public class PaymentController {
@Operation(
summary = "์ ์ฐ ์ธ์ ์ ํ",
description = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ์ ๋ํ ์ ์ฐ ์ธ์์ ์ ํํ ์ ์์ต๋๋ค.",
tags = {"User Management"},
parameters = {
@Parameter(
name = "travelId",
description = "์ฌํ ID",
required = true,
in = ParameterIn.PATH,
example = "1234"
),
@Parameter(
name = "sharedPaymentId",
description = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ ID",
required = true,
in = ParameterIn.PATH,
example = "1234"
)
}
)
@PatchMapping("/{sharedPaymentId}/participants")
public ResponseEntity<String> chooseParticipant(@PathVariable Long travelId,
@PathVariable Long sharedPaymentId,
@RequestBody ChooseParticipantsRequestDto requestDto) {
return null;
}
}
name
(ํ์):
ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ ์ง์ ํ๋ค.
์ด ์ด๋ฆ์ API ์์ฒญ ์ ์ฌ์ฉ๋๋ ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ์ผ์นํด์ผ ํ๋ค.description
:
ํ๋ผ๋ฏธํฐ์ ์ญํ ์ด๋ ์ฉ๋๋ฅผ ์ค๋ช ํ๋ ํ ์คํธ๋ค.
Swagger UI์์ ์ด ์ค๋ช ์ด API ๋ฌธ์์ ํ์๋๋ค.required
:
ํ์์ธ์ง ์ฌ๋ถ๋ฅผ ์ค์ ํ๋ค.
true๋ก ์ค์ ํ๋ฉด ์ด ํ๋ผ๋ฏธํฐ๋ ํ์๋ก ์๊ตฌ๋๋ค.
๊ธฐ๋ณธ๊ฐ์ false์ด๋ค.in
:
ํ๋ผ๋ฏธํฐ๊ฐ ์์นํ๋ ๊ณณ์ ์ง์ ํ๋ค.
๊ฒฝ๋ก ํ๋ผ๋ฏธํฐ๋path
, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋query
, ์์ฒญ ํค๋๋header
, ์์ฒญ ๋ณธ๋ฌธ์default
๋ก ์ค์ ํ ์ ์๋ค.
๊ธฐ๋ณธ๊ฐ์query
์ด๋ค.example
:
ํด๋น ํ๋ผ๋ฏธํฐ์ ์์ ๊ฐ์ ์ ๊ณตํ๋ค.
Swagger UI์์ API ํ ์คํธ ์ ์์ ๊ฐ์ ํ์ธํ ์ ์๋ค.allowEmptyValue
:
ํ๋ผ๋ฏธํฐ๊ฐ ๋น ๊ฐ(ex. ๋น ๋ฌธ์์ด, null)๋ ํ์ฉํ๋์ง ์ฌ๋ถ๋ฅผ ์ค์ ํ๋ค.
true๋ก ์ค์ ํ๋ฉด ๋น ๊ฐ๋ ํ์ฉ๋๋ค.
๊ธฐ๋ณธ๊ฐ์ false์ด๋ค.
์์ ๊ฐ์ด @Parameter
annotation์ ๋ถ์ฌ์ฃผ๋ฉด swagger์์ ๋ค์๊ณผ ๊ฐ์ด ํ์ธํ ์ ์๋ค.
๐ @Schema
๋ชจ๋ธ ํด๋์ค์ ๊ทธ ํ๋์ ๋ํ ์ค๋ช
์ ์ถ๊ฐํ ์ ์๋ค.
์ฃผ๋ก DTO, ๋ชจ๋ธ ํด๋์ค, ๊ทธ๋ฆฌ๊ณ ํด๋น ํด๋์ค์ ํ๋์ ์ ์ฉํ์ฌ API ๋ฌธ์์์ ํด๋น ๊ฐ์ฒด์ ์คํค๋ง๋ฅผ ์ ์ํ๋ค.
package withbeetravel.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import java.util.List;
@Getter
@Schema(description = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ์ ๋ํ ์ ์ฐ ์ธ์ ๋ฆฌ์คํธ DTO")
public class ChooseParticipantsRequestDto {
@Schema(
description = "์ ์ฐ ์ธ์ ๋ฆฌ์คํธ",
example = "[17, 19, 22, 27]"
)
List<Long> travelMembersId;
}
description
:
ํ๋๋ ํด๋์ค์ ๋ํ ์ค๋ช ์ ์ ๊ณตํ๋ค.
ํด๋น ํ๋๋ ํด๋์ค์ ์๋ฏธ๋ฅผ ์ค๋ช ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.defaultValue
:
ํ๋์ ๋ํ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ๋ค.
ํด๋น ํ๋์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ํ์๋๋ค.example
:
ํ๋์ ์์ ๊ฐ์ ์ ๊ณตํ๋ค.
์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.allowableValues
:
ํ๋์ ๊ฐ์ด ํน์ ๊ฐ๋ค ์ค ํ๋๋ก ์ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ค.
enum ํ์ ํ๋์ ์ ์ฉํ ์ ์๋ค.
์์ ๊ฐ์ด @Schema
annotation์ ๋ถ์ฌ์ฃผ๋ฉด swagger์์ ๋ค์๊ณผ ๊ฐ์ด ํ์ธํ ์ ์๋ค.
๐ @ApiResponse
API ์์ฒญ์ด ์ฑ๊ณตํ๊ฑฐ๋ ์คํจํ ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ ์ ์๋ ์๋ต ์ฝ๋์ ์ค๋ช
์ ์ ๊ณตํ์ฌ
API ์ฌ์ฉ์๊ฐ ์ด๋ค ์ข
๋ฅ์ ์๋ต์ ์์ํ ์ ์๋์ง ์ ์ ์๋๋ก ํ๋ค.
package withbeetravel.controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
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.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import withbeetravel.dto.ChooseParticipantsRequestDto;
import withbeetravel.exception.dto.ErrorResponseDto;
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/travels/{travelId}/payments")
@Tag(name = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ API", description = "์ ๋ํ ์ค๋ช
์
๋๋ค.")
public class PaymentController {
@Operation(
summary = "์ ์ฐ ์ธ์ ์ ํ",
description = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ์ ๋ํ ์ ์ฐ ์ธ์์ ์ ํํ ์ ์์ต๋๋ค.",
tags = {"User Management"},
parameters = {
@Parameter(
name = "travelId",
description = "์ฌํ ID",
required = true,
in = ParameterIn.PATH,
example = "1234"
),
@Parameter(
name = "sharedPaymentId",
description = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ ID",
required = true,
in = ParameterIn.PATH,
example = "1234"
)
}
)
@ApiResponses({
@ApiResponse(responseCode = "200", description = "์ ์ฐ์ธ์ ๋ณ๊ฒฝ ์ฑ๊ณต"),
@ApiResponse(responseCode = "401", description = "AUTH-001", content = @Content(schema = @Schema(implementation = ErrorResponseDto.class))),
@ApiResponse(responseCode = "404", description = "TRAVEL-001", content = @Content(schema = @Schema(implementation = ErrorResponseDto.class))),
@ApiResponse(responseCode = "403", description = "TRAVEL-002", content = @Content(schema = @Schema(implementation = ErrorResponseDto.class))),
@ApiResponse(responseCode = "404", description = "PAYMENT-001", content = @Content(schema = @Schema(implementation = ErrorResponseDto.class))),
})
@PatchMapping("/{sharedPaymentId}/participants")
public ResponseEntity<String> chooseParticipant(@PathVariable Long travelId,
@PathVariable Long sharedPaymentId,
@RequestBody ChooseParticipantsRequestDto requestDto) {
return ResponseEntity.ok("์ ์ฐ์ธ์ ๋ณ๊ฒฝ ์ฑ๊ณต");
}
}
responseCode
:
HTTP ์๋ต ์ฝ๋๋ฅผ ๋ํ๋ด๋ฉฐ "200", "400", "404", "500" ๋ฑ๊ณผ ๊ฐ์ ์ํ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ค.description
:
ํด๋น ์๋ต ์ฝ๋์ ๋ํ ์ค๋ช ์ ์ ๋ ฅํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ์ํ ์ฝ๋์ ์๋ฏธ๋ฅผ ์ดํดํ ์ ์๋๋ก ํ๋ค.content
:@Content
์ ํจ๊ป ์ฌ์ฉ๋์ด ์๋ต์ ๋ด์ฉ ์ ํ๊ณผ ์คํค๋ง๋ฅผ ์ ์ํ๋ค.@Schema
๋ฅผ ํตํด ๋ฐํ๋๋ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ์ค๋ช ํ ์ ์๋ค.
์ด์ ๊ฐ์ด @ApiResponse
annotation์ ๋ถ์ฌ์ฃผ๋ฉด swagger์์ ๋ค์๊ณผ ๊ฐ์ด ํ์ธํ ์ ์๋ค.
๐ Swagger ์์ฑ ์ต์ ํ
ํ์ฌ ์ฝ๋๋ฅผ ๋ณด๋ฉด, chooseParticipant
๋ฉ์๋ ์์ ๊ตฌํ๋ถ๋ ํ๋๋ ์์์๋ swagger ์ค์ ๋ง์ผ๋ก๋ ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ๋ค.
@Operation(
summary = "์ ์ฐ ์ธ์ ์ ํ",
description = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ์ ๋ํ ์ ์ฐ ์ธ์์ ์ ํํ ์ ์์ต๋๋ค.",
tags = {"User Management"},
parameters = {
@Parameter(
name = "travelId",
description = "์ฌํ ID",
required = true,
in = ParameterIn.PATH,
example = "1234"
),
@Parameter(
name = "sharedPaymentId",
description = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ ID",
required = true,
in = ParameterIn.PATH,
example = "1234"
)
}
)
@ApiResponses({
@ApiResponse(responseCode = "200", description = "์ ์ฐ์ธ์ ๋ณ๊ฒฝ ์ฑ๊ณต"),
@ApiResponse(responseCode = "401", description = "AUTH-001", content = @Content(schema = @Schema(implementation = ErrorResponseDto.class))),
@ApiResponse(responseCode = "404", description = "TRAVEL-001", content = @Content(schema = @Schema(implementation = ErrorResponseDto.class))),
@ApiResponse(responseCode = "403", description = "TRAVEL-002", content = @Content(schema = @Schema(implementation = ErrorResponseDto.class))),
@ApiResponse(responseCode = "404", description = "PAYMENT-001", content = @Content(schema = @Schema(implementation = ErrorResponseDto.class))),
})
@PatchMapping("/{sharedPaymentId}/participants")
public ResponseEntity<String> chooseParticipant(@PathVariable Long travelId,
@PathVariable Long sharedPaymentId,
@RequestBody ChooseParticipantsRequestDto requestDto) {
return ResponseEntity.ok("์ ์ฐ์ธ์ ๋ณ๊ฒฝ ์ฑ๊ณต");
}
์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์ฌ swagger ์ค์ ์ ํ๊ณ ๊ฐ๋ ์ฑ์ ๋์ฌ๋ณด๋๋ก ํ๊ฒ ๋ค.
swagger docs์ฉ interface๋ฅผ ์์ฑํ์ฌ swagger ๊ด๋ จ ์ค์ ๋ค์ ๋ชจ๋ ์ด ๊ณณ์ ์ ์ด์ค๋ค.
package withbeetravel.controller.docs;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
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.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import withbeetravel.dto.ChooseParticipantsRequestDto;
import withbeetravel.exception.dto.ErrorResponseDto;
@Tag(name = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ API", description = "์ ๋ํ ์ค๋ช
์
๋๋ค.")
public interface PaymentControllerDocs {
@Operation(
summary = "์ ์ฐ ์ธ์ ์ ํ",
description = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ์ ๋ํ ์ ์ฐ ์ธ์์ ์ ํํ ์ ์์ต๋๋ค.",
tags = {"User Management"},
parameters = {
@Parameter(
name = "travelId",
description = "์ฌํ ID",
required = true,
in = ParameterIn.PATH,
example = "1234"
),
@Parameter(
name = "sharedPaymentId",
description = "๊ณต๋ ๊ฒฐ์ ๋ด์ญ ID",
required = true,
in = ParameterIn.PATH,
example = "1234"
)
}
)
@ApiResponses({
@ApiResponse(responseCode = "200", description = "์ ์ฐ์ธ์ ๋ณ๊ฒฝ ์ฑ๊ณต"),
@ApiResponse(responseCode = "401", description = "AUTH-001", content = @Content(schema = @Schema(implementation = ErrorResponseDto.class))),
@ApiResponse(responseCode = "404", description = "TRAVEL-001", content = @Content(schema = @Schema(implementation = ErrorResponseDto.class))),
@ApiResponse(responseCode = "403", description = "TRAVEL-002", content = @Content(schema = @Schema(implementation = ErrorResponseDto.class))),
@ApiResponse(responseCode = "404", description = "PAYMENT-001", content = @Content(schema = @Schema(implementation = ErrorResponseDto.class))),
})
public ResponseEntity<String> chooseParticipant(@PathVariable Long travelId,
@PathVariable Long sharedPaymentId,
@RequestBody ChooseParticipantsRequestDto requestDto);
}
๊ทธ๋ฆฌ๊ณ ์ด interface๋ฅผ ์ปจํธ๋กค๋ฌ์์ implements
ํด์ฃผ๋ฉด
package withbeetravel.controller;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import withbeetravel.controller.docs.PaymentControllerDocs;
import withbeetravel.dto.ChooseParticipantsRequestDto;
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/travels/{travelId}/payments")
public class PaymentController implements PaymentControllerDocs {
@PatchMapping("/{sharedPaymentId}/participants")
public ResponseEntity<String> chooseParticipant(@PathVariable Long travelId,
@PathVariable Long sharedPaymentId,
@RequestBody ChooseParticipantsRequestDto requestDto) {
return ResponseEntity.ok("์ ์ฐ์ธ์ ๋ณ๊ฒฝ ์ฑ๊ณต");
}
}
์ด์ ๊ฐ์ด ์ปจํธ๋กค๋ฌ๋ ๊ฐ๋ ์ฑ์ ๋์ด๋ฉฐ swagger ์ค์ ์ ํ ์ ์๋ค.
๐ ์ฐธ๊ณ
'Back-end > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] AOP๋ก ๊ถํ ์ฒ๋ฆฌํ๊ธฐ (0) | 2024.11.14 |
---|---|
[Spring] Custome Exception ๋ง๋ค๊ธฐ (0) | 2024.11.07 |