From bc5460b0ca25283f32da4c5f5afa2b5566653880 Mon Sep 17 00:00:00 2001 From: sgo722 Date: Wed, 17 Dec 2025 20:23:04 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=20=20[refactor]=20=EC=95=B1=20=EB=B2=84?= =?UTF-8?q?=EC=A0=84=EB=B3=84=20=ED=9E=88=EB=93=A0=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=A0=9C=EC=B6=9C=20=EB=A1=9C=EC=A7=81=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20(Strategy=20Pattern)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../signup/PostVerificationStrategy.kt | 36 +++++++++ .../signup/PreVerificationStrategy.kt | 50 ++++++++++++ .../member/business/signup/SignupStrategy.kt | 25 ++++++ .../business/signup/SignupStrategyResolver.kt | 81 +++++++++++++++++++ .../member/presentation/SignupController.kt | 12 ++- .../swagger/SignupControllerSwagger.kt | 23 ++++-- 6 files changed, 218 insertions(+), 9 deletions(-) create mode 100644 src/main/kotlin/codel/member/business/signup/PostVerificationStrategy.kt create mode 100644 src/main/kotlin/codel/member/business/signup/PreVerificationStrategy.kt create mode 100644 src/main/kotlin/codel/member/business/signup/SignupStrategy.kt create mode 100644 src/main/kotlin/codel/member/business/signup/SignupStrategyResolver.kt diff --git a/src/main/kotlin/codel/member/business/signup/PostVerificationStrategy.kt b/src/main/kotlin/codel/member/business/signup/PostVerificationStrategy.kt new file mode 100644 index 0000000..04642c8 --- /dev/null +++ b/src/main/kotlin/codel/member/business/signup/PostVerificationStrategy.kt @@ -0,0 +1,36 @@ +package codel.member.business.signup + +import codel.config.Loggable +import codel.member.business.SignupService +import codel.member.domain.Member +import org.springframework.http.ResponseEntity +import org.springframework.stereotype.Component +import org.springframework.web.multipart.MultipartFile + +/** + * 본인인증 기능 추가 후 전략 + * + * 본인인증 이미지 제출 기능이 추가된 신규 앱(1.2.0 이상)용 전략입니다. + * 히든 프로필 이미지 제출 후, 별도의 본인인증 이미지 제출이 필요합니다. + * 재심사의 경우 새로운 재심사 전용 API(/v1/profile/review/resubmit)를 사용해야 합니다. + */ +@Component +class PostVerificationStrategy( + private val signupService: SignupService +) : SignupStrategy, Loggable { + + override fun handleHiddenImages( + member: Member, + images: List + ): ResponseEntity { + log.info { + "본인인증 후 플로우 - userId: ${member.getIdOrThrow()}, " + + "appVersion: >= 1.2.0" + } + + // SignupService의 registerHiddenImages 호출 (히든 이미지만 등록) + signupService.registerHiddenImages(member, images) + + return ResponseEntity.ok().build() + } +} diff --git a/src/main/kotlin/codel/member/business/signup/PreVerificationStrategy.kt b/src/main/kotlin/codel/member/business/signup/PreVerificationStrategy.kt new file mode 100644 index 0000000..2874c95 --- /dev/null +++ b/src/main/kotlin/codel/member/business/signup/PreVerificationStrategy.kt @@ -0,0 +1,50 @@ +package codel.member.business.signup + +import codel.config.Loggable +import codel.member.business.SignupService +import codel.member.domain.Member +import codel.member.domain.MemberStatus +import codel.member.exception.MemberException +import codel.member.infrastructure.MemberJpaRepository +import org.springframework.http.HttpStatus +import org.springframework.http.ResponseEntity +import org.springframework.stereotype.Component +import org.springframework.transaction.annotation.Transactional +import org.springframework.web.multipart.MultipartFile + +/** + * 본인인증 기능 추가 전 전략 + * + * 본인인증 이미지 제출 기능이 없던 구버전 앱(1.2.0 미만)용 전략입니다. + * 히든 프로필 이미지 제출 시 회원 상태에 따라 다르게 처리합니다: + * - PERSONALITY_COMPLETED: 히든 이미지 등록 후 HIDDEN_COMPLETED 상태로 변경 (정상 회원가입 완료) + */ +@Component +class PreVerificationStrategy( + private val signupService: SignupService, + private val memberJpaRepository: MemberJpaRepository +) : SignupStrategy, Loggable { + + @Transactional + override fun handleHiddenImages( + member: Member, + images: List + ): ResponseEntity { + log.info { + "본인인증 전 플로우 - userId: ${member.getIdOrThrow()}, " + + "status: ${member.memberStatus}, appVersion: < 1.2.0" + } + + // 히든 이미지 등록 (기존 SignupService 로직 재활용) + signupService.registerHiddenImages(member, images) + + member.completeHiddenProfile() + memberJpaRepository.save(member) + log.info { + "정상 가입 플로우 완료 - userId: ${member.getIdOrThrow()}, " + + "status: HIDDEN_COMPLETED" + } + + return ResponseEntity.ok().build() + } +} diff --git a/src/main/kotlin/codel/member/business/signup/SignupStrategy.kt b/src/main/kotlin/codel/member/business/signup/SignupStrategy.kt new file mode 100644 index 0000000..d9c4918 --- /dev/null +++ b/src/main/kotlin/codel/member/business/signup/SignupStrategy.kt @@ -0,0 +1,25 @@ +package codel.member.business.signup + +import codel.member.domain.Member +import org.springframework.http.ResponseEntity +import org.springframework.web.multipart.MultipartFile + +/** + * 회원가입 히든 이미지 등록 전략 인터페이스 + * + * 앱 버전과 회원 상태에 따라 다른 동작을 수행하기 위한 전략 패턴 + */ +interface SignupStrategy { + + /** + * 히든 이미지 등록 처리 + * + * @param member 로그인한 회원 + * @param images 업로드할 이미지 파일 목록 + * @return 처리 결과 응답 + */ + fun handleHiddenImages( + member: Member, + images: List + ): ResponseEntity +} diff --git a/src/main/kotlin/codel/member/business/signup/SignupStrategyResolver.kt b/src/main/kotlin/codel/member/business/signup/SignupStrategyResolver.kt new file mode 100644 index 0000000..dcdf404 --- /dev/null +++ b/src/main/kotlin/codel/member/business/signup/SignupStrategyResolver.kt @@ -0,0 +1,81 @@ +package codel.member.business.signup + +import codel.config.Loggable +import org.springframework.stereotype.Component + +/** + * 회원가입 전략 선택 Resolver + * + * 앱 버전을 기반으로 적절한 SignupStrategy를 선택합니다. + * - 1.2.0 미만: 본인인증 기능 추가 전 전략 (PreVerificationStrategy) + * - 1.2.0 이상: 본인인증 기능 추가 후 전략 (PostVerificationStrategy) + */ +@Component +class SignupStrategyResolver( + private val postVerificationStrategy: PostVerificationStrategy, + private val preVerificationStrategy: PreVerificationStrategy +) : Loggable { + + /** + * 앱 버전에 따라 적절한 전략을 선택합니다. + * + * @param appVersion 앱 버전 (X-App-Version 헤더) + * @return 선택된 전략 + */ + fun resolveStrategy(appVersion: String?): SignupStrategy { + log.debug { + "전략 선택 시작 - appVersion: $appVersion" + } + + return when { + // 신규 앱 (1.2.0 이상) → 본인인증 후 전략 + isNewApp(appVersion) -> { + log.info { + "PostVerificationStrategy 선택 - appVersion: $appVersion" + } + postVerificationStrategy + } + + // 구버전 앱 (1.2.0 미만) → 본인인증 전 전략 + else -> { + log.info { + "PreVerificationStrategy 선택 - appVersion: ${appVersion ?: "null"}" + } + preVerificationStrategy + } + } + } + + /** + * 신규 앱 버전인지 판단 + * + * 1.2.0 이상이면 신규 앱으로 간주합니다. + * + * @param version 앱 버전 문자열 (예: "1.2.0") + * @return 신규 앱 여부 + */ + private fun isNewApp(version: String?): Boolean { + if (version == null) { + log.debug { "앱 버전 null → 구버전으로 간주" } + return false + } + + return try { + val parts = version.split(".") + val major = parts.getOrNull(0)?.toIntOrNull() ?: 0 + val minor = parts.getOrNull(1)?.toIntOrNull() ?: 0 + + // 1.2.0 이상이면 신규 앱 + val isNew = major > 1 || (major == 1 && minor >= 2) + + log.debug { + "앱 버전 파싱: $version → major=$major, minor=$minor, isNew=$isNew" + } + + isNew + } catch (e: Exception) { + log.warn(e) { "앱 버전 파싱 실패: $version → 구버전으로 간주" } + false // 파싱 실패 시 안전하게 구버전으로 간주 + } + } +} diff --git a/src/main/kotlin/codel/member/presentation/SignupController.kt b/src/main/kotlin/codel/member/presentation/SignupController.kt index f86f08c..0fe4110 100644 --- a/src/main/kotlin/codel/member/presentation/SignupController.kt +++ b/src/main/kotlin/codel/member/presentation/SignupController.kt @@ -3,6 +3,7 @@ package codel.member.presentation import codel.config.argumentresolver.LoginMember import codel.member.business.MemberService import codel.member.business.SignupService +import codel.member.business.signup.SignupStrategyResolver import codel.member.domain.Member import codel.member.presentation.request.EssentialProfileRequest import codel.member.presentation.request.HiddenProfileRequest @@ -23,6 +24,7 @@ import org.springframework.web.multipart.MultipartFile class SignupController( private val memberService: MemberService, private val signupService: SignupService, + private val signupStrategyResolver: SignupStrategyResolver, private val asyncNotificationService: IAsyncNotificationService ) : SignupControllerSwagger { @@ -81,10 +83,12 @@ class SignupController( @PostMapping("/hidden/images", consumes = [MediaType.MULTIPART_FORM_DATA_VALUE]) override fun registerHiddenImages( @LoginMember member: Member, - @RequestPart images: List - ): ResponseEntity { - signupService.registerHiddenImages(member, images) - return ResponseEntity.ok().build() + @RequestPart images: List, + @RequestHeader("X-App-Version", required = false) appVersion: String? + ): ResponseEntity { + // 앱 버전에 따라 적절한 전략을 선택하여 처리 + val strategy = signupStrategyResolver.resolveStrategy(appVersion) + return strategy.handleHiddenImages(member, images) } @PostMapping("/verification/image", consumes = [MediaType.MULTIPART_FORM_DATA_VALUE]) diff --git a/src/main/kotlin/codel/member/presentation/swagger/SignupControllerSwagger.kt b/src/main/kotlin/codel/member/presentation/swagger/SignupControllerSwagger.kt index ff57e0f..ad2caf0 100644 --- a/src/main/kotlin/codel/member/presentation/swagger/SignupControllerSwagger.kt +++ b/src/main/kotlin/codel/member/presentation/swagger/SignupControllerSwagger.kt @@ -117,19 +117,32 @@ interface SignupControllerSwagger { @Operation( summary = "Hidden Profile 이미지 등록", - description = "히든 프로필 이미지를 등록하고 Hidden Profile을 완료합니다. 회원가입이 완료되어 PENDING 상태로 변경됩니다." + description = """ + 히든 프로필 이미지를 등록합니다. 앱 버전과 회원 상태에 따라 다르게 동작합니다. + + **정상 가입 (PERSONALITY_COMPLETED):** + - 히든 프로필 이미지를 등록하고 다음 단계로 진행합니다. + + **재심사 (REJECT):** + - 구버전 앱(1.2.0 미만): 히든 이미지를 등록하고 PENDING 상태로 변경 (하위호환) + - 신규 앱(1.2.0 이상): 새로운 재심사 API(/v1/profile/review/resubmit)를 사용하도록 안내 + + **X-App-Version 헤더:** + - 앱 버전을 명시하지 않으면 구버전으로 간주되어 하위호환 로직이 적용됩니다. + """ ) @ApiResponses( value = [ - ApiResponse(responseCode = "200", description = "등록 완료 (PENDING 상태로 변경)"), - ApiResponse(responseCode = "400", description = "잘못된 이미지 파일 또는 단계 오류"), + ApiResponse(responseCode = "200", description = "등록 완료"), + ApiResponse(responseCode = "400", description = "잘못된 이미지 파일, 단계 오류, 또는 신규 앱에서 재심사 시도"), ApiResponse(responseCode = "401", description = "인증 실패") ] ) fun registerHiddenImages( @Parameter(hidden = true) @LoginMember member: Member, - @Parameter(description = "얼굴 이미지 파일들 (3장)") images: List - ): ResponseEntity + @Parameter(description = "얼굴 이미지 파일들 (3장)") images: List, + @Parameter(description = "앱 버전 (예: 1.2.0)") appVersion: String? + ): ResponseEntity @Operation( summary = "사용자 인증 이미지 제출", From 2ed37bf7bc8353f0e3f701acd7d4de907ab04e0f Mon Sep 17 00:00:00 2001 From: sgo722 Date: Wed, 17 Dec 2025 20:29:36 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[test]=20=ED=9E=88=EB=93=A0=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=ED=95=98=EC=9C=84=ED=98=B8=ED=99=98?= =?UTF-8?q?=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../signup/PostVerificationStrategyTest.kt | 110 +++++++++++++ .../signup/PreVerificationStrategyTest.kt | 61 +++++++ .../signup/SignupStrategyResolverTest.kt | 152 ++++++++++++++++++ 3 files changed, 323 insertions(+) create mode 100644 src/test/kotlin/codel/member/business/signup/PostVerificationStrategyTest.kt create mode 100644 src/test/kotlin/codel/member/business/signup/PreVerificationStrategyTest.kt create mode 100644 src/test/kotlin/codel/member/business/signup/SignupStrategyResolverTest.kt diff --git a/src/test/kotlin/codel/member/business/signup/PostVerificationStrategyTest.kt b/src/test/kotlin/codel/member/business/signup/PostVerificationStrategyTest.kt new file mode 100644 index 0000000..5354710 --- /dev/null +++ b/src/test/kotlin/codel/member/business/signup/PostVerificationStrategyTest.kt @@ -0,0 +1,110 @@ +package codel.member.business.signup + +import codel.member.business.SignupService +import codel.member.domain.Member +import codel.member.domain.MemberStatus +import codel.member.domain.OauthType +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.mockito.Mockito.* +import org.springframework.http.HttpStatus +import org.springframework.mock.web.MockMultipartFile + +class PostVerificationStrategyTest { + + private lateinit var signupService: SignupService + private lateinit var strategy: PostVerificationStrategy + + @BeforeEach + fun setUp() { + signupService = mock(SignupService::class.java) + strategy = PostVerificationStrategy(signupService) + } + + @DisplayName("히든 이미지를 등록한다") + @Test + fun handleHiddenImages_registerImages() { + // given + val member = Member( + id = 1L, + oauthId = "test-oauth-id", + oauthType = OauthType.KAKAO, + memberStatus = MemberStatus.PERSONALITY_COMPLETED, + email = "test@test.com" + ) + + val images = listOf( + MockMultipartFile("image1", "test1.jpg", "image/jpeg", "test1".toByteArray()), + MockMultipartFile("image2", "test2.jpg", "image/jpeg", "test2".toByteArray()), + MockMultipartFile("image3", "test3.jpg", "image/jpeg", "test3".toByteArray()) + ) + + // when + val response = strategy.handleHiddenImages(member, images) + + // then + verify(signupService, times(1)).registerHiddenImages(member, images) + assertEquals(HttpStatus.OK, response.statusCode) + } + + @DisplayName("회원 상태를 변경하지 않는다") + @Test + fun handleHiddenImages_noStatusChange() { + // given + val initialStatus = MemberStatus.PERSONALITY_COMPLETED + val member = Member( + id = 1L, + oauthId = "test-oauth-id", + oauthType = OauthType.KAKAO, + memberStatus = initialStatus, + email = "test@test.com" + ) + + val images = listOf( + MockMultipartFile("image1", "test1.jpg", "image/jpeg", "test1".toByteArray()) + ) + + // when + strategy.handleHiddenImages(member, images) + + // then + assertEquals(initialStatus, member.memberStatus) + } + + @DisplayName("다양한 회원 상태에서 모두 동일하게 동작한다") + @Test + fun handleHiddenImages_differentMemberStatuses() { + // given + val statuses = listOf( + MemberStatus.PERSONALITY_COMPLETED, + MemberStatus.REJECT, + MemberStatus.PENDING, + MemberStatus.DONE + ) + + val images = listOf( + MockMultipartFile("image1", "test1.jpg", "image/jpeg", "test1".toByteArray()) + ) + + // when & then + statuses.forEach { status -> + val member = Member( + id = 1L, + oauthId = "test-oauth-id", + oauthType = OauthType.KAKAO, + memberStatus = status, + email = "test@test.com" + ) + + val response = strategy.handleHiddenImages(member, images) + + verify(signupService, times(1)).registerHiddenImages(member, images) + assertEquals(status, member.memberStatus) // 상태 유지 + assertEquals(HttpStatus.OK, response.statusCode) + + reset(signupService) + } + } +} diff --git a/src/test/kotlin/codel/member/business/signup/PreVerificationStrategyTest.kt b/src/test/kotlin/codel/member/business/signup/PreVerificationStrategyTest.kt new file mode 100644 index 0000000..e607fbc --- /dev/null +++ b/src/test/kotlin/codel/member/business/signup/PreVerificationStrategyTest.kt @@ -0,0 +1,61 @@ +package codel.member.business.signup + +import codel.member.business.SignupService +import codel.member.domain.Member +import codel.member.domain.MemberStatus +import codel.member.domain.OauthType +import codel.member.infrastructure.MemberJpaRepository +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.mockito.ArgumentCaptor +import org.mockito.Mockito.* +import org.springframework.http.HttpStatus +import org.springframework.mock.web.MockMultipartFile + +class PreVerificationStrategyTest { + + private lateinit var signupService: SignupService + private lateinit var memberJpaRepository: MemberJpaRepository + private lateinit var strategy: PreVerificationStrategy + + @BeforeEach + fun setUp() { + signupService = mock(SignupService::class.java) + memberJpaRepository = mock(MemberJpaRepository::class.java) + strategy = PreVerificationStrategy(signupService, memberJpaRepository) + } + + @DisplayName("PERSONALITY_COMPLETED 상태에서는 히든 이미지 등록 후 HIDDEN_COMPLETED 상태로 변경한다") + @Test + fun handleHiddenImages_personalityCompleted_changeToHiddenCompleted() { + // given + val member = Member( + id = 1L, + oauthId = "test-oauth-id", + oauthType = OauthType.KAKAO, + memberStatus = MemberStatus.PERSONALITY_COMPLETED, + email = "test@test.com" + ) + + val images = listOf( + MockMultipartFile("image1", "test1.jpg", "image/jpeg", "test1".toByteArray()), + MockMultipartFile("image2", "test2.jpg", "image/jpeg", "test2".toByteArray()), + MockMultipartFile("image3", "test3.jpg", "image/jpeg", "test3".toByteArray()) + ) + + // when + val response = strategy.handleHiddenImages(member, images) + + // then + verify(signupService, times(1)).registerHiddenImages(member, images) + + val memberCaptor = ArgumentCaptor.forClass(Member::class.java) + verify(memberJpaRepository, times(1)).save(memberCaptor.capture()) + + val savedMember = memberCaptor.value + assertEquals(MemberStatus.HIDDEN_COMPLETED, savedMember.memberStatus) + assertEquals(HttpStatus.OK, response.statusCode) + } +} diff --git a/src/test/kotlin/codel/member/business/signup/SignupStrategyResolverTest.kt b/src/test/kotlin/codel/member/business/signup/SignupStrategyResolverTest.kt new file mode 100644 index 0000000..7ccd026 --- /dev/null +++ b/src/test/kotlin/codel/member/business/signup/SignupStrategyResolverTest.kt @@ -0,0 +1,152 @@ +package codel.member.business.signup + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertInstanceOf +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.mockito.Mockito.mock + +class SignupStrategyResolverTest { + + private lateinit var postVerificationStrategy: PostVerificationStrategy + private lateinit var preVerificationStrategy: PreVerificationStrategy + private lateinit var resolver: SignupStrategyResolver + + @BeforeEach + fun setUp() { + postVerificationStrategy = mock(PostVerificationStrategy::class.java) + preVerificationStrategy = mock(PreVerificationStrategy::class.java) + resolver = SignupStrategyResolver(postVerificationStrategy, preVerificationStrategy) + } + + @DisplayName("앱 버전이 1.2.0 이상이면 PostVerificationStrategy를 반환한다") + @Test + fun resolveStrategy_version_1_2_0() { + // given + val appVersion = "1.2.0" + + // when + val result = resolver.resolveStrategy(appVersion) + + // then + assertEquals(postVerificationStrategy, result) + } + + @DisplayName("앱 버전이 1.5.0이면 PostVerificationStrategy를 반환한다") + @Test + fun resolveStrategy_version_1_5_0() { + // given + val appVersion = "1.5.0" + + // when + val result = resolver.resolveStrategy(appVersion) + + // then + assertEquals(postVerificationStrategy, result) + } + + @DisplayName("앱 버전이 2.0.0이면 PostVerificationStrategy를 반환한다") + @Test + fun resolveStrategy_version_2_0_0() { + // given + val appVersion = "2.0.0" + + // when + val result = resolver.resolveStrategy(appVersion) + + // then + assertEquals(postVerificationStrategy, result) + } + + @DisplayName("앱 버전이 1.1.9이면 PreVerificationStrategy를 반환한다") + @Test + fun resolveStrategy_version_1_1_9() { + // given + val appVersion = "1.1.9" + + // when + val result = resolver.resolveStrategy(appVersion) + + // then + assertEquals(preVerificationStrategy, result) + } + + @DisplayName("앱 버전이 1.0.0이면 PreVerificationStrategy를 반환한다") + @Test + fun resolveStrategy_version_1_0_0() { + // given + val appVersion = "1.0.0" + + // when + val result = resolver.resolveStrategy(appVersion) + + // then + assertEquals(preVerificationStrategy, result) + } + + @DisplayName("앱 버전이 null이면 PreVerificationStrategy를 반환한다 (하위호환)") + @Test + fun resolveStrategy_version_null() { + // given + val appVersion: String? = null + + // when + val result = resolver.resolveStrategy(appVersion) + + // then + assertEquals(preVerificationStrategy, result) + } + + @DisplayName("앱 버전 파싱 실패 시 PreVerificationStrategy를 반환한다") + @Test + fun resolveStrategy_invalid_version() { + // given + val appVersion = "invalid-version" + + // when + val result = resolver.resolveStrategy(appVersion) + + // then + assertEquals(preVerificationStrategy, result) + } + + @DisplayName("앱 버전이 빈 문자열이면 PreVerificationStrategy를 반환한다") + @Test + fun resolveStrategy_empty_version() { + // given + val appVersion = "" + + // when + val result = resolver.resolveStrategy(appVersion) + + // then + assertEquals(preVerificationStrategy, result) + } + + @DisplayName("앱 버전이 1.2 형식이면 정상 파싱하여 PostVerificationStrategy를 반환한다") + @Test + fun resolveStrategy_version_1_2() { + // given + val appVersion = "1.2" + + // when + val result = resolver.resolveStrategy(appVersion) + + // then + assertEquals(postVerificationStrategy, result) + } + + @DisplayName("앱 버전이 1.1 형식이면 정상 파싱하여 PreVerificationStrategy를 반환한다") + @Test + fun resolveStrategy_version_1_1() { + // given + val appVersion = "1.1" + + // when + val result = resolver.resolveStrategy(appVersion) + + // then + assertEquals(preVerificationStrategy, result) + } +} From 8ee221fc0e327cdbbfca5bde14b41b1220b3945d Mon Sep 17 00:00:00 2001 From: sgo722 Date: Wed, 17 Dec 2025 20:29:43 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[test]=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20db=EC=84=A4=EC=A0=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 62a3c9d..74ccdf6 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -31,9 +31,9 @@ management: spring: datasource: driver-class-name: org.h2.Driver - url: jdbc:mysql://localhost:3306/codel - username: admin - password: codecode0221 + url: jdbc:h2:mem:testdb + username: sa + password: jpa: open-in-view: false