diff --git a/src/main/java/com/goorm/team9/icontact/config/jpa/JpaConfig.java b/src/main/java/com/goorm/team9/icontact/config/jpa/JpaConfig.java index a3d5112d..91f1c0b9 100644 --- a/src/main/java/com/goorm/team9/icontact/config/jpa/JpaConfig.java +++ b/src/main/java/com/goorm/team9/icontact/config/jpa/JpaConfig.java @@ -2,8 +2,10 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableJpaAuditing +@EnableTransactionManagement public class JpaConfig { } diff --git a/src/main/java/com/goorm/team9/icontact/domain/chat/repository/ChatMessageRepository.java b/src/main/java/com/goorm/team9/icontact/domain/chat/repository/ChatMessageRepository.java index ce96d26c..43c31b6a 100644 --- a/src/main/java/com/goorm/team9/icontact/domain/chat/repository/ChatMessageRepository.java +++ b/src/main/java/com/goorm/team9/icontact/domain/chat/repository/ChatMessageRepository.java @@ -4,8 +4,10 @@ import com.goorm.team9.icontact.domain.chat.entity.ChatRoom; import com.goorm.team9.icontact.domain.client.entity.ClientEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -31,4 +33,14 @@ List findUnreadMessages(@Param("chatRoom") ChatRoom chatRoom, @Query("SELECT m FROM ChatMessage m WHERE m.chatRoom = :chatRoom ORDER BY m.created_at ASC") List findByChatRoomOrderByCreatedAtAsc(@Param("chatRoom") ChatRoom chatRoom); + @Modifying + @Query("UPDATE ChatMessage m " + + "SET m.isRead = true " + + "WHERE m.chatRoom = :chatRoom " + + "AND m.isRead = false " + + "AND m.senderNickname <> :readerNickname") + int markMessagesAsRead(@Param("chatRoom") ChatRoom chatRoom, + @Param("readerNickname") String readerNickname); + + } \ No newline at end of file diff --git a/src/main/java/com/goorm/team9/icontact/domain/chat/service/ChatMessageService.java b/src/main/java/com/goorm/team9/icontact/domain/chat/service/ChatMessageService.java index 0b3aca98..d8c9edd3 100644 --- a/src/main/java/com/goorm/team9/icontact/domain/chat/service/ChatMessageService.java +++ b/src/main/java/com/goorm/team9/icontact/domain/chat/service/ChatMessageService.java @@ -12,6 +12,7 @@ import com.goorm.team9.icontact.domain.client.entity.ClientEntity; import com.goorm.team9.icontact.domain.client.repository.ClientRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; @@ -21,6 +22,7 @@ import java.util.List; import java.util.stream.Collectors; +@Slf4j @Service @RequiredArgsConstructor public class ChatMessageService { @@ -144,13 +146,11 @@ public void markMessagesAsRead(Long roomId, Long clientId) { ClientEntity reader = clientRepository.findById(clientId) .orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다.")); - List unreadMessages = chatMessageRepository.findUnreadMessages(chatRoom, reader); + int updatedCount = chatMessageRepository.markMessagesAsRead(chatRoom, reader.getNickName()); - for (ChatMessage chatMessage : unreadMessages) { - chatMessage.markAsRead(); + if (updatedCount > 0) { + log.info("✅ {}개의 메시지를 읽음 처리했습니다. [roomId={}, reader={}]", updatedCount, roomId, reader.getNickName()); } - - chatMessageRepository.saveAll(unreadMessages); } } \ No newline at end of file