From ee0da7bc8573b9c7159651456c2a19a1569b870d Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Sat, 30 Mar 2024 22:28:49 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=B1=84=ED=8C=85=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=ED=94=84?= =?UTF-8?q?=EB=A6=AC=EC=9B=8C=EB=B0=8D(Pre-warming)=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/event/chat/ChatInitCacheEvent.java | 10 +++++ .../ChatCursorCacheInitializer.java | 31 ++++++++++++++ .../chat/implementation/ChatReader.java | 9 ++++ .../repository/ChatRepositoryForCursor.java | 4 +- .../ChatRepositoryForCursorImpl.java | 42 +++++++++++++++++++ 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 lime-api/src/main/java/com/programmers/lime/global/event/chat/ChatInitCacheEvent.java create mode 100644 lime-api/src/main/java/com/programmers/lime/global/initializer/ChatCursorCacheInitializer.java diff --git a/lime-api/src/main/java/com/programmers/lime/global/event/chat/ChatInitCacheEvent.java b/lime-api/src/main/java/com/programmers/lime/global/event/chat/ChatInitCacheEvent.java new file mode 100644 index 00000000..5fa1758f --- /dev/null +++ b/lime-api/src/main/java/com/programmers/lime/global/event/chat/ChatInitCacheEvent.java @@ -0,0 +1,10 @@ +package com.programmers.lime.global.event.chat; + +import java.util.List; + +import com.programmers.lime.domains.chatroom.model.ChatRoomInfo; + +public record ChatInitCacheEvent( + List chatRoomInfos +) { +} diff --git a/lime-api/src/main/java/com/programmers/lime/global/initializer/ChatCursorCacheInitializer.java b/lime-api/src/main/java/com/programmers/lime/global/initializer/ChatCursorCacheInitializer.java new file mode 100644 index 00000000..4b75e5f8 --- /dev/null +++ b/lime-api/src/main/java/com/programmers/lime/global/initializer/ChatCursorCacheInitializer.java @@ -0,0 +1,31 @@ +package com.programmers.lime.global.initializer; + +import java.util.List; + +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Component; + +import com.programmers.lime.domains.chatroom.implementation.ChatRoomReader; +import com.programmers.lime.domains.chatroom.model.ChatRoomInfo; +import com.programmers.lime.global.event.chat.ChatInitCacheEvent; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class ChatCursorCacheInitializer implements ApplicationRunner { + + private final ChatRoomReader chatRoomReader; + + private final ApplicationEventPublisher eventPublisher; + + @Override + public void run(final ApplicationArguments args) { + List chatRoomInfos = chatRoomReader.readOpenChatRoomsByMemberId(null); + + ChatInitCacheEvent chatInitCacheEvent = new ChatInitCacheEvent(chatRoomInfos); + eventPublisher.publishEvent(chatInitCacheEvent); + } +} \ No newline at end of file diff --git a/lime-domain/src/main/java/com/programmers/lime/domains/chat/implementation/ChatReader.java b/lime-domain/src/main/java/com/programmers/lime/domains/chat/implementation/ChatReader.java index 17d15e93..562dcf10 100644 --- a/lime-domain/src/main/java/com/programmers/lime/domains/chat/implementation/ChatReader.java +++ b/lime-domain/src/main/java/com/programmers/lime/domains/chat/implementation/ChatReader.java @@ -41,4 +41,13 @@ private int getPageSize(final CursorPageParameters parameters) { return parameterSize; } + + public ChatSummary readFirstChat(final Long chatRoomId) { + return chatRepository.findFirstByCursor(chatRoomId); + } + + public ChatSummary readLastChat(final Long chatRoomId) { + return chatRepository.findLastByCursor(chatRoomId); + } + } diff --git a/lime-domain/src/main/java/com/programmers/lime/domains/chat/repository/ChatRepositoryForCursor.java b/lime-domain/src/main/java/com/programmers/lime/domains/chat/repository/ChatRepositoryForCursor.java index 3436a0a6..248ce8a4 100644 --- a/lime-domain/src/main/java/com/programmers/lime/domains/chat/repository/ChatRepositoryForCursor.java +++ b/lime-domain/src/main/java/com/programmers/lime/domains/chat/repository/ChatRepositoryForCursor.java @@ -2,7 +2,6 @@ import java.util.List; -import com.programmers.lime.domains.chat.model.ChatInfoWithMember; import com.programmers.lime.domains.chat.model.ChatSummary; public interface ChatRepositoryForCursor { @@ -13,4 +12,7 @@ List findAllByCursor( final int pageSize ); + ChatSummary findFirstByCursor(final Long chatRoomId); + + ChatSummary findLastByCursor(final Long chatRoomId); } diff --git a/lime-domain/src/main/java/com/programmers/lime/domains/chat/repository/ChatRepositoryForCursorImpl.java b/lime-domain/src/main/java/com/programmers/lime/domains/chat/repository/ChatRepositoryForCursorImpl.java index 3480e0d6..d6fe90ee 100644 --- a/lime-domain/src/main/java/com/programmers/lime/domains/chat/repository/ChatRepositoryForCursorImpl.java +++ b/lime-domain/src/main/java/com/programmers/lime/domains/chat/repository/ChatRepositoryForCursorImpl.java @@ -53,6 +53,48 @@ public List findAllByCursor( .fetch(); } + @Override + public ChatSummary findFirstByCursor(final Long chatRoomId) { + return queryFactory + .select(Projections.constructor(ChatSummary.class, + generateChatCursorId(), + chat.id.as("chatId"), + chat.chatRoomId, + chat.memberId, + member.nickname.nickname, + member.socialInfo.profileImage, + chat.message, + chat.sendAt, + chat.chatType) + ) + .from(chat) + .join(member).on(chat.memberId.eq(member.id)) + .where(chat.chatRoomId.eq(chatRoomId)) + .orderBy(chat.sendAt.desc()) + .fetchFirst(); + } + + @Override + public ChatSummary findLastByCursor(final Long chatRoomId) { + return queryFactory + .select(Projections.constructor(ChatSummary.class, + generateChatCursorId(), + chat.id.as("chatId"), + chat.chatRoomId, + chat.memberId, + member.nickname.nickname, + member.socialInfo.profileImage, + chat.message, + chat.sendAt, + chat.chatType) + ) + .from(chat) + .join(member).on(chat.memberId.eq(member.id)) + .where(chat.chatRoomId.eq(chatRoomId)) + .orderBy(chat.sendAt.asc()) + .fetchFirst(); + } + private BooleanExpression cursorIdCondition(final String cursorId) { if (cursorId == null) { return null;