From cf2b6c467b07d8c76c9c78df1fda8979e23f6053 Mon Sep 17 00:00:00 2001 From: junhokim Date: Wed, 26 Feb 2025 09:43:04 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=8A=A4=EC=9B=A8=EA=B1=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +++ .../in/request/CrewCreateRequest.java | 5 +++ .../in/response/CrewCreateResponse.java | 6 ++++ .../in/presentation/rest/CrewController.java | 5 +++ .../crew/infra/config/SwaggerConfig.java | 32 +++++++++++++++++++ src/main/resources/application.yml | 4 +++ 6 files changed, 56 insertions(+) create mode 100644 src/main/java/com/retrip/crew/infra/config/SwaggerConfig.java diff --git a/build.gradle b/build.gradle index 80325ee..3c88f9e 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,10 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-webflux' + implementation "org.springdoc:springdoc-openapi-starter-webmvc-api:2.8.5" + implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5" + + compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' diff --git a/src/main/java/com/retrip/crew/application/in/request/CrewCreateRequest.java b/src/main/java/com/retrip/crew/application/in/request/CrewCreateRequest.java index c987d3d..ec2afc5 100644 --- a/src/main/java/com/retrip/crew/application/in/request/CrewCreateRequest.java +++ b/src/main/java/com/retrip/crew/application/in/request/CrewCreateRequest.java @@ -1,14 +1,19 @@ package com.retrip.crew.application.in.request; import com.retrip.crew.domain.entity.Crew; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Size; import java.util.UUID; +@Schema(description = "크루 생성 Request") public record CrewCreateRequest( + @Schema(description = "리더 ID") UUID leader, + @Schema(description = "크루 타이틀") @Size(min = 1, max = 30) String title, + @Schema(description = "크루 설명") @Size(min = 1, max = 500) String description ){ diff --git a/src/main/java/com/retrip/crew/application/in/response/CrewCreateResponse.java b/src/main/java/com/retrip/crew/application/in/response/CrewCreateResponse.java index b710eba..c325d4f 100644 --- a/src/main/java/com/retrip/crew/application/in/response/CrewCreateResponse.java +++ b/src/main/java/com/retrip/crew/application/in/response/CrewCreateResponse.java @@ -1,13 +1,19 @@ package com.retrip.crew.application.in.response; import com.retrip.crew.domain.entity.Crew; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.UUID; +@Schema(description = "크루 생성 Response") public record CrewCreateResponse( + @Schema(description = "크루 ID") UUID id, + @Schema(description = "크루 타이틀") String title, + @Schema(description = "크루 설명") String description, + @Schema(description = "리더 ID") UUID leaderId ) { public static CrewCreateResponse of(Crew crew) { diff --git a/src/main/java/com/retrip/crew/infra/adapter/in/presentation/rest/CrewController.java b/src/main/java/com/retrip/crew/infra/adapter/in/presentation/rest/CrewController.java index 30171a9..28ff227 100644 --- a/src/main/java/com/retrip/crew/infra/adapter/in/presentation/rest/CrewController.java +++ b/src/main/java/com/retrip/crew/infra/adapter/in/presentation/rest/CrewController.java @@ -3,6 +3,9 @@ import com.retrip.crew.application.in.request.CrewCreateRequest; import com.retrip.crew.application.in.response.CrewCreateResponse; import com.retrip.crew.application.in.usecase.CreateCrewUseCase; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.SchemaProperties; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; @@ -15,10 +18,12 @@ @RequiredArgsConstructor @RequestMapping("/crews") @RestController +@Tag(name = "Crew", description = "크루 서비스") public class CrewController { private final CreateCrewUseCase createCrewUseCase; @PostMapping + @Schema(description = "크루 생성") public ResponseEntity createCrew(@RequestBody CrewCreateRequest request) { CrewCreateResponse crew = createCrewUseCase.createCrew(request); return ResponseEntity.created(URI.create("/crews/" + crew.id())).body(crew); diff --git a/src/main/java/com/retrip/crew/infra/config/SwaggerConfig.java b/src/main/java/com/retrip/crew/infra/config/SwaggerConfig.java new file mode 100644 index 0000000..51ea12d --- /dev/null +++ b/src/main/java/com/retrip/crew/infra/config/SwaggerConfig.java @@ -0,0 +1,32 @@ +package com.retrip.crew.infra.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.servers.Server; +import org.springdoc.core.models.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + @Bean + public OpenAPI springShopOpenAPI() { + return new OpenAPI() + .addServersItem(new Server().url("/")) + .components( + new Components() + ).info( + new Info() + .title("Crew Application") + .version("v0.0.1") + ); + } + @Bean + public GroupedOpenApi crewApi(){ + return GroupedOpenApi.builder() + .group("crews") + .pathsToMatch("/crews/**") + .build(); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index aafba9a..42bce00 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -19,3 +19,7 @@ logging: level: org.hibernate.type.descriptor.sql: trace org.springframework.web.client.RestTemplate: DEBUG + +springdoc: + swagger-ui: + use-root-path: true