번역 이벤트 커밋 후 처리 분기

This commit is contained in:
2026-01-07 18:45:53 +09:00
parent d07c1cc6db
commit 68b5ed7cc2
8 changed files with 39 additions and 21 deletions

View File

@@ -352,7 +352,8 @@ class AdminChatCharacterController(
applicationEventPublisher.publishEvent( applicationEventPublisher.publishEvent(
LanguageTranslationEvent( LanguageTranslationEvent(
id = request.id, id = request.id,
targetType = LanguageTranslationTargetType.CHARACTER targetType = LanguageTranslationTargetType.CHARACTER,
waitTransactionCommit = true
) )
) )

View File

@@ -95,7 +95,8 @@ class AdminOriginalWorkService(
applicationEventPublisher.publishEvent( applicationEventPublisher.publishEvent(
LanguageTranslationEvent( LanguageTranslationEvent(
id = originalWork.id!!, id = originalWork.id!!,
targetType = LanguageTranslationTargetType.ORIGINAL_WORK targetType = LanguageTranslationTargetType.ORIGINAL_WORK,
waitTransactionCommit = true
) )
) )
} }
@@ -165,7 +166,8 @@ class AdminOriginalWorkService(
applicationEventPublisher.publishEvent( applicationEventPublisher.publishEvent(
LanguageTranslationEvent( LanguageTranslationEvent(
id = ow.id!!, id = ow.id!!,
targetType = LanguageTranslationTargetType.ORIGINAL_WORK targetType = LanguageTranslationTargetType.ORIGINAL_WORK,
waitTransactionCommit = true
) )
) )
} }

View File

@@ -47,7 +47,8 @@ class AdminContentThemeService(
applicationEventPublisher.publishEvent( applicationEventPublisher.publishEvent(
LanguageTranslationEvent( LanguageTranslationEvent(
id = savedTheme.id!!, id = savedTheme.id!!,
targetType = LanguageTranslationTargetType.CONTENT_THEME targetType = LanguageTranslationTargetType.CONTENT_THEME,
waitTransactionCommit = true
) )
) )
} }

View File

@@ -183,7 +183,8 @@ class AudioContentService(
applicationEventPublisher.publishEvent( applicationEventPublisher.publishEvent(
LanguageTranslationEvent( LanguageTranslationEvent(
id = request.contentId, id = request.contentId,
targetType = LanguageTranslationTargetType.CONTENT targetType = LanguageTranslationTargetType.CONTENT,
waitTransactionCommit = true
) )
) )
} }

View File

@@ -75,7 +75,8 @@ class CategoryService(
applicationEventPublisher.publishEvent( applicationEventPublisher.publishEvent(
LanguageTranslationEvent( LanguageTranslationEvent(
id = request.categoryId, id = request.categoryId,
targetType = LanguageTranslationTargetType.CREATOR_CONTENT_CATEGORY targetType = LanguageTranslationTargetType.CREATOR_CONTENT_CATEGORY,
waitTransactionCommit = true
) )
) )
} }
@@ -158,7 +159,7 @@ class CategoryService(
val sourceLang = entity.languageCode val sourceLang = entity.languageCode
if (!sourceLang.isNullOrBlank() && sourceLang != locale) { if (!sourceLang.isNullOrBlank() && sourceLang != locale) {
val existing = translations[item.categoryId] val existing = translations[item.categoryId]
if (existing != null && !existing.category.isNullOrBlank()) { if (existing != null && existing.category.isNotBlank()) {
result.add(GetCategoryListResponse(categoryId = item.categoryId, category = existing.category)) result.add(GetCategoryListResponse(categoryId = item.categoryId, category = existing.category))
continue continue
} }

View File

@@ -203,7 +203,8 @@ class CreatorAdminContentService(
applicationEventPublisher.publishEvent( applicationEventPublisher.publishEvent(
LanguageTranslationEvent( LanguageTranslationEvent(
id = request.id, id = request.id,
targetType = LanguageTranslationTargetType.CONTENT targetType = LanguageTranslationTargetType.CONTENT,
waitTransactionCommit = true
) )
) )
} }

View File

@@ -117,7 +117,8 @@ class CreatorAdminContentSeriesService(
applicationEventPublisher.publishEvent( applicationEventPublisher.publishEvent(
LanguageTranslationEvent( LanguageTranslationEvent(
id = series.id!!, id = series.id!!,
targetType = LanguageTranslationTargetType.SERIES targetType = LanguageTranslationTargetType.SERIES,
waitTransactionCommit = true
) )
) )
} }
@@ -211,7 +212,8 @@ class CreatorAdminContentSeriesService(
applicationEventPublisher.publishEvent( applicationEventPublisher.publishEvent(
LanguageTranslationEvent( LanguageTranslationEvent(
id = series.id!!, id = series.id!!,
targetType = LanguageTranslationTargetType.SERIES targetType = LanguageTranslationTargetType.SERIES,
waitTransactionCommit = true
) )
) )
} }

View File

