From 71636e0ac25b67b185a7e4cd22610cd13ab470e7 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 13 Mar 2026 13:42:01 +0900 Subject: [PATCH] =?UTF-8?q?fix(live-recommend):=20=ED=8C=94=EB=A1=9C?= =?UTF-8?q?=EC=9E=89=20=EC=A0=84=EC=B2=B4=20=EC=B1=84=EB=84=90=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EC=9D=98=20group=20by=20=EC=98=A4=EB=A5=98=EB=A5=BC?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ด๋ธŒ์ถ”์ฒœํŒ”๋กœ์ž‰์ „์ฒด์ฑ„๋„์กฐํšŒ๊ทธ๋ฃน๋ฐ”์ด์˜ค๋ฅ˜์ˆ˜์ •.md | 14 +++++++ .../live/recommend/LiveRecommendRepository.kt | 7 +++- .../recommend/LiveRecommendRepositoryTest.kt | 37 +++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 docs/20260313_๋ผ์ด๋ธŒ์ถ”์ฒœํŒ”๋กœ์ž‰์ „์ฒด์ฑ„๋„์กฐํšŒ๊ทธ๋ฃน๋ฐ”์ด์˜ค๋ฅ˜์ˆ˜์ •.md diff --git a/docs/20260313_๋ผ์ด๋ธŒ์ถ”์ฒœํŒ”๋กœ์ž‰์ „์ฒด์ฑ„๋„์กฐํšŒ๊ทธ๋ฃน๋ฐ”์ด์˜ค๋ฅ˜์ˆ˜์ •.md b/docs/20260313_๋ผ์ด๋ธŒ์ถ”์ฒœํŒ”๋กœ์ž‰์ „์ฒด์ฑ„๋„์กฐํšŒ๊ทธ๋ฃน๋ฐ”์ด์˜ค๋ฅ˜์ˆ˜์ •.md new file mode 100644 index 00000000..2e58ee4f --- /dev/null +++ b/docs/20260313_๋ผ์ด๋ธŒ์ถ”์ฒœํŒ”๋กœ์ž‰์ „์ฒด์ฑ„๋„์กฐํšŒ๊ทธ๋ฃน๋ฐ”์ด์˜ค๋ฅ˜์ˆ˜์ •.md @@ -0,0 +1,14 @@ +- [x] getFollowingAllChannelList ์˜ค๋ฅ˜ ์žฌํ˜„ ๊ฒฝ๋กœ์™€ ์›์ธ ์ฟผ๋ฆฌ ์œ„์น˜๋ฅผ ํ™•์ธํ•œ๋‹ค. +- [x] only_full_group_by ํ˜ธํ™˜ ๋ฐฉ์‹์œผ๋กœ ์กฐํšŒ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. +- [x] ๊ด€๋ จ ์‘๋‹ต/ํŽ˜์ด์ง• ๋™์ž‘์ด ์œ ์ง€๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. +- [x] ๋ณ€๊ฒฝ ํŒŒ์ผ ์ง„๋‹จ๊ณผ ํ…Œ์ŠคํŠธ/๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. + +## ๊ฒ€์ฆ ๊ธฐ๋ก + +### 1์ฐจ ๊ตฌํ˜„ +- ๋ฌด์—‡์„: `getCreatorFollowingAllList` ์ฟผ๋ฆฌ์˜ `groupBy` ์ปฌ๋Ÿผ์„ `member.id`, `member.nickname`, `member.profileImage`, `creatorFollowing.isNotify`๋กœ ํ™•์žฅํ•˜๊ณ , ํšŒ๊ท€ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด `LiveRecommendRepositoryTest.shouldReturnFollowingCreatorListWithNotifyFlag` ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. +- ์™œ: `only_full_group_by` ๋ชจ๋“œ์—์„œ SELECT์— ํฌํ•จ๋œ ๋น„์ง‘๊ณ„ ์ปฌ๋Ÿผ(`creatorFollowing.isNotify`)์ด GROUP BY์— ์—†์–ด ๋ฐœ์ƒํ•˜๋Š” SQL ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ํŒ”๋กœ์ž‰ ๋ชฉ๋ก ์‘๋‹ต(`isNotify` ํฌํ•จ) ๋™์ž‘์„ ์žฌ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. +- ์–ด๋–ป๊ฒŒ: + - ๋ช…๋ น: `./gradlew test --tests "kr.co.vividnext.sodalive.live.recommend.LiveRecommendRepositoryTest.shouldReturnFollowingCreatorListWithNotifyFlag"` / ๊ฒฐ๊ณผ: ์„ฑ๊ณต + - ๋ช…๋ น: `./gradlew build` / ๊ฒฐ๊ณผ: ์„ฑ๊ณต + - ๋ช…๋ น: `lsp_diagnostics` / ๊ฒฐ๊ณผ: `.kt` ํ™•์žฅ LSP ๋ฏธ๊ตฌ์„ฑ์œผ๋กœ ์‹คํ–‰ ๋ถˆ๊ฐ€(๋Œ€์‹  Gradle ์ปดํŒŒ์ผ/ํ…Œ์ŠคํŠธ ์„ฑ๊ณต์œผ๋กœ ๊ฒ€์ฆ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt index e7592698..50901f77 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt @@ -262,7 +262,12 @@ class LiveRecommendRepository( .from(creatorFollowing) .innerJoin(creatorFollowing.creator, member) .where(where) - .groupBy(member.id) + .groupBy( + member.id, + member.nickname, + member.profileImage, + creatorFollowing.isNotify + ) .offset(offset) .limit(limit) .fetch() diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepositoryTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepositoryTest.kt index bdd50ee4..f0a75628 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepositoryTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepositoryTest.kt @@ -7,6 +7,7 @@ import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.block.BlockMember import kr.co.vividnext.sodalive.member.block.BlockMemberRepository +import kr.co.vividnext.sodalive.member.following.CreatorFollowing import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -72,12 +73,38 @@ class LiveRecommendRepositoryTest @Autowired constructor( assertEquals(creator.id, result[0].creatorId) } + @Test + fun shouldReturnFollowingCreatorListWithNotifyFlag() { + val viewer = saveMember(nickname = "viewer-following", role = MemberRole.USER) + val creatorA = saveMember(nickname = "creator-following-a", role = MemberRole.CREATOR) + val creatorB = saveMember(nickname = "creator-following-b", role = MemberRole.CREATOR) + + saveFollowing(member = viewer, creator = creatorA, isNotify = true) + saveFollowing(member = viewer, creator = creatorB, isNotify = false) + + entityManager.flush() + entityManager.clear() + + val result = liveRecommendRepository.getCreatorFollowingAllList( + memberId = viewer.id!!, + offset = 0, + limit = 20, + isBlocked = { false } + ) + + assertEquals(2, result.size) + val isNotifyByCreatorId = result.associate { it.creatorId to it.isNotify } + assertEquals(true, isNotifyByCreatorId[creatorA.id]) + assertEquals(false, isNotifyByCreatorId[creatorB.id]) + } + private fun saveMember(nickname: String, role: MemberRole): Member { return memberRepository.saveAndFlush( Member( email = "$nickname@test.com", password = "password", nickname = nickname, + profileImage = "profile/default-profile.png", role = role ) ) @@ -101,4 +128,14 @@ class LiveRecommendRepositoryTest @Autowired constructor( block.blockedMember = blockedMember blockMemberRepository.saveAndFlush(block) } + + private fun saveFollowing(member: Member, creator: Member, isNotify: Boolean) { + val following = CreatorFollowing( + isNotify = isNotify, + isActive = true + ) + following.member = member + following.creator = creator + entityManager.persist(following) + } }