Files
sodalive-backend-spring-boot/docs/plan-task/20260402_일본어채팅캐릭터배너추가.md
T

4.8 KiB

  • ChatCharacterBanner 엔티티에 한국어 기본 배너와 일본어/영어 배너를 구분할 언어 필드를 유지한다.
  • 관리자 배너 등록 API가 기본언어 한국어를 기본값으로 사용하고, 일본어/영어 배너도 등록할 수 있도록 요청값과 서비스 로직을 수정한다.
  • 캐릭터 메인 배너 조회가 요청 언어 배너를 우선 조회하고, 없으면 한국어 배너를 fallback 하도록 수정한다.
  • 관련 테스트 또는 검증을 수행하고 결과를 기록한다.
  • 관리자 배너 등록 요청의 lang이 ISO 639 언어코드(ko, en, ja)로 들어와도 Lang enum으로 역직렬화되도록 수정한다.

검증 기록

1차 구현

  • 무엇을: 채팅 캐릭터 배너를 기본 배너와 일본어 배너 행으로 분리해 저장하도록 lang 필드를 추가하고, 관리자 등록 API와 메인 배너 조회 로직을 일본어 기준으로 분기했다. 운영 반영용 MySQL DDL 문서 docs/20260402_chat_character_banner_lang_ddl.sql도 함께 추가했다.
  • 왜: 현재 배너 구조는 이미지 1개 기준 행 모델이라 동일 목적지에 여러 언어 이미지를 한 레코드에 묶는 것보다, 언어별 행 분리가 기존 정렬/활성화/수정 흐름을 가장 적게 건드리는 방식이기 때문이다.
  • 어떻게: ./gradlew test --tests kr.co.vividnext.sodalive.chat.character.service.ChatCharacterBannerServiceTest로 서비스 분기와 언어 검증을 확인했고, ./gradlew test --tests kr.co.vividnext.sodalive.admin.chat.AdminChatBannerControllerTest --tests kr.co.vividnext.sodalive.chat.character.controller.ChatCharacterControllerTest --tests kr.co.vividnext.sodalive.chat.character.service.ChatCharacterBannerServiceTest로 등록 API와 메인 조회 API 흐름을 실행 검증했다. 이어서 ./gradlew ktlintCheck, ./gradlew build를 실행했다.
  • 결과: 지정한 테스트는 모두 성공했고, ktlintCheck와 build도 모두 성공했다. Kotlin LSP 서버가 없어 lsp_diagnostics는 수행할 수 없었다.

2차 수정

  • 무엇을: 배너 기본언어를 명시적 KO로 변경하고, 등록 가능 언어를 KO, EN, JA로 확장했다. 또한 메인 배너 조회는 요청 언어 배너가 없을 때 KO 배너로 fallback 하도록 수정했고, MySQL DDL도 NULL -> KO 데이터 정규화와 NOT NULL DEFAULT 'KO'로 보강했다.
  • 왜: 기본 배너를 null로 해석하는 방식보다 KO를 명시 저장하는 방식이 등록 규칙과 조회 fallback 규칙을 더 일관되게 표현하고, 영어 배너 추가 요구사항도 자연스럽게 수용할 수 있기 때문이다.
  • 어떻게: 서비스 로직과 테스트를 KO/EN/JA 기준으로 재작성하고, 관리자 등록 API 기본값과 메인 조회 경로를 대상으로 단위 테스트를 추가·수정했다. 이후 ktlintCheck, 대상 테스트, 전체 빌드를 다시 실행했다.
  • 결과: ./gradlew test --tests kr.co.vividnext.sodalive.chat.character.service.ChatCharacterBannerServiceTest --tests kr.co.vividnext.sodalive.admin.chat.AdminChatBannerControllerTest --tests kr.co.vividnext.sodalive.chat.character.controller.ChatCharacterControllerTest, ./gradlew ktlintCheck, ./gradlew build를 모두 실행했고 전부 성공했다. 관리자 등록 테스트에서는 lang이 없을 때 registerBanner(2L, "", null) 호출이 발생하고 성공 응답이 반환되는 것을 확인했다. Kotlin LSP 서버는 없어 lsp_diagnostics는 이번에도 수행하지 못했다.

3차 수정

  • 무엇을: Lang enum에 Jackson @JsonCreator 기반 역직렬화 진입점을 추가해 관리자 배너 등록 요청의 lang이 ko, en, ja 같은 ISO 639 코드로 들어와도 Lang.KO, Lang.EN, Lang.JA로 파싱되도록 수정했다. 기존 enum 이름(KO, EN, JA) 입력도 계속 허용했다.
  • 왜: 관리자 요청에서 Lang enum을 직접 받고 있으므로, 외부에서 ISO 639 코드 값을 보내더라도 별도 DTO 변환 없이 안전하게 처리되게 해야 하기 때문이다.
  • 어떻게: Lang.fromCode(...)를 Jackson 역직렬화 팩토리로 연결하고, 관리자 배너 컨트롤러 테스트 요청값을 "ja"로 바꿨다. 또한 ObjectMapper().readValue(...)로 "en" 입력이 실제 Lang.EN으로 역직렬화되는 테스트를 추가했다.
  • 결과: ./gradlew test --tests kr.co.vividnext.sodalive.admin.chat.AdminChatBannerControllerTest, ./gradlew ktlintCheck, ./gradlew build를 실행했고 모두 성공했다. 관리자 배너 등록 테스트는 실제 요청 문자열 {"characterId":1,"lang":"ja"} 를 사용해 성공 응답과 registerBanner(..., Lang.JA) 호출을 확인했다. Kotlin LSP 서버는 없어 lsp_diagnostics는 수행하지 못했다.