refactor(recommendation): 홈 추천 활동 타입 참조를 교체한다

This commit is contained in:
2026-06-12 16:37:11 +09:00
parent 9305dc600d
commit b85c61bd0b
6 changed files with 22 additions and 39 deletions

View File

@@ -24,8 +24,8 @@ import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom
import kr.co.vividnext.sodalive.member.QMember import kr.co.vividnext.sodalive.member.QMember
import kr.co.vividnext.sodalive.member.QMember.member import kr.co.vividnext.sodalive.member.QMember.member
import kr.co.vividnext.sodalive.member.block.QBlockMember import kr.co.vividnext.sodalive.member.block.QBlockMember
import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendationScoreSpec import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendationScoreSpec
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedActivityType
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedSectionType import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedSectionType
import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeAiCharacterRecommendationRecord import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeAiCharacterRecommendationRecord
import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeBannerRecommendationRecord import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeBannerRecommendationRecord
@@ -197,7 +197,7 @@ class DefaultHomeRecommendationQueryRepository(
RecentlyActiveCreatorRecord( RecentlyActiveCreatorRecord(
creatorNickname = row[0] as String, creatorNickname = row[0] as String,
creatorProfileImage = row[1] as String?, creatorProfileImage = row[1] as String?,
activityType = RecommendedActivityType.valueOf(row[2] as String), activityType = CreatorActivityType.valueOf(row[2] as String),
activityAt = toLocalDateTime(row[3]), activityAt = toLocalDateTime(row[3]),
targetId = (row[4] as Number?)?.toLong() targetId = (row[4] as Number?)?.toLong()
) )

View File

@@ -1,6 +1,6 @@
package kr.co.vividnext.sodalive.v2.recommendation.application package kr.co.vividnext.sodalive.v2.recommendation.application
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedActivityType import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedSectionType import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedSectionType
import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeAiCharacterRecommendationRecord import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeAiCharacterRecommendationRecord
import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeBannerRecommendationRecord import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeBannerRecommendationRecord
@@ -150,11 +150,11 @@ class HomeRecommendationQueryService(
return selectedGroups.take(genreLimit) return selectedGroups.take(genreLimit)
} }
fun resolveAudioContentActivityType(theme: String): RecommendedActivityType { fun resolveAudioContentActivityType(theme: String): CreatorActivityType {
return if (theme == LIVE_REPLAY_THEME) { return if (theme == LIVE_REPLAY_THEME) {
RecommendedActivityType.LIVE_REPLAY CreatorActivityType.LIVE_REPLAY
} else { } else {
RecommendedActivityType.AUDIO CreatorActivityType.AUDIO
} }
} }

View File

@@ -1,8 +0,0 @@
package kr.co.vividnext.sodalive.v2.recommendation.domain
enum class RecommendedActivityType(val code: String) {
LIVE("LIVE"),
AUDIO("AUDIO"),
COMMUNITY("COMMUNITY"),
LIVE_REPLAY("LIVE_REPLAY")
}

View File

