From 870afb03da11d93fbd8e796ac9f9d7d1902c421e Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 7 May 2026 12:16:35 +0900 Subject: [PATCH] =?UTF-8?q?fix(i18n):=20=EC=A7=80=EC=9B=90=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=9B=90=EB=AC=B8=20=EC=96=B8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=88=EC=97=AD=20=EC=9E=91=EC=97=85=EC=9D=84=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/20260507_번역작업원문언어제한.md | 18 ++++++++++++++++++ .../translation/TranslationJobScheduler.kt | 6 ++++++ .../translation/TranslationJobSchedulerTest.kt | 17 +++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 docs/20260507_번역작업원문언어제한.md diff --git a/docs/20260507_번역작업원문언어제한.md b/docs/20260507_번역작업원문언어제한.md new file mode 100644 index 00000000..75e57b5f --- /dev/null +++ b/docs/20260507_번역작업원문언어제한.md @@ -0,0 +1,18 @@ +# 번역 작업 원문 언어 제한 + +## 작업 항목 +- [x] `TranslationJobSchedulerTest`에 지원하지 않는 `sourceLanguage` 입력 시 `TranslationJob`을 저장하지 않는 RED 테스트를 추가한다. +- [x] `TranslationJobScheduler`에서 `sourceLanguage`를 소문자 정규화한 뒤 `ko`, `en`, `ja`가 아니면 등록을 중단한다. +- [x] focused test와 관련 검증 명령을 실행해 변경 결과를 확인한다. + +## 설계 +- `TranslationJob` 등록의 최종 방어선인 `TranslationJobScheduler.scheduleMissingTranslation()`에서 검증한다. +- 허용값은 현재 번역 지원 언어와 동일하게 `ko`, `en`, `ja`로 제한한다. +- 지원하지 않는 원문 언어는 예외를 던지지 않고 기존 early return 흐름처럼 job 등록만 생략한다. + +## 검증 기록 +- 2026-05-07: RED 확인: `./gradlew test --tests 'kr.co.vividnext.sodalive.i18n.translation.TranslationJobSchedulerTest.shouldNotCreateJobWhenSourceLanguageIsUnsupported'` 실행 시 `TranslationJobSchedulerTest.kt:102`의 `verifyNoInteractions` 검증 실패로 unsupported `sourceLanguage`가 repository 호출까지 진행됨을 확인했다. +- 2026-05-07: GREEN 확인: 동일 focused test가 `BUILD SUCCESSFUL`로 통과해 unsupported `sourceLanguage`가 등록되지 않음을 확인했다. +- 2026-05-07: 회귀 확인: `./gradlew test --tests 'kr.co.vividnext.sodalive.i18n.translation.TranslationJobSchedulerTest'`가 `BUILD SUCCESSFUL`로 통과했다. +- 2026-05-07: 스타일 확인: `./gradlew ktlintCheck`가 `BUILD SUCCESSFUL`로 통과했다. +- 2026-05-07: Kotlin LSP는 현재 환경에 `.kt` 서버가 설정되어 있지 않아 `lsp_diagnostics` 실행이 불가했다. 대신 Gradle 컴파일 포함 focused/class test와 ktlint로 검증했다. diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/i18n/translation/TranslationJobScheduler.kt b/src/main/kotlin/kr/co/vividnext/sodalive/i18n/translation/TranslationJobScheduler.kt index 04351963..bac92ec5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/i18n/translation/TranslationJobScheduler.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/i18n/translation/TranslationJobScheduler.kt @@ -21,6 +21,8 @@ class TranslationJobScheduler( if (normalizedText.isBlank()) return val normalizedSourceLanguage = sourceLanguage.lowercase() + if (!SUPPORTED_SOURCE_LANGUAGE_CODES.contains(normalizedSourceLanguage)) return + val normalizedTargetLanguage = targetLanguage.lowercase() if (normalizedSourceLanguage == normalizedTargetLanguage) return @@ -47,4 +49,8 @@ class TranslationJobScheduler( ) ) } + + companion object { + private val SUPPORTED_SOURCE_LANGUAGE_CODES = setOf("ko", "en", "ja") + } } diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/i18n/translation/TranslationJobSchedulerTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/i18n/translation/TranslationJobSchedulerTest.kt index 8557a125..17e62fb2 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/i18n/translation/TranslationJobSchedulerTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/i18n/translation/TranslationJobSchedulerTest.kt @@ -84,4 +84,21 @@ class TranslationJobSchedulerTest { Mockito.verify(jobRepository, Mockito.never()).save(Mockito.any(TranslationJob::class.java)) } + + @Test + fun shouldNotCreateJobWhenSourceLanguageIsUnsupported() { + val jobRepository = Mockito.mock(TranslationJobRepository::class.java) + val scheduler = TranslationJobScheduler(jobRepository) + + scheduler.scheduleMissingTranslation( + resourceType = LanguageTranslationTargetType.CONTENT, + resourceId = 10L, + fieldKey = "title", + sourceText = "제목", + sourceLanguage = "fr", + targetLanguage = "en" + ) + + Mockito.verifyNoInteractions(jobRepository) + } } -- 2.49.1