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 94d47bd..1b71cfb 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,15 +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 com.retrip.crew.domain.exception.CrewNotFoundException; -import com.retrip.crew.domain.exception.common.ErrorCode; -import com.retrip.crew.domain.exception.common.InvalidValueException; -import com.retrip.crew.infra.adapter.in.presentation.rest.common.ApiResponse; -import jakarta.validation.Valid; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -20,10 +14,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