diff --git a/src/main/java/com/example/solidconnection/chat/repository/ChatRoomRepository.java b/src/main/java/com/example/solidconnection/chat/repository/ChatRoomRepository.java index ad815dbe1..cdb0dbfa6 100644 --- a/src/main/java/com/example/solidconnection/chat/repository/ChatRoomRepository.java +++ b/src/main/java/com/example/solidconnection/chat/repository/ChatRoomRepository.java @@ -35,4 +35,6 @@ SELECT COUNT(cm) FROM ChatMessage cm long countUnreadMessages(@Param("chatRoomId") long chatRoomId, @Param("userId") long userId); boolean existsByMentoringId(long mentoringId); + + List findAllByMentoringIdIn(List mentoringIds); } diff --git a/src/main/java/com/example/solidconnection/mentor/dto/MentoringForMenteeResponse.java b/src/main/java/com/example/solidconnection/mentor/dto/MentoringForMenteeResponse.java index 7f2591555..65e1e0120 100644 --- a/src/main/java/com/example/solidconnection/mentor/dto/MentoringForMenteeResponse.java +++ b/src/main/java/com/example/solidconnection/mentor/dto/MentoringForMenteeResponse.java @@ -9,16 +9,18 @@ public record MentoringForMenteeResponse( String profileImageUrl, String nickname, boolean isChecked, - ZonedDateTime createdAt + ZonedDateTime createdAt, + Long chatRoomId ) { - public static MentoringForMenteeResponse of(Mentoring mentoring, SiteUser partner) { + public static MentoringForMenteeResponse of(Mentoring mentoring, SiteUser partner, Long chatRoomId) { return new MentoringForMenteeResponse( mentoring.getId(), partner.getProfileImageUrl(), partner.getNickname(), mentoring.getCheckedAtByMentee() != null, - mentoring.getCreatedAt() + mentoring.getCreatedAt(), + chatRoomId ); } } diff --git a/src/main/java/com/example/solidconnection/mentor/dto/MentoringForMentorResponse.java b/src/main/java/com/example/solidconnection/mentor/dto/MentoringForMentorResponse.java index 54622d821..8a41fba84 100644 --- a/src/main/java/com/example/solidconnection/mentor/dto/MentoringForMentorResponse.java +++ b/src/main/java/com/example/solidconnection/mentor/dto/MentoringForMentorResponse.java @@ -1,5 +1,6 @@ package com.example.solidconnection.mentor.dto; +import com.example.solidconnection.common.VerifyStatus; import com.example.solidconnection.mentor.domain.Mentoring; import com.example.solidconnection.siteuser.domain.SiteUser; import java.time.ZonedDateTime; @@ -9,7 +10,7 @@ public record MentoringForMentorResponse( String profileImageUrl, String nickname, boolean isChecked, - boolean isConfirmed, + VerifyStatus verifyStatus, ZonedDateTime createdAt ) { @@ -19,7 +20,7 @@ public static MentoringForMentorResponse of(Mentoring mentoring, SiteUser partne partner.getProfileImageUrl(), partner.getNickname(), mentoring.getCheckedAtByMentor() != null, - mentoring.getConfirmedAt() != null, + mentoring.getVerifyStatus(), mentoring.getCreatedAt() ); } diff --git a/src/main/java/com/example/solidconnection/mentor/service/MentoringQueryService.java b/src/main/java/com/example/solidconnection/mentor/service/MentoringQueryService.java index a102b9f63..1ef037706 100644 --- a/src/main/java/com/example/solidconnection/mentor/service/MentoringQueryService.java +++ b/src/main/java/com/example/solidconnection/mentor/service/MentoringQueryService.java @@ -2,6 +2,8 @@ import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_NOT_FOUND; +import com.example.solidconnection.chat.domain.ChatRoom; +import com.example.solidconnection.chat.repository.ChatRoomRepository; import com.example.solidconnection.common.VerifyStatus; import com.example.solidconnection.common.dto.SliceResponse; import com.example.solidconnection.common.exception.CustomException; @@ -17,7 +19,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.function.Function; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -33,6 +34,7 @@ public class MentoringQueryService { private final MentoringRepository mentoringRepository; private final MentorRepository mentorRepository; private final SiteUserRepository siteUserRepository; + private final ChatRoomRepository chatRoomRepository; @Transactional(readOnly = true) public SliceResponse getMentoringsForMentee( @@ -47,15 +49,30 @@ public SliceResponse getMentoringsForMentee( mentoringSlice.toList(), Mentoring::getMentorId ); + Map mentoringIdToChatRoomId = mapMentoringIdToChatRoomIdWithBatchQuery(mentoringSlice.getContent()); List content = new ArrayList<>(); - for (Entry entry : mentoringToPartnerUser.entrySet()) { - content.add(MentoringForMenteeResponse.of(entry.getKey(), entry.getValue())); + for (Mentoring mentoring : mentoringSlice) { + content.add(MentoringForMenteeResponse.of( + mentoring, + mentoringToPartnerUser.get(mentoring), + mentoringIdToChatRoomId.get(mentoring.getId()) + )); } - return SliceResponse.of(content, mentoringSlice); } + // N+1 을 해결하면서 멘토링의 채팅방 정보 조회 + private Map mapMentoringIdToChatRoomIdWithBatchQuery(List mentorings) { + List mentoringIds = mentorings.stream() + .map(Mentoring::getId) + .distinct() + .toList(); + List chatRooms = chatRoomRepository.findAllByMentoringIdIn(mentoringIds); + return chatRooms.stream() + .collect(Collectors.toMap(ChatRoom::getMentoringId, ChatRoom::getId)); + } + @Transactional(readOnly = true) public SliceResponse getMentoringsForMentor(long siteUserId, Pageable pageable) { Mentor mentor = mentorRepository.findBySiteUserId(siteUserId) @@ -68,8 +85,8 @@ public SliceResponse getMentoringsForMentor(long sit ); List content = new ArrayList<>(); - for (Entry entry : mentoringToPartnerUser.entrySet()) { - content.add(MentoringForMentorResponse.of(entry.getKey(), entry.getValue())); + for (Mentoring mentoring : mentoringSlice) { + content.add(MentoringForMentorResponse.of(mentoring, mentoringToPartnerUser.get(mentoring))); } return SliceResponse.of(content, mentoringSlice); diff --git a/src/test/java/com/example/solidconnection/chat/fixture/ChatRoomFixture.java b/src/test/java/com/example/solidconnection/chat/fixture/ChatRoomFixture.java index cf80313bc..717852a4c 100644 --- a/src/test/java/com/example/solidconnection/chat/fixture/ChatRoomFixture.java +++ b/src/test/java/com/example/solidconnection/chat/fixture/ChatRoomFixture.java @@ -15,4 +15,11 @@ public class ChatRoomFixture { .isGroup(isGroup) .create(); } + + public ChatRoom 멘토링_채팅방(long mentoringId) { + return chatRoomFixtureBuilder.chatRoom() + .mentoringId(mentoringId) + .isGroup(false) + .create(); + } } diff --git a/src/test/java/com/example/solidconnection/chat/fixture/ChatRoomFixtureBuilder.java b/src/test/java/com/example/solidconnection/chat/fixture/ChatRoomFixtureBuilder.java index bf7ed3387..9bbb3e988 100644 --- a/src/test/java/com/example/solidconnection/chat/fixture/ChatRoomFixtureBuilder.java +++ b/src/test/java/com/example/solidconnection/chat/fixture/ChatRoomFixtureBuilder.java @@ -12,6 +12,7 @@ public class ChatRoomFixtureBuilder { private final ChatRoomRepository chatRoomRepository; private boolean isGroup; + private Long mentoringId; public ChatRoomFixtureBuilder chatRoom() { return new ChatRoomFixtureBuilder(chatRoomRepository); @@ -22,8 +23,13 @@ public ChatRoomFixtureBuilder isGroup(boolean isGroup) { return this; } + public ChatRoomFixtureBuilder mentoringId(long mentoringId) { + this.mentoringId = mentoringId; + return this; + } + public ChatRoom create() { - ChatRoom chatRoom = new ChatRoom(isGroup); + ChatRoom chatRoom = new ChatRoom(mentoringId, isGroup); return chatRoomRepository.save(chatRoom); } } diff --git a/src/test/java/com/example/solidconnection/mentor/service/MentoringQueryServiceTest.java b/src/test/java/com/example/solidconnection/mentor/service/MentoringQueryServiceTest.java index d8146dc51..867af6e56 100644 --- a/src/test/java/com/example/solidconnection/mentor/service/MentoringQueryServiceTest.java +++ b/src/test/java/com/example/solidconnection/mentor/service/MentoringQueryServiceTest.java @@ -4,6 +4,8 @@ import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.AssertionsForClassTypes.tuple; +import com.example.solidconnection.chat.domain.ChatRoom; +import com.example.solidconnection.chat.fixture.ChatRoomFixture; import com.example.solidconnection.common.VerifyStatus; import com.example.solidconnection.common.dto.SliceResponse; import com.example.solidconnection.common.exception.CustomException; @@ -45,6 +47,9 @@ class MentoringQueryServiceTest { @Autowired private MentoringRepository mentoringRepository; + @Autowired + private ChatRoomFixture chatRoomFixture; + private SiteUser mentorUser1, mentorUser2; private SiteUser menteeUser1, menteeUser2, menteeUser3; private Mentor mentor1, mentor2, mentor3; @@ -146,10 +151,12 @@ class 멘티의_멘토링_목록_조회_테스트 { } @Test - void 승인된_멘토링_목록을_조회한다() { + void 승인된_멘토링_목록과_대응하는_채팅방을_조회한다() { // given Mentoring mentoring1 = mentoringFixture.승인된_멘토링(mentor1.getId(), menteeUser1.getId()); Mentoring mentoring2 = mentoringFixture.승인된_멘토링(mentor2.getId(), menteeUser1.getId()); + ChatRoom mentoringChatRoom1 = chatRoomFixture.멘토링_채팅방(mentoring1.getId()); + ChatRoom mentoringChatRoom2 = chatRoomFixture.멘토링_채팅방(mentoring2.getId()); mentoringFixture.대기중_멘토링(mentor3.getId(), menteeUser1.getId()); // when @@ -157,10 +164,10 @@ class 멘티의_멘토링_목록_조회_테스트 { menteeUser1.getId(), VerifyStatus.APPROVED, pageable); // then - assertThat(response.content()).extracting(MentoringForMenteeResponse::mentoringId) + assertThat(response.content()).extracting(MentoringForMenteeResponse::mentoringId, MentoringForMenteeResponse::chatRoomId) .containsExactlyInAnyOrder( - mentoring1.getId(), - mentoring2.getId() + tuple(mentoring1.getId(), mentoringChatRoom1.getId()), + tuple(mentoring2.getId(), mentoringChatRoom2.getId()) ); }