From 9b2b156d406b3ad840183f4b087de1fe6cf65b1b Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 15 Dec 2025 23:55:50 +0900 Subject: [PATCH] =?UTF-8?q?SeriesTranslationPayload=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=B3=80=ED=99=98=20?= =?UTF-8?q?=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `SeriesTranslationPayload.keywords` 타입을 `String`에서 `List`으로 변경했습니다. - `SeriesTranslationPayloadConverter`의 `convertToEntityAttribute`를 하위 호환 가능하도록 수정했습니다. - DB에 저장된 JSON에서 `keywords`가 과거 스키마(String)인 경우와 신규 스키마(List)를 모두 안전하게 파싱합니다. - 파싱 실패 또는 공백 입력 시 기본값을 사용합니다(`keywords = []`). - `convertToDatabaseColumn`은 변경 없이 `ObjectMapper`로 직렬화하여 `keywords`가 배열로 저장됩니다. --- .../series/translation/SeriesTranslation.kt | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/series/translation/SeriesTranslation.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/series/translation/SeriesTranslation.kt index 75dbbdd..c661d48 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/series/translation/SeriesTranslation.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/series/translation/SeriesTranslation.kt @@ -1,7 +1,6 @@ package kr.co.vividnext.sodalive.content.series.translation import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper -import com.fasterxml.jackson.module.kotlin.readValue import kr.co.vividnext.sodalive.common.BaseEntity import javax.persistence.AttributeConverter import javax.persistence.Column @@ -22,7 +21,7 @@ class SeriesTranslation( data class SeriesTranslationPayload( val title: String, val introduction: String, - val keywords: String + val keywords: List ) @Converter(autoApply = false) @@ -38,10 +37,34 @@ class SeriesTranslationPayloadConverter : AttributeConverter = when { + keywordsNode == null || keywordsNode.isNull -> emptyList() + keywordsNode.isArray -> keywordsNode.mapNotNull { it.asText(null) }.filter { it.isNotBlank() } + keywordsNode.isTextual -> listOfNotNull(keywordsNode.asText()).filter { it.isNotBlank() } + else -> emptyList() + } + SeriesTranslationPayload( + title = title, + introduction = introduction, + keywords = keywords + ) + } catch (_: Exception) { + // 파싱 실패 시 안전한 기본값 반환 + SeriesTranslationPayload( + title = "", + introduction = "", + keywords = emptyList() ) } - return objectMapper.readValue(dbData) } companion object {