Skip to content

Commit b603502

Browse files
authored
refactor: 독서태그 N+1문제를 해결합니다. (#114)
* [BOOK-175] refactor: domain - N+1문제 개선 (#54) * [BOOK-175] refactor: infra - N+1문제 개선 (#54) * [BOOK-175] refactor: domain,infra - 코드레빗 코드리뷰 반영(#54)
1 parent 62258d2 commit b603502

File tree

4 files changed

+44
-3
lines changed

4 files changed

+44
-3
lines changed

domain/src/main/kotlin/org/yapp/domain/readingrecord/ReadingRecordDomainService.kt

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,36 @@ class ReadingRecordDomainService(
102102
sort: ReadingRecordSortType?,
103103
pageable: Pageable
104104
): Page<ReadingRecordInfoVO> {
105-
return readingRecordRepository.findReadingRecordsByDynamicCondition(userBookId, sort, pageable)
106-
.map { buildReadingRecordInfoVO(it) }
105+
val readingRecordPage = readingRecordRepository.findReadingRecordsByDynamicCondition(userBookId, sort, pageable)
106+
if (readingRecordPage.isEmpty) {
107+
return Page.empty(pageable)
108+
}
109+
110+
val readingRecords = readingRecordPage.content
111+
val readingRecordIds = readingRecords.map { it.id.value }
112+
113+
val readingRecordTags = readingRecordTagRepository.findByReadingRecordIdIn(readingRecordIds)
114+
val tagIds = readingRecordTags.map { it.tagId.value }
115+
val tagsById = tagRepository.findByIds(tagIds).associateBy { it.id.value }
116+
117+
val tagsByReadingRecordId = readingRecordTags
118+
.groupBy { it.readingRecordId.value }
119+
.mapValues { (_, tags) ->
120+
tags.mapNotNull { tagsById[it.tagId.value] }
121+
}
122+
123+
val userBook = userBookRepository.findById(userBookId)
124+
125+
return readingRecordPage.map { readingRecord ->
126+
ReadingRecordInfoVO.newInstance(
127+
readingRecord = readingRecord,
128+
emotionTags = tagsByReadingRecordId[readingRecord.id.value]?.map { it.name } ?: emptyList(),
129+
bookTitle = userBook?.title,
130+
bookPublisher = userBook?.publisher,
131+
bookCoverImageUrl = userBook?.coverImageUrl,
132+
author = userBook?.author
133+
)
134+
}
107135
}
108136

109137
fun modifyReadingRecord(

domain/src/main/kotlin/org/yapp/domain/readingrecordtag/ReadingRecordTagRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import java.util.UUID
55
interface ReadingRecordTagRepository {
66
fun saveAll(readingRecordTags: List<ReadingRecordTag>): List<ReadingRecordTag>
77
fun findByReadingRecordId(readingRecordId: UUID): List<ReadingRecordTag>
8+
fun findByReadingRecordIdIn(readingRecordIds: List<UUID>): List<ReadingRecordTag>
89
fun deleteAllByReadingRecordId(readingRecordId: UUID)
910
fun countTagsByUserIdAndUserBookIdAndCategories(userId: UUID, userBookId: UUID, categories: List<String>): Map<String, Int>
1011
}

infra/src/main/kotlin/org/yapp/infra/readingrecordtag/repository/JpaReadingRecordTagRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ import java.util.*
66

77
interface JpaReadingRecordTagRepository : JpaRepository<ReadingRecordTagEntity, UUID>, JpaReadingRecordTagQuerydslRepository {
88
fun findByReadingRecordId(readingRecordId: UUID): List<ReadingRecordTagEntity>
9+
fun findByReadingRecordIdIn(readingRecordIds: List<UUID>): List<ReadingRecordTagEntity>
910
fun deleteAllByReadingRecordId(readingRecordId: UUID)
1011
}

infra/src/main/kotlin/org/yapp/infra/readingrecordtag/repository/impl/ReadingRecordTagRepositoryImpl.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,18 @@ class ReadingRecordTagRepositoryImpl(
2020
return jpaReadingRecordTagRepository.findByReadingRecordId(readingRecordId).map { it.toDomain() }
2121
}
2222

23-
override fun countTagsByUserIdAndUserBookIdAndCategories(userId: UUID, userBookId: UUID, categories: List<String>): Map<String, Int> {
23+
override fun findByReadingRecordIdIn(readingRecordIds: List<UUID>): List<ReadingRecordTag> {
24+
if (readingRecordIds.isEmpty()) return emptyList()
25+
return jpaReadingRecordTagRepository
26+
.findByReadingRecordIdIn(readingRecordIds)
27+
.map { it.toDomain() }
28+
}
29+
30+
override fun countTagsByUserIdAndUserBookIdAndCategories(
31+
userId: UUID,
32+
userBookId: UUID,
33+
categories: List<String>
34+
): Map<String, Int> {
2435
return jpaReadingRecordTagRepository.countTagsByUserIdAndUserBookIdAndCategories(userId, userBookId, categories)
2536
}
2637

0 commit comments

Comments
 (0)