diff --git a/build.gradle b/build.gradle index 804a233..adea9a2 100644 --- a/build.gradle +++ b/build.gradle @@ -77,6 +77,7 @@ dependencies { // MongoDB implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive' + implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' } //tasks.named('test') { diff --git a/src/main/java/com/back/catchmate/domain/chat/controller/ChatController.java b/src/main/java/com/back/catchmate/domain/chat/controller/ChatController.java index a0770f3..60d4659 100644 --- a/src/main/java/com/back/catchmate/domain/chat/controller/ChatController.java +++ b/src/main/java/com/back/catchmate/domain/chat/controller/ChatController.java @@ -35,10 +35,10 @@ public void sendMessage(@DestinationVariable Long chatRoomId, ChatMessageRequest @GetMapping("/{chatRoomId}") @Operation(summary = "특정 채팅방의 채팅 내역 조회 API", description = "특정 채팅방의 채팅 내역 조회 API 입니다.") - public Mono findChatMessageList(@JwtValidation Long userId, - @PathVariable Long chatRoomId, - @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "20") int size) { + public PagedChatMessageInfo findChatMessageList(@JwtValidation Long userId, + @PathVariable Long chatRoomId, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int size) { Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Order.desc("id.timestamp"))); return chatService.getChatMessageList(userId, chatRoomId, pageable); } diff --git a/src/main/java/com/back/catchmate/domain/chat/converter/ChatMessageConverter.java b/src/main/java/com/back/catchmate/domain/chat/converter/ChatMessageConverter.java index cf65a37..cbbafbe 100644 --- a/src/main/java/com/back/catchmate/domain/chat/converter/ChatMessageConverter.java +++ b/src/main/java/com/back/catchmate/domain/chat/converter/ChatMessageConverter.java @@ -1,50 +1,42 @@ package com.back.catchmate.domain.chat.converter; import com.back.catchmate.domain.chat.dto.ChatResponse; -import com.back.catchmate.domain.chat.dto.ChatResponse.ChatMessageInfo; import com.back.catchmate.domain.chat.entity.ChatMessage; -import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Page; import org.springframework.stereotype.Component; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; import java.util.List; -import java.util.stream.Collectors; @Component public class ChatMessageConverter { - public Mono toPagedMessageInfo(Flux chatMessageFlux, Pageable pageable) { - return chatMessageFlux.collectList() - .flatMap(chatMessages -> { - // 전체 메시지 수를 구하고 페이지 계산 - int totalElements = chatMessages.size(); - int totalPages = (int) Math.ceil((double) totalElements / pageable.getPageSize()); - boolean isFirst = pageable.getPageNumber() == 0; - boolean isLast = pageable.getPageNumber() == totalPages - 1; + public ChatResponse.PagedChatMessageInfo toPagedChatMessageInfo(Page chatMessageList) { + List chatMessageInfoList = chatMessageList.stream() + .map(this::toChatMessageInfo) + .toList(); - // ChatMessageInfo 리스트로 변환 - List chatMessageInfoList = chatMessages.stream() - .map(this::toChatMessageInfo) - .collect(Collectors.toList()); - - // PagedChatMessageInfo 반환 - return Mono.just(ChatResponse.PagedChatMessageInfo.builder() - .chatMessageInfoList(chatMessageInfoList) - .totalPages(totalPages) - .totalElements((long) totalElements) - .isFirst(isFirst) - .isLast(isLast) - .build()); - }); + return ChatResponse.PagedChatMessageInfo.builder() + .chatMessageInfoList(chatMessageInfoList) + .totalPages(chatMessageList.getTotalPages()) + .totalElements(chatMessageList.getTotalElements()) + .isFirst(chatMessageList.isFirst()) + .isLast(chatMessageList.isLast()) + .build(); } - - private ChatMessageInfo toChatMessageInfo(ChatMessage chatMessage) { - return ChatMessageInfo.builder() + private ChatResponse.ChatMessageInfo toChatMessageInfo(ChatMessage chatMessage) { + return ChatResponse.ChatMessageInfo.builder() .id(chatMessage.getId()) .roomId(chatMessage.getRoomId()) .content(chatMessage.getContent()) .senderId(chatMessage.getSenderId()) .build(); } + + public ChatMessage toChatMessage(Long chatRoomId, String content, Long senderId) { + return ChatMessage.builder() + .roomId(chatRoomId) + .content(content) + .senderId(senderId) + .build(); + } } diff --git a/src/main/java/com/back/catchmate/domain/chat/repository/ChatMessageRepository.java b/src/main/java/com/back/catchmate/domain/chat/repository/ChatMessageRepository.java index 45c76d3..bced0a1 100644 --- a/src/main/java/com/back/catchmate/domain/chat/repository/ChatMessageRepository.java +++ b/src/main/java/com/back/catchmate/domain/chat/repository/ChatMessageRepository.java @@ -1,11 +1,10 @@ package com.back.catchmate.domain.chat.repository; import com.back.catchmate.domain.chat.entity.ChatMessage; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.mongodb.repository.ReactiveMongoRepository; -import reactor.core.publisher.Flux; - -public interface ChatMessageRepository extends ReactiveMongoRepository { - Flux findByRoomIdOrderByIdDesc(Long roomId, Pageable pageable); +import org.springframework.data.mongodb.repository.MongoRepository; +public interface ChatMessageRepository extends MongoRepository { + Page findByRoomIdOrderByIdDesc(Long roomId, Pageable pageable); } diff --git a/src/main/java/com/back/catchmate/domain/chat/service/ChatService.java b/src/main/java/com/back/catchmate/domain/chat/service/ChatService.java index 769de8d..0679920 100644 --- a/src/main/java/com/back/catchmate/domain/chat/service/ChatService.java +++ b/src/main/java/com/back/catchmate/domain/chat/service/ChatService.java @@ -3,10 +3,9 @@ import com.back.catchmate.domain.chat.dto.ChatRequest.ChatMessageRequest; import com.back.catchmate.domain.chat.dto.ChatResponse; import org.springframework.data.domain.Pageable; -import reactor.core.publisher.Mono; public interface ChatService { void sendMessage(Long chatRoomId, ChatMessageRequest request); - Mono getChatMessageList(Long userId, Long roomId, Pageable pageable); + ChatResponse.PagedChatMessageInfo getChatMessageList(Long userId, Long roomId, Pageable pageable); } diff --git a/src/main/java/com/back/catchmate/domain/chat/service/ChatServiceImpl.java b/src/main/java/com/back/catchmate/domain/chat/service/ChatServiceImpl.java index 030f61f..74ab45d 100644 --- a/src/main/java/com/back/catchmate/domain/chat/service/ChatServiceImpl.java +++ b/src/main/java/com/back/catchmate/domain/chat/service/ChatServiceImpl.java @@ -10,12 +10,11 @@ import com.back.catchmate.global.error.exception.BaseException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; import static com.back.catchmate.domain.chat.dto.ChatRequest.ChatMessageRequest.MessageType; @@ -25,37 +24,29 @@ public class ChatServiceImpl implements ChatService { private final SimpMessagingTemplate messagingTemplate; private final ChatMessageRepository chatMessageRepository; - private final ChatMessageConverter chatMessageConverter; private final UserChatRoomRepository userChatRoomRepository; + private final ChatMessageConverter chatMessageConverter; // 메시지를 특정 채팅방으로 전송 @Override @Transactional public void sendMessage(Long chatRoomId, ChatMessageRequest request) { if (request.getMessageType() == MessageType.TALK) { - ChatMessage chatMessage = new ChatMessage( - chatRoomId, request.getContent(), request.getSenderId() - ); - - // DB에 메시지 저장 - chatMessageRepository.insert(chatMessage) - .doOnSuccess(savedMessage -> - log.info("Saving chat message: {}", chatMessage)) - .subscribe(); + ChatMessage chatMessage = chatMessageConverter.toChatMessage(chatRoomId, request.getContent(), request.getSenderId()); + chatMessageRepository.insert(chatMessage); } String destination = "/topic/chat." + chatRoomId; - log.info("Sending message to: {}", destination); // 디버깅 + log.info("Sending message to: {}", destination); messagingTemplate.convertAndSend(destination, request); } - public Mono getChatMessageList(Long userId, Long chatRoomId, Pageable pageable) { - // 동기 방식으로 수정된 메서드 호출 + public PagedChatMessageInfo getChatMessageList(Long userId, Long chatRoomId, Pageable pageable) { if (!userChatRoomRepository.existsByUserIdAndChatRoomId(userId, chatRoomId)) { throw new BaseException(ErrorCode.USER_CHATROOM_NOT_FOUND); } - Flux chatMessageList = chatMessageRepository.findByRoomIdOrderByIdDesc(chatRoomId, pageable); - return chatMessageConverter.toPagedMessageInfo(chatMessageList, pageable); + Page chatMessageList = chatMessageRepository.findByRoomIdOrderByIdDesc(chatRoomId, pageable); + return chatMessageConverter.toPagedChatMessageInfo(chatMessageList); } } diff --git a/src/main/java/com/back/catchmate/global/config/MongodbConfig.java b/src/main/java/com/back/catchmate/global/config/MongodbConfig.java index a2c9423..41ca244 100644 --- a/src/main/java/com/back/catchmate/global/config/MongodbConfig.java +++ b/src/main/java/com/back/catchmate/global/config/MongodbConfig.java @@ -1,9 +1,14 @@ package com.back.catchmate.global.config; +import com.mongodb.reactivestreams.client.MongoClient; +import com.mongodb.reactivestreams.client.MongoClients; +import com.mongodb.reactivestreams.client.MongoDatabase; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; +import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper; import org.springframework.data.mongodb.core.convert.MappingMongoConverter;