diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/home/application/HomeRecommendationFacade.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/home/application/HomeRecommendationFacade.kt index 28a81f64..3b7617c5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/home/application/HomeRecommendationFacade.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/home/application/HomeRecommendationFacade.kt @@ -315,7 +315,7 @@ class HomeRecommendationFacade( private const val HOME_ACTIVE_CREATOR_LIMIT = 10 private const val HOME_RECENT_DEBUT_CREATOR_LIMIT = 10 private const val HOME_FIRST_AUDIO_CONTENT_LIMIT = 10 - private const val HOME_AI_CHARACTER_LIMIT = 10 + private const val HOME_AI_CHARACTER_LIMIT = 20 private const val HOME_GENRE_CREATOR_GENRE_LIMIT = 5 private const val HOME_GENRE_CREATOR_CREATOR_LIMIT = 8 private const val HOME_CHEER_CREATOR_LIMIT = 8 diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommendation/application/HomeRecommendationQueryService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommendation/application/HomeRecommendationQueryService.kt index 1e77c354..9af9848a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommendation/application/HomeRecommendationQueryService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommendation/application/HomeRecommendationQueryService.kt @@ -164,7 +164,7 @@ class HomeRecommendationQueryService( private const val DEFAULT_ACTIVE_CREATOR_LIMIT = 10 private const val DEFAULT_RECENT_DEBUT_CREATOR_LIMIT = 10 private const val DEFAULT_FIRST_AUDIO_CONTENT_LIMIT = 10 - private const val DEFAULT_AI_CHARACTER_LIMIT = 10 + private const val DEFAULT_AI_CHARACTER_LIMIT = 20 private const val DEFAULT_CHEER_CREATOR_LIMIT = 8 private const val CHEER_CREATOR_CANDIDATE_LIMIT = 16 private const val DEFAULT_POPULAR_COMMUNITY_LIMIT = 10 diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/home/HomeRecommendationControllerTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/home/HomeRecommendationControllerTest.kt index bc32db93..910ce84a 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/home/HomeRecommendationControllerTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/home/HomeRecommendationControllerTest.kt @@ -243,6 +243,22 @@ class HomeRecommendationControllerTest @Autowired constructor( .andExpect(jsonPath("$.data.lives").isArray) } + @Test + @DisplayName("메인 홈 통합 조회는 AI 캐릭터를 최신 스냅샷 기준 최대 20개까지 반환한다") + fun shouldReturnTwentyAiCharactersOnHomeRecommendations() { + (1..22).forEach { index -> + val character = saveAiCharacter("home-ai-character-$index") + saveRecommendationSnapshot(character.id!!) + } + entityManager.flush() + entityManager.clear() + + mockMvc.perform(get("/api/v2/home/recommendations")) + .andExpect(status().isOk) + .andExpect(jsonPath("$.success").value(true)) + .andExpect(jsonPath("$.data.aiCharacters.length()").value(20)) + } + @Test @DisplayName("메인 홈 통합 조회 실패는 응답 시간과 함께 로그로 관측된다") fun shouldLogHomeRecommendationFailure(output: CapturedOutput) { diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/recommendation/application/HomeRecommendationQueryServiceTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/recommendation/application/HomeRecommendationQueryServiceTest.kt index 2cf838a7..6e6e32d9 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/v2/recommendation/application/HomeRecommendationQueryServiceTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/recommendation/application/HomeRecommendationQueryServiceTest.kt @@ -141,7 +141,7 @@ class HomeRecommendationQueryServiceTest { } @Test - @DisplayName("AI 캐릭터 추천은 최신 스냅샷 10개를 기준으로 순서를 유지해 상세를 조립한다") + @DisplayName("AI 캐릭터 추천은 최신 스냅샷 20개를 기준으로 순서를 유지해 상세를 조립한다") fun shouldFindAiCharactersFromLatestSnapshotsWithLimitAndDetails() { val oldSnapshotAt = LocalDateTime.of(2026, 5, 28, 23, 59, 59) val latestSnapshotAt = LocalDateTime.of(2026, 5, 29, 23, 59, 59) @@ -153,7 +153,7 @@ class HomeRecommendationQueryServiceTest { snapshotPort.replaceSnapshots( RecommendedSectionType.AI_CHARACTER, latestSnapshotAt, - (1L..12L).map { targetId -> + (1L..22L).map { targetId -> snapshot(RecommendedSectionType.AI_CHARACTER, targetId, 100.0 - targetId, latestSnapshotAt) } ) @@ -180,7 +180,7 @@ class HomeRecommendationQueryServiceTest { val characters = service.findAiCharacterRecommendations() - assertEquals((1L..10L).toList(), port.aiCharacterDetailIds) + assertEquals((1L..20L).toList(), port.aiCharacterDetailIds) assertEquals(listOf(1L, 2L), characters.map { it.characterId }) assertEquals(listOf(101L, 102L), characters.map { it.creatorId }) assertEquals("profile/character-1.png", characters.first().profileImage)