@@ -1,6 +1,6 @@
package kr.co.vividnext.sodalive.v2.recommendation.port.out package kr.co.vividnext.sodalive.v2.recommendation.port.out
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedActivityType import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
import java.time.LocalDateTime import java.time.LocalDateTime
interface HomeRecommendationQueryPort { interface HomeRecommendationQueryPort {
@@ -97,7 +97,7 @@ data class HomeBannerRecommendationRecord(
data class RecentlyActiveCreatorRecord( data class RecentlyActiveCreatorRecord(
val creatorNickname: String, val creatorNickname: String,
val creatorProfileImage: String?, val creatorProfileImage: String?,
val activityType: RecommendedActivityType, val activityType: CreatorActivityType,
val activityAt: LocalDateTime, val activityAt: LocalDateTime,
val targetId: Long? val targetId: Long?
) )

View File

@@ -35,8 +35,8 @@ import kr.co.vividnext.sodalive.member.MemberKind
import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.member.block.BlockMember import kr.co.vividnext.sodalive.member.block.BlockMember
import kr.co.vividnext.sodalive.member.following.CreatorFollowing import kr.co.vividnext.sodalive.member.following.CreatorFollowing
import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendationScorePolicy import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendationScorePolicy
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedActivityType
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedSectionType import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedSectionType
import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeAiCharacterRecommendationRecord import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeAiCharacterRecommendationRecord
import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeCheerCreatorRecommendationRecord import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeCheerCreatorRecommendationRecord
@@ -362,14 +362,14 @@ class DefaultHomeRecommendationQueryRepositoryTest @Autowired constructor(
listOf(liveCreator.nickname, audioCreator.nickname, replayCreator.nickname, communityCreator.nickname), listOf(liveCreator.nickname, audioCreator.nickname, replayCreator.nickname, communityCreator.nickname),
creators.map { it.creatorNickname } creators.map { it.creatorNickname }
) )
assertEquals(RecommendedActivityType.LIVE, byCreatorNickname[liveCreator.nickname]!!.activityType) assertEquals(CreatorActivityType.LIVE, byCreatorNickname[liveCreator.nickname]!!.activityType)
assertEquals(null, byCreatorNickname[liveCreator.nickname]!!.targetId) assertEquals(null, byCreatorNickname[liveCreator.nickname]!!.targetId)
assertEquals(baseAt, byCreatorNickname[liveCreator.nickname]!!.activityAt) assertEquals(baseAt, byCreatorNickname[liveCreator.nickname]!!.activityAt)
assertEquals(RecommendedActivityType.AUDIO, byCreatorNickname[audioCreator.nickname]!!.activityType) assertEquals(CreatorActivityType.AUDIO, byCreatorNickname[audioCreator.nickname]!!.activityType)
assertEquals(audio.id, byCreatorNickname[audioCreator.nickname]!!.targetId) assertEquals(audio.id, byCreatorNickname[audioCreator.nickname]!!.targetId)
assertEquals(RecommendedActivityType.LIVE_REPLAY, byCreatorNickname[replayCreator.nickname]!!.activityType) assertEquals(CreatorActivityType.LIVE_REPLAY, byCreatorNickname[replayCreator.nickname]!!.activityType)
assertEquals(replay.id, byCreatorNickname[replayCreator.nickname]!!.targetId) assertEquals(replay.id, byCreatorNickname[replayCreator.nickname]!!.targetId)
assertEquals(RecommendedActivityType.COMMUNITY, byCreatorNickname[communityCreator.nickname]!!.activityType) assertEquals(CreatorActivityType.COMMUNITY, byCreatorNickname[communityCreator.nickname]!!.activityType)
assertEquals(communityCreator.id, byCreatorNickname[communityCreator.nickname]!!.targetId) assertEquals(communityCreator.id, byCreatorNickname[communityCreator.nickname]!!.targetId)
} }
@@ -405,10 +405,10 @@ class DefaultHomeRecommendationQueryRepositoryTest @Autowired constructor(
assertEquals(null, visibleCreators[1].targetId) assertEquals(null, visibleCreators[1].targetId)
assertEquals(adultAudio.id, visibleCreators[2].targetId) assertEquals(adultAudio.id, visibleCreators[2].targetId)
assertEquals(adultCommunityCreator.id, visibleCreators[3].targetId) assertEquals(adultCommunityCreator.id, visibleCreators[3].targetId)
assertEquals(RecommendedActivityType.LIVE, visibleCreators[0].activityType) assertEquals(CreatorActivityType.LIVE, visibleCreators[0].activityType)
assertEquals(RecommendedActivityType.LIVE, visibleCreators[1].activityType) assertEquals(CreatorActivityType.LIVE, visibleCreators[1].activityType)
assertEquals(RecommendedActivityType.AUDIO, visibleCreators[2].activityType) assertEquals(CreatorActivityType.AUDIO, visibleCreators[2].activityType)
assertEquals(RecommendedActivityType.COMMUNITY, visibleCreators[3].activityType) assertEquals(CreatorActivityType.COMMUNITY, visibleCreators[3].activityType)
} }
@Test @Test
@@ -430,7 +430,7 @@ class DefaultHomeRecommendationQueryRepositoryTest @Autowired constructor(
val creators = repository.findRecentlyActiveCreators(limit = 10, memberId = viewer.id) val creators = repository.findRecentlyActiveCreators(limit = 10, memberId = viewer.id)
assertEquals(listOf(visibleCreator.nickname), creators.map { it.creatorNickname }) assertEquals(listOf(visibleCreator.nickname), creators.map { it.creatorNickname })
assertEquals(RecommendedActivityType.COMMUNITY, creators.single().activityType) assertEquals(CreatorActivityType.COMMUNITY, creators.single().activityType)
} }
@Test @Test

View File

@@ -1,6 +1,6 @@
package kr.co.vividnext.sodalive.v2.recommendation.application package kr.co.vividnext.sodalive.v2.recommendation.application
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedActivityType import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedSectionType import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedSectionType
import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeAiCharacterRecommendationRecord import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeAiCharacterRecommendationRecord
import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeBannerRecommendationRecord import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeBannerRecommendationRecord
@@ -30,7 +30,7 @@ class HomeRecommendationQueryServiceTest {
fun shouldClassifyLiveReplayThemeContentAsLiveReplay() { fun shouldClassifyLiveReplayThemeContentAsLiveReplay() {
val activityType = service.resolveAudioContentActivityType(theme = "다시듣기") val activityType = service.resolveAudioContentActivityType(theme = "다시듣기")
assertEquals(RecommendedActivityType.LIVE_REPLAY, activityType) assertEquals(CreatorActivityType.LIVE_REPLAY, activityType)
} }
@Test @Test
@@ -38,16 +38,7 @@ class HomeRecommendationQueryServiceTest {
fun shouldClassifyNonLiveReplayThemeContentAsAudio() { fun shouldClassifyNonLiveReplayThemeContentAsAudio() {
val activityType = service.resolveAudioContentActivityType(theme = "수면") val activityType = service.resolveAudioContentActivityType(theme = "수면")
assertEquals(RecommendedActivityType.AUDIO, activityType) assertEquals(CreatorActivityType.AUDIO, activityType)
}
@Test
@DisplayName("활동 타입 enum code는 앱 다국어 처리를 위해 영문 값과 동일하게 유지한다")
fun shouldKeepRecommendedActivityTypeCodeAsEnglishName() {
assertEquals("LIVE", RecommendedActivityType.LIVE.code)
assertEquals("AUDIO", RecommendedActivityType.AUDIO.code)
assertEquals("COMMUNITY", RecommendedActivityType.COMMUNITY.code)
assertEquals("LIVE_REPLAY", RecommendedActivityType.LIVE_REPLAY.code)
} }
@Test @Test
@@ -653,7 +644,7 @@ class HomeRecommendationQueryServiceTest {
RecentlyActiveCreatorRecord( RecentlyActiveCreatorRecord(
creatorNickname = "creator", creatorNickname = "creator",
creatorProfileImage = "profile.png", creatorProfileImage = "profile.png",
activityType = RecommendedActivityType.LIVE, activityType = CreatorActivityType.LIVE,
activityAt = LocalDateTime.of(2026, 5, 31, 10, 0), activityAt = LocalDateTime.of(2026, 5, 31, 10, 0),
targetId = null targetId = null
) )