From 88d8f3b921146c3f4104f34dea05fa24e48f5b0c Mon Sep 17 00:00:00 2001 From: "bottlenote-app[bot]" <289617182+bottlenote-app[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 10:40:08 +0900 Subject: [PATCH 1/2] feat: prepare springdoc openapi migration --- bottlenote-admin-api/build.gradle.kts | 2 - bottlenote-product-api/build.gradle | 2 - .../user/OpenApiAuthV2ControllerTest.java | 91 ------------------- build.gradle | 1 - gradle/libs.versions.toml | 13 ++- 5 files changed, 8 insertions(+), 101 deletions(-) delete mode 100644 bottlenote-product-api/src/test/java/app/docs/user/OpenApiAuthV2ControllerTest.java diff --git a/bottlenote-admin-api/build.gradle.kts b/bottlenote-admin-api/build.gradle.kts index 14956ba52..a9b11821f 100644 --- a/bottlenote-admin-api/build.gradle.kts +++ b/bottlenote-admin-api/build.gradle.kts @@ -3,7 +3,6 @@ plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.spring) alias(libs.plugins.asciidoctor) - alias(libs.plugins.restdocs.api.spec) } // snippetsDir 정의 val snippetsDir by extra { file("build/generated-snippets") } @@ -29,7 +28,6 @@ dependencies { // Test - Spring REST Docs add("asciidoctorExt", libs.spring.restdocs.asciidoctor) testImplementation(libs.spring.restdocs.mockmvc) - testImplementation(libs.restdocs.api.spec.mockmvc) // Test - Liquibase (schema initialization) testImplementation(libs.liquibase.core) diff --git a/bottlenote-product-api/build.gradle b/bottlenote-product-api/build.gradle index 598619fc9..3feecfbea 100644 --- a/bottlenote-product-api/build.gradle +++ b/bottlenote-product-api/build.gradle @@ -1,7 +1,6 @@ // bottlenote-product-api plugins { alias(libs.plugins.asciidoctor) - alias(libs.plugins.restdocs.api.spec) } ext { @@ -58,7 +57,6 @@ dependencies { // Test - Spring REST Docs asciidoctorExt libs.spring.restdocs.asciidoctor testImplementation libs.spring.restdocs.mockmvc - testImplementation libs.restdocs.api.spec.mockmvc // Test - AWS testImplementation platform(libs.aws.sdk.bom) diff --git a/bottlenote-product-api/src/test/java/app/docs/user/OpenApiAuthV2ControllerTest.java b/bottlenote-product-api/src/test/java/app/docs/user/OpenApiAuthV2ControllerTest.java deleted file mode 100644 index 968f5de10..000000000 --- a/bottlenote-product-api/src/test/java/app/docs/user/OpenApiAuthV2ControllerTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package app.docs.user; - -import app.bottlenote.global.security.SecurityContextUtil; -import app.bottlenote.user.config.OauthConfigProperties; -import app.bottlenote.user.controller.AuthV2Controller; -import app.bottlenote.user.service.AuthService; -import app.bottlenote.user.service.NonceService; -import app.docs.AbstractRestDocs; -import com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper; -import com.epages.restdocs.apispec.ResourceDocumentation; -import com.epages.restdocs.apispec.ResourceSnippetParameters; -import java.util.Optional; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; -import org.mockito.Mockito; -import org.springframework.http.MediaType; -import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; -import org.springframework.restdocs.payload.PayloadDocumentation; -import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; - -@Tag("restdocs") -@DisplayName("유저 Auth 컨트롤러 V2x OpenAPI 테스트") -class OpenApiAuthV2ControllerTest extends AbstractRestDocs { - private final AuthService authService = Mockito.mock(AuthService.class); - private final NonceService nonceService = Mockito.mock(NonceService.class); - private final OauthConfigProperties config = Mockito.mock(OauthConfigProperties.class); - - private MockedStatic mockedSecurityUtil; - - @Override - protected Object initController() { - return new AuthV2Controller(authService, nonceService, config); - } - - @BeforeEach - void setup() { - mockedSecurityUtil = Mockito.mockStatic(SecurityContextUtil.class); - } - - @AfterEach - void tearDown() { - mockedSecurityUtil.close(); - } - - @Test - @DisplayName("루트 어드민 검증을 수행합니다.") - void login_test() throws Exception { - - // given - final long userId = 1L; - Mockito.when(SecurityContextUtil.getUserIdByContext()).thenReturn(Optional.of(userId)); - Mockito.when(authService.checkAdminStatus(userId)).thenReturn(true); - - // when & then - mockMvc - .perform( - RestDocumentationRequestBuilders.get("/api/v2/auth/admin/permissions") - .contentType(MediaType.APPLICATION_JSON) - .with(SecurityMockMvcRequestPostProcessors.csrf())) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo( - MockMvcRestDocumentationWrapper.document( - "auth-admin-permissions", - ResourceDocumentation.resource( - ResourceSnippetParameters.builder() - .tag("Authentication") - .summary("관리자 권한 확인") - .description("사용자의 관리자 권한을 확인합니다") - .responseFields( - PayloadDocumentation.fieldWithPath("success").description("응답 성공 여부"), - PayloadDocumentation.fieldWithPath("code").description("응답 코드"), - PayloadDocumentation.fieldWithPath("data").description("검증 결과"), - PayloadDocumentation.fieldWithPath("errors") - .description("에러 메시지") - .optional(), - PayloadDocumentation.fieldWithPath("meta.serverEncoding") - .description("서버 인코딩"), - PayloadDocumentation.fieldWithPath("meta.serverVersion") - .description("서버 버전"), - PayloadDocumentation.fieldWithPath("meta.serverPathVersion") - .description("서버 경로 버전"), - PayloadDocumentation.fieldWithPath("meta.serverResponseTime") - .description("서버 응답 시간")) - .build()))); - } -} diff --git a/build.gradle b/build.gradle index c9c2d64fa..a32227a4d 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,6 @@ plugins { alias(libs.plugins.spring.dependency.management) apply false alias(libs.plugins.asciidoctor) apply false alias(libs.plugins.spotless) apply false - alias(libs.plugins.restdocs.api.spec) apply false alias(libs.plugins.kotlin.jvm) apply false alias(libs.plugins.kotlin.spring) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9e27e91c1..1274d8897 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -47,7 +47,7 @@ archunit = "1.4.0" # Documentation spring-restdocs = "3.0.3" -restdocs-api-spec = "0.19.4" +springdoc-openapi = "2.8.17" # Schema Management liquibase-core = "4.33.0" @@ -163,7 +163,7 @@ archunit = { module = "com.tngtech.archunit:archunit-junit5", version.ref = "arc # Documentation spring-restdocs-asciidoctor = { module = "org.springframework.restdocs:spring-restdocs-asciidoctor", version.ref = "spring-restdocs" } spring-restdocs-mockmvc = { module = "org.springframework.restdocs:spring-restdocs-mockmvc", version.ref = "spring-restdocs" } -restdocs-api-spec-mockmvc = { module = "com.epages:restdocs-api-spec-mockmvc", version.ref = "restdocs-api-spec" } +springdoc-openapi-starter-webmvc-ui = { module = "org.springdoc:springdoc-openapi-starter-webmvc-ui", version.ref = "springdoc-openapi" } # Jackson - Spring Boot에서 관리하는 버전 사용 jackson-annotations = { module = "com.fasterxml.jackson.core:jackson-annotations" } @@ -234,8 +234,12 @@ testcontainers-complete = [ # Spring REST Docs restdocs-complete = [ - "spring-restdocs-mockmvc", - "restdocs-api-spec-mockmvc" + "spring-restdocs-mockmvc" +] + +# Springdoc OpenAPI +springdoc-openapi = [ + "springdoc-openapi-starter-webmvc-ui" ] # 공통 유틸리티 @@ -282,6 +286,5 @@ spring-boot = { id = "org.springframework.boot", version.ref = "spring-boot" } spring-dependency-management = { id = "io.spring.dependency-management", version = "1.1.4" } asciidoctor = { id = "org.asciidoctor.jvm.convert", version = "4.0.2" } spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } -restdocs-api-spec = { id = "com.epages.restdocs-api-spec", version.ref = "restdocs-api-spec" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-spring = { id = "org.jetbrains.kotlin.plugin.spring", version.ref = "kotlin" } From f89df7b2641adb6b5fa35ad4e40b07e00e223f19 Mon Sep 17 00:00:00 2001 From: "bottlenote-app[bot]" <289617182+bottlenote-app[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 12:18:08 +0900 Subject: [PATCH 2/2] feat: add springdoc dependencies to api modules --- bottlenote-admin-api/build.gradle.kts | 1 + bottlenote-product-api/build.gradle | 1 + 2 files changed, 2 insertions(+) diff --git a/bottlenote-admin-api/build.gradle.kts b/bottlenote-admin-api/build.gradle.kts index a9b11821f..51502faef 100644 --- a/bottlenote-admin-api/build.gradle.kts +++ b/bottlenote-admin-api/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-validation") + implementation(libs.springdoc.openapi.starter.webmvc.ui) implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-reflect") diff --git a/bottlenote-product-api/build.gradle b/bottlenote-product-api/build.gradle index 3feecfbea..e8a852d83 100644 --- a/bottlenote-product-api/build.gradle +++ b/bottlenote-product-api/build.gradle @@ -19,6 +19,7 @@ dependencies { // ===== Spring Boot Web ===== implementation libs.spring.boot.starter.web implementation libs.spring.boot.starter.validation + implementation libs.springdoc.openapi.starter.webmvc.ui // Test - Lombok testAnnotationProcessor libs.lombok