feat(chat): 내 채팅방 목록 페이징 적용 및 page 파라미터 추가

- Repository에 Pageable 인자로 전달하여 DB 레벨 limit/offset 적용
- Service에서 PageRequest.of(page, 20)로 20개 페이지 처리 고정
- Controller /api/chat/room/list에 page 요청 파라미터 추가 및 전달

왜: 참여 중인 채팅방 목록이 페이징되지 않아 20개 단위로 최신 메시지 기준 내림차순 페이징 처리 필요
This commit is contained in:
Klaus 2025-08-11 14:26:00 +09:00
parent 735f1e26df
commit c525ec0330
3 changed files with 14 additions and 5 deletions

View File

@ -54,12 +54,13 @@ class ChatRoomController(
*/ */
@GetMapping("/list") @GetMapping("/list")
fun listMyChatRooms( fun listMyChatRooms(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
@RequestParam(defaultValue = "0") page: Int
) = run { ) = run {
if (member == null || member.auth == null) { if (member == null || member.auth == null) {
ApiResponse.ok(emptyList()) ApiResponse.ok(emptyList())
} else { } else {
val response = chatRoomService.listMyChatRooms(member) val response = chatRoomService.listMyChatRooms(member, page)
ApiResponse.ok(response) ApiResponse.ok(response)
} }
} }

View File

@ -4,6 +4,7 @@ import kr.co.vividnext.sodalive.chat.character.ChatCharacter
import kr.co.vividnext.sodalive.chat.room.ChatRoom import kr.co.vividnext.sodalive.chat.room.ChatRoom
import kr.co.vividnext.sodalive.chat.room.dto.ChatRoomListQueryDto import kr.co.vividnext.sodalive.chat.room.dto.ChatRoomListQueryDto
import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.Member
import org.springframework.data.domain.Pageable
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.query.Param import org.springframework.data.repository.query.Param
@ -55,6 +56,7 @@ interface ChatRoomRepository : JpaRepository<ChatRoom, Long> {
""" """
) )
fun findMemberRoomsOrderByLastMessageDesc( fun findMemberRoomsOrderByLastMessageDesc(
@Param("member") member: Member @Param("member") member: Member,
pageable: Pageable
): List<ChatRoomListQueryDto> ): List<ChatRoomListQueryDto>
} }

View File

@ -21,6 +21,7 @@ import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.Member
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Value import org.springframework.beans.factory.annotation.Value
import org.springframework.data.domain.PageRequest
import org.springframework.http.HttpEntity import org.springframework.http.HttpEntity
import org.springframework.http.HttpHeaders import org.springframework.http.HttpHeaders
import org.springframework.http.HttpMethod import org.springframework.http.HttpMethod
@ -183,8 +184,13 @@ class ChatRoomService(
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun listMyChatRooms(member: Member): List<ChatRoomListItemDto> { fun listMyChatRooms(member: Member, page: Int): List<ChatRoomListItemDto> {
val rooms: List<ChatRoomListQueryDto> = chatRoomRepository.findMemberRoomsOrderByLastMessageDesc(member) // 기본 페이지당 20개 고정
val pageable = PageRequest.of(if (page < 0) 0 else page, 20)
val rooms: List<ChatRoomListQueryDto> = chatRoomRepository.findMemberRoomsOrderByLastMessageDesc(
member,
pageable
)
return rooms.map { q -> return rooms.map { q ->
val room = ChatRoom( val room = ChatRoom(
sessionId = "", sessionId = "",