@@ -28,6 +28,7 @@ import kr.co.vividnext.sodalive.content.translation.ContentTranslation
import kr.co.vividnext.sodalive.content.translation.ContentTranslationPayload import kr.co.vividnext.sodalive.content.translation.ContentTranslationPayload
import kr.co.vividnext.sodalive.content.translation.ContentTranslationRepository import kr.co.vividnext.sodalive.content.translation.ContentTranslationRepository
import kr.co.vividnext.sodalive.i18n.translation.PapagoTranslationService.Companion.getTranslatableLanguageCodes import kr.co.vividnext.sodalive.i18n.translation.PapagoTranslationService.Companion.getTranslatableLanguageCodes
import org.springframework.context.event.EventListener
import org.springframework.data.repository.findByIdOrNull import org.springframework.data.repository.findByIdOrNull
import org.springframework.scheduling.annotation.Async import org.springframework.scheduling.annotation.Async
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
@@ -51,7 +52,8 @@ enum class LanguageTranslationTargetType {
class LanguageTranslationEvent( class LanguageTranslationEvent(
val id: Long, val id: Long,
val targetType: LanguageTranslationTargetType val targetType: LanguageTranslationTargetType,
val waitTransactionCommit: Boolean = false
) )
@Component @Component
@@ -76,9 +78,20 @@ class LanguageTranslationListener(
private val translationService: PapagoTranslationService private val translationService: PapagoTranslationService
) { ) {
@Async @Async
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) @EventListener(condition = "!#event.waitTransactionCommit")
@Transactional(propagation = Propagation.REQUIRES_NEW) @Transactional(propagation = Propagation.REQUIRES_NEW)
fun translation(event: LanguageTranslationEvent) { fun translationImmediate(event: LanguageTranslationEvent) {
processTranslation(event)
}
@Async
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, condition = "#event.waitTransactionCommit")
@Transactional(propagation = Propagation.REQUIRES_NEW)
fun translationAfterCommit(event: LanguageTranslationEvent) {
processTranslation(event)
}
private fun processTranslation(event: LanguageTranslationEvent) {
when (event.targetType) { when (event.targetType) {
LanguageTranslationTargetType.CONTENT -> handleContentLanguageTranslation(event) LanguageTranslationTargetType.CONTENT -> handleContentLanguageTranslation(event)
LanguageTranslationTargetType.CHARACTER -> handleCharacterLanguageTranslation(event) LanguageTranslationTargetType.CHARACTER -> handleCharacterLanguageTranslation(event)
@@ -92,8 +105,7 @@ class LanguageTranslationListener(
private fun handleContentLanguageTranslation(event: LanguageTranslationEvent) { private fun handleContentLanguageTranslation(event: LanguageTranslationEvent) {
val audioContent = audioContentRepository.findByIdOrNull(event.id) ?: return val audioContent = audioContentRepository.findByIdOrNull(event.id) ?: return
val languageCode = audioContent.languageCode val languageCode = audioContent.languageCode ?: return
if (languageCode != null) return
getTranslatableLanguageCodes(languageCode).forEach { locale -> getTranslatableLanguageCodes(languageCode).forEach { locale ->
val tags = audioContent.audioContentHashTags val tags = audioContent.audioContentHashTags
@@ -150,8 +162,7 @@ class LanguageTranslationListener(
private fun handleCharacterLanguageTranslation(event: LanguageTranslationEvent) { private fun handleCharacterLanguageTranslation(event: LanguageTranslationEvent) {
val character = chatCharacterRepository.findByIdOrNull(event.id) ?: return val character = chatCharacterRepository.findByIdOrNull(event.id) ?: return
val languageCode = character.languageCode val languageCode = character.languageCode ?: return
if (languageCode != null) return
getTranslatableLanguageCodes(languageCode).forEach { locale -> getTranslatableLanguageCodes(languageCode).forEach { locale ->
val personality = character.personalities.firstOrNull() val personality = character.personalities.firstOrNull()
@@ -285,8 +296,7 @@ class LanguageTranslationListener(
private fun handleSeriesLanguageTranslation(event: LanguageTranslationEvent) { private fun handleSeriesLanguageTranslation(event: LanguageTranslationEvent) {
val series = seriesRepository.findByIdOrNull(event.id) ?: return val series = seriesRepository.findByIdOrNull(event.id) ?: return
val languageCode = series.languageCode val languageCode = series.languageCode ?: return
if (languageCode != null) return
getTranslatableLanguageCodes(languageCode).forEach { locale -> getTranslatableLanguageCodes(languageCode).forEach { locale ->
val keywords = series.keywordList val keywords = series.keywordList
@@ -385,8 +395,7 @@ class LanguageTranslationListener(
private fun handleOriginalWorkLanguageTranslation(event: LanguageTranslationEvent) { private fun handleOriginalWorkLanguageTranslation(event: LanguageTranslationEvent) {
val originalWork = originalWorkRepository.findByIdOrNull(event.id) ?: return val originalWork = originalWorkRepository.findByIdOrNull(event.id) ?: return
val languageCode = originalWork.languageCode val languageCode = originalWork.languageCode ?: return
if (languageCode != null) return
/** /**
* handleSeriesLanguageTranslation 참조하여 원작 번역 구현 * handleSeriesLanguageTranslation 참조하여 원작 번역 구현