From c3f036249bc3b322e73e430e199fbf65de49d14a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sun, 17 Aug 2025 17:12:20 +0900 Subject: [PATCH 1/9] =?UTF-8?q?:sparkles:=20feature:=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=A1=B0=ED=9A=8C=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../document/controller/DataFileController.kt | 10 +++++ .../document/dto/DataFileResponseDTO.kt | 38 ++++++++++++++++++- .../document/repository/DataFileRepository.kt | 4 ++ .../repository/DataFileTagRepository.kt | 12 ++++++ .../document/service/DataFileService.kt | 28 ++++++++++++-- src/main/resources/application.yml | 1 + 6 files changed, 89 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/simplerag/ragback/domain/document/controller/DataFileController.kt b/src/main/kotlin/simplerag/ragback/domain/document/controller/DataFileController.kt index 64693ba..6039f3b 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/controller/DataFileController.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/controller/DataFileController.kt @@ -10,6 +10,7 @@ import org.springframework.validation.annotation.Validated import org.springframework.web.bind.annotation.* import org.springframework.web.multipart.MultipartFile import simplerag.ragback.domain.document.dto.DataFileBulkCreateRequest +import simplerag.ragback.domain.document.dto.DataFileDetailResponseList import simplerag.ragback.domain.document.dto.DataFileResponseList import simplerag.ragback.domain.document.service.DataFileService import simplerag.ragback.global.response.ApiResponse @@ -41,4 +42,13 @@ class DataFileController( return ApiResponse.ok(saved, "업로드 완료") } + @GetMapping + fun getDataFiles( + @RequestParam(name = "cursor") cursor: Long, + @RequestParam(name = "take") take: Int, + ): ApiResponse { + val data = dataFileService.getDataFiles(cursor, take) + return ApiResponse.ok(data) + } + } diff --git a/src/main/kotlin/simplerag/ragback/domain/document/dto/DataFileResponseDTO.kt b/src/main/kotlin/simplerag/ragback/domain/document/dto/DataFileResponseDTO.kt index 04244f3..6c54ed7 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/dto/DataFileResponseDTO.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/dto/DataFileResponseDTO.kt @@ -1,5 +1,8 @@ package simplerag.ragback.domain.document.dto +import simplerag.ragback.domain.document.entity.DataFile +import java.time.LocalDateTime + data class DataFileResponseList( val dataFilePreviewResponseList: List, ) @@ -7,4 +10,37 @@ data class DataFileResponseList( data class DataFilePreviewResponse( val id: Long, val sha256: String, -) \ No newline at end of file +) + +data class DataFileDetailResponseList( + val dataFilePreviewResponseList: List, + val cursor: Long?, + val hasNext: Boolean, +) + +data class DataFileDetailResponse( + var id: Long?, + val title: String, + val type: String, + val lastModified: LocalDateTime, + val tags: List, + val sha256: String, +) { + companion object { + fun of(dataFile: DataFile, tags: List): DataFileDetailResponse { + return DataFileDetailResponse( + dataFile.id, + dataFile.title, + dataFile.type, + dataFile.updatedAt, + tags, + dataFile.sha256, + ) + } + } +} + +data class TagDTO( + val id: Long?, + val name: String, +) diff --git a/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileRepository.kt b/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileRepository.kt index 11590fc..d1bd6f6 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileRepository.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileRepository.kt @@ -1,8 +1,12 @@ package simplerag.ragback.domain.document.repository +import org.springframework.data.domain.Pageable +import org.springframework.data.domain.Slice import org.springframework.data.jpa.repository.JpaRepository import simplerag.ragback.domain.document.entity.DataFile interface DataFileRepository : JpaRepository { fun existsBySha256(sha256: String): Boolean + + fun findByOrderById(pageable: Pageable): Slice } \ No newline at end of file diff --git a/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileTagRepository.kt b/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileTagRepository.kt index 69509a4..0cd0fc7 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileTagRepository.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileTagRepository.kt @@ -1,8 +1,20 @@ package simplerag.ragback.domain.document.repository import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.data.jpa.repository.Query +import org.springframework.data.repository.query.Param +import simplerag.ragback.domain.document.entity.DataFile import simplerag.ragback.domain.document.entity.DataFileTag +import simplerag.ragback.domain.document.entity.Tag interface DataFileTagRepository : JpaRepository { fun existsByDataFileIdAndTagId(dataFileId: Long, tagId: Long): Boolean + + @Query(""" + SELECT DISTINCT t + FROM DataFileTag dft + JOIN dft.tag t + WHERE dft.dataFile = :dataFile + """) + fun findTagsByDataFile(@Param("dataFile") dataFile: DataFile): List } \ No newline at end of file diff --git a/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt b/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt index 8678574..e1b709d 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt @@ -1,14 +1,14 @@ package simplerag.ragback.domain.document.service import org.springframework.dao.DataIntegrityViolationException +import org.springframework.data.domain.PageRequest +import org.springframework.data.domain.Pageable import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import org.springframework.transaction.support.TransactionSynchronization import org.springframework.transaction.support.TransactionSynchronizationManager import org.springframework.web.multipart.MultipartFile -import simplerag.ragback.domain.document.dto.DataFileBulkCreateRequest -import simplerag.ragback.domain.document.dto.DataFilePreviewResponse -import simplerag.ragback.domain.document.dto.DataFileResponseList +import simplerag.ragback.domain.document.dto.* import simplerag.ragback.domain.document.entity.DataFile import simplerag.ragback.domain.document.entity.DataFileTag import simplerag.ragback.domain.document.entity.Tag @@ -24,6 +24,7 @@ import simplerag.ragback.global.util.computeMetricsStreaming import simplerag.ragback.global.util.resolveContentType import java.time.LocalDateTime import java.util.* +import kotlin.collections.ArrayList @Service class DataFileService( @@ -76,6 +77,27 @@ class DataFileService( return DataFileResponseList(responses) } + @Transactional(readOnly = true) + fun getDataFiles(cursor: Long, take: Int): DataFileDetailResponseList { + val dataSlice = dataFileRepository.findByOrderById(PageRequest.of(cursor.toInt(), take)) + + val dataFileList: MutableList = ArrayList() + dataSlice.forEach{ dataFile -> + val tags: List = dataFileTagRepository.findTagsByDataFile(dataFile) + + val tagDtos: List = tags.map{tag -> TagDTO(tag.id, tag.name)} + + dataFileList.add(DataFileDetailResponse.of(dataFile, tagDtos)) + } + + var nextCursor: Long? = null; + if (dataFileList.isNotEmpty()) { + nextCursor = dataFileList[dataFileList.size - 1].id + } + + return DataFileDetailResponseList(dataFileList, nextCursor, dataSlice.hasNext()) + } + private fun registerRollbackCleanup(uploadedUrls: MutableList) { if (TransactionSynchronizationManager.isSynchronizationActive()) { TransactionSynchronizationManager.registerSynchronization(object : TransactionSynchronization { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a403076..bc96fb8 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -16,3 +16,4 @@ spring: hibernate: dialect: org.hibernate.dialect.PostgreSQLDialect format_sql: true + default_batch_fetch_size: 500 From d882a21311bd9a7fb2eb0056be9f79f7970291a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sun, 17 Aug 2025 17:29:37 +0900 Subject: [PATCH 2/9] =?UTF-8?q?:bug:=20fix:=20MB=20=EB=B3=80=ED=99=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ragback/domain/document/dto/DataFileResponseDTO.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/kotlin/simplerag/ragback/domain/document/dto/DataFileResponseDTO.kt b/src/main/kotlin/simplerag/ragback/domain/document/dto/DataFileResponseDTO.kt index 6c54ed7..49f8c55 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/dto/DataFileResponseDTO.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/dto/DataFileResponseDTO.kt @@ -23,6 +23,7 @@ data class DataFileDetailResponse( val title: String, val type: String, val lastModified: LocalDateTime, + val sizeMB: Double, val tags: List, val sha256: String, ) { @@ -33,6 +34,7 @@ data class DataFileDetailResponse( dataFile.title, dataFile.type, dataFile.updatedAt, + dataFile.sizeBytes / (1024.0 * 1024.0), tags, dataFile.sha256, ) From 81a07b8c14098e8dd04e9004dee6465058fb9701 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sun, 17 Aug 2025 17:29:48 +0900 Subject: [PATCH 3/9] =?UTF-8?q?:test=5Ftube:=20test:=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../document/service/DataFileServiceTest.kt | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/src/test/kotlin/simplerag/ragback/domain/document/service/DataFileServiceTest.kt b/src/test/kotlin/simplerag/ragback/domain/document/service/DataFileServiceTest.kt index 31264d1..c7bf5af 100644 --- a/src/test/kotlin/simplerag/ragback/domain/document/service/DataFileServiceTest.kt +++ b/src/test/kotlin/simplerag/ragback/domain/document/service/DataFileServiceTest.kt @@ -1,5 +1,6 @@ package simplerag.ragback.domain.document.service +import jakarta.annotation.PostConstruct import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -23,7 +24,6 @@ import simplerag.ragback.global.storage.FakeS3Util import simplerag.ragback.global.util.S3Type import simplerag.ragback.global.util.sha256Hex import java.security.MessageDigest -import java.time.LocalDateTime @SpringBootTest @ActiveProfiles("test") @@ -40,6 +40,13 @@ class DataFileServiceTest( private fun txTemplate() = TransactionTemplate(txManager) + @PostConstruct + fun clean() { + dataFileTagRepository.deleteAll() + tagRepository.deleteAll() + dataFileRepository.deleteAll() + } + @Test @Transactional @DisplayName("업로드 시 잘 저장이 된다.") @@ -207,6 +214,57 @@ class DataFileServiceTest( assertFalse(s3Util.exists(expectedUrl), "롤백 시 S3도 보상 삭제되어야 합니다") } + @Test + @DisplayName("데이터 조회가 잘 된다") + @Transactional + fun getDataFilesOK() { + // given + val bytes1 = "test1".toByteArray() + val sha1 = sha256Hex(bytes1) + val bytes2 = "test2".toByteArray() + val sha2 = sha256Hex(bytes2) + dataFileRepository.saveAll( + listOf( + DataFile( + title = "exists", + type = "text/plain", + sizeBytes = 0, + sha256 = sha1, + fileUrl = "fake://original/exists.txt", + ), + DataFile( + title = "exists2", + type = "text/pdf", + sizeBytes = 0, + sha256 = sha2, + fileUrl = "fake://original/exists.txt", + ) + ) + ) + + val cursor = 0L + val take = 2 + + // when + val dataFiles = dataFileService.getDataFiles(cursor, take) + + // then + val dataFileDetailResponse = dataFiles.dataFilePreviewResponseList[0] + assertEquals(dataFileDetailResponse.title, "exists") + assertEquals(dataFileDetailResponse.type, "text/plain") + assertEquals(dataFileDetailResponse.sizeMB, 0.0) + assertEquals(dataFileDetailResponse.sha256, sha1) + + val dataFileDetailResponse2 = dataFiles.dataFilePreviewResponseList[1] + assertEquals(dataFileDetailResponse2.title, "exists2") + assertEquals(dataFileDetailResponse2.type, "text/pdf") + assertEquals(dataFileDetailResponse2.sizeMB, 0.0) + assertEquals(dataFileDetailResponse2.sha256, sha2) + + assertEquals(dataFiles.cursor, dataFileDetailResponse2.id) + assertEquals(dataFiles.hasNext, false) + } + // ----------------------- // helpers // ----------------------- From 9455d92d9790431de493b8938393f3ad67ecfd29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sun, 17 Aug 2025 22:43:15 +0900 Subject: [PATCH 4/9] =?UTF-8?q?:bug:=20fix:=20=EC=BB=A4=EC=84=9C=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ragback/domain/document/repository/DataFileRepository.kt | 2 +- .../ragback/domain/document/service/DataFileService.kt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileRepository.kt b/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileRepository.kt index d1bd6f6..539ff04 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileRepository.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileRepository.kt @@ -8,5 +8,5 @@ import simplerag.ragback.domain.document.entity.DataFile interface DataFileRepository : JpaRepository { fun existsBySha256(sha256: String): Boolean - fun findByOrderById(pageable: Pageable): Slice + fun findByIdGreaterThanOrderById(cursorId: Long, pageable: Pageable): Slice } \ No newline at end of file diff --git a/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt b/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt index e1b709d..b57f15f 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt @@ -79,7 +79,8 @@ class DataFileService( @Transactional(readOnly = true) fun getDataFiles(cursor: Long, take: Int): DataFileDetailResponseList { - val dataSlice = dataFileRepository.findByOrderById(PageRequest.of(cursor.toInt(), take)) + + val dataSlice = dataFileRepository.findByIdGreaterThanOrderById(cursor, PageRequest.of(0, take)) val dataFileList: MutableList = ArrayList() dataSlice.forEach{ dataFile -> From d641455c7076dd1d4043b325b20eba0f83355161 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sun, 17 Aug 2025 22:44:35 +0900 Subject: [PATCH 5/9] =?UTF-8?q?:recycle:=20refactor:=20take=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ragback/domain/document/controller/DataFileController.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/simplerag/ragback/domain/document/controller/DataFileController.kt b/src/main/kotlin/simplerag/ragback/domain/document/controller/DataFileController.kt index 6039f3b..fa7914b 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/controller/DataFileController.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/controller/DataFileController.kt @@ -3,6 +3,8 @@ package simplerag.ragback.domain.document.controller import io.swagger.v3.oas.annotations.Parameter import io.swagger.v3.oas.annotations.media.Content import jakarta.validation.Valid +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min import jakarta.validation.constraints.Size import org.springframework.http.HttpStatus import org.springframework.http.MediaType @@ -45,7 +47,7 @@ class DataFileController( @GetMapping fun getDataFiles( @RequestParam(name = "cursor") cursor: Long, - @RequestParam(name = "take") take: Int, + @RequestParam(name = "take") @Min(1) @Max(100) take: Int, ): ApiResponse { val data = dataFileService.getDataFiles(cursor, take) return ApiResponse.ok(data) From 43766577c317aab7a85a22ffd77340ff3f2b82ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sun, 17 Aug 2025 22:45:08 +0900 Subject: [PATCH 6/9] =?UTF-8?q?:recycle:=20refactor:=20response=20dto=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ragback/domain/document/dto/DataFileResponseDTO.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/simplerag/ragback/domain/document/dto/DataFileResponseDTO.kt b/src/main/kotlin/simplerag/ragback/domain/document/dto/DataFileResponseDTO.kt index 49f8c55..d91e725 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/dto/DataFileResponseDTO.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/dto/DataFileResponseDTO.kt @@ -13,7 +13,7 @@ data class DataFilePreviewResponse( ) data class DataFileDetailResponseList( - val dataFilePreviewResponseList: List, + val dataFileDetailResponseList: List, val cursor: Long?, val hasNext: Boolean, ) From 179442b6aba5387243f497557cc37d908a50fc1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sun, 17 Aug 2025 22:48:58 +0900 Subject: [PATCH 7/9] =?UTF-8?q?:zap:=20perf:=20Tag=20N+1=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/document/repository/DataFileTagRepository.kt | 7 +++---- .../ragback/domain/document/service/DataFileService.kt | 8 ++++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileTagRepository.kt b/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileTagRepository.kt index 0cd0fc7..37691b3 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileTagRepository.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/repository/DataFileTagRepository.kt @@ -5,16 +5,15 @@ import org.springframework.data.jpa.repository.Query import org.springframework.data.repository.query.Param import simplerag.ragback.domain.document.entity.DataFile import simplerag.ragback.domain.document.entity.DataFileTag -import simplerag.ragback.domain.document.entity.Tag interface DataFileTagRepository : JpaRepository { fun existsByDataFileIdAndTagId(dataFileId: Long, tagId: Long): Boolean @Query(""" - SELECT DISTINCT t + SELECT dft FROM DataFileTag dft - JOIN dft.tag t + JOIN FETCH dft.tag t WHERE dft.dataFile = :dataFile """) - fun findTagsByDataFile(@Param("dataFile") dataFile: DataFile): List + fun findTagsByDataFile(@Param("dataFile") dataFile: DataFile): List } \ No newline at end of file diff --git a/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt b/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt index b57f15f..50ab37b 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt @@ -84,9 +84,13 @@ class DataFileService( val dataFileList: MutableList = ArrayList() dataSlice.forEach{ dataFile -> - val tags: List = dataFileTagRepository.findTagsByDataFile(dataFile) + val dataFileTags: List = dataFileTagRepository.findTagsByDataFile(dataFile) - val tagDtos: List = tags.map{tag -> TagDTO(tag.id, tag.name)} + val tagDtos: List = dataFileTags.map{ + dataFileTag -> + val tag = dataFileTag.tag + TagDTO(tag.id, tag.name) + } dataFileList.add(DataFileDetailResponse.of(dataFile, tagDtos)) } From 3c46afac767d3d4006a19cb52bd32d1f1d464b82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sun, 17 Aug 2025 22:50:48 +0900 Subject: [PATCH 8/9] =?UTF-8?q?:recycle:=20refactor:=20cursor=20=EA=B5=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ragback/domain/document/service/DataFileService.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt b/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt index 50ab37b..8331da5 100644 --- a/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt +++ b/src/main/kotlin/simplerag/ragback/domain/document/service/DataFileService.kt @@ -95,11 +95,7 @@ class DataFileService( dataFileList.add(DataFileDetailResponse.of(dataFile, tagDtos)) } - var nextCursor: Long? = null; - if (dataFileList.isNotEmpty()) { - nextCursor = dataFileList[dataFileList.size - 1].id - } - + val nextCursor: Long? = dataFileList.lastOrNull()?.id return DataFileDetailResponseList(dataFileList, nextCursor, dataSlice.hasNext()) } From c663f22fc56fe0ad38c4a43f2e6c16b01baf9190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=99=98?= Date: Sun, 17 Aug 2025 22:52:23 +0900 Subject: [PATCH 9/9] =?UTF-8?q?:bug:=20fix:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=ED=99=98=EA=B2=BD=20=EB=B2=84=EA=B7=B8=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/simplerag/ragback/global/storage/FakeS3Util.kt | 1 + .../domain/document/service/DataFileServiceTest.kt | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/simplerag/ragback/global/storage/FakeS3Util.kt b/src/main/kotlin/simplerag/ragback/global/storage/FakeS3Util.kt index c701405..7256546 100644 --- a/src/main/kotlin/simplerag/ragback/global/storage/FakeS3Util.kt +++ b/src/main/kotlin/simplerag/ragback/global/storage/FakeS3Util.kt @@ -50,4 +50,5 @@ class FakeS3Util : S3Util { // 테스트 용 함수 fun exists(url: String): Boolean = keyFromUrl(url)?.let { store.containsKey(it) } == true fun count(): Int = store.size + fun clear() = store.clear() } diff --git a/src/test/kotlin/simplerag/ragback/domain/document/service/DataFileServiceTest.kt b/src/test/kotlin/simplerag/ragback/domain/document/service/DataFileServiceTest.kt index c7bf5af..3ac7b70 100644 --- a/src/test/kotlin/simplerag/ragback/domain/document/service/DataFileServiceTest.kt +++ b/src/test/kotlin/simplerag/ragback/domain/document/service/DataFileServiceTest.kt @@ -2,6 +2,7 @@ package simplerag.ragback.domain.document.service import jakarta.annotation.PostConstruct import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired @@ -40,11 +41,12 @@ class DataFileServiceTest( private fun txTemplate() = TransactionTemplate(txManager) - @PostConstruct + @BeforeEach fun clean() { dataFileTagRepository.deleteAll() tagRepository.deleteAll() dataFileRepository.deleteAll() + s3Util.clear() } @Test @@ -249,13 +251,13 @@ class DataFileServiceTest( val dataFiles = dataFileService.getDataFiles(cursor, take) // then - val dataFileDetailResponse = dataFiles.dataFilePreviewResponseList[0] + val dataFileDetailResponse = dataFiles.dataFileDetailResponseList[0] assertEquals(dataFileDetailResponse.title, "exists") assertEquals(dataFileDetailResponse.type, "text/plain") assertEquals(dataFileDetailResponse.sizeMB, 0.0) assertEquals(dataFileDetailResponse.sha256, sha1) - val dataFileDetailResponse2 = dataFiles.dataFilePreviewResponseList[1] + val dataFileDetailResponse2 = dataFiles.dataFileDetailResponseList[1] assertEquals(dataFileDetailResponse2.title, "exists2") assertEquals(dataFileDetailResponse2.type, "text/pdf") assertEquals(dataFileDetailResponse2.sizeMB, 0.0)