From a39d95a848cef498bec6669362d88590267c9ba2 Mon Sep 17 00:00:00 2001 From: ownue Date: Thu, 6 Aug 2026 17:28:57 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20AI=20=EB=A9=98=ED=86=A0=20=EB=8C=80?= =?UTF-8?q?=ED=99=94=20=EB=82=B4=EC=97=AD=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C?= =?UTF-8?q?=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20(#105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/AnalysisRepository.java | 3 +++ .../domain/mentor/service/MentorService.java | 9 ++++--- .../mentor/service/MentorServiceTest.java | 24 ++++--------------- 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/mr/domain/analysis/repository/AnalysisRepository.java b/src/main/java/com/mr/domain/analysis/repository/AnalysisRepository.java index 2da8d251..9cbbd888 100644 --- a/src/main/java/com/mr/domain/analysis/repository/AnalysisRepository.java +++ b/src/main/java/com/mr/domain/analysis/repository/AnalysisRepository.java @@ -43,6 +43,9 @@ List findIdsByStatusAndProcessingStartedAtBefore( Pageable pageable ); + @Query("select a.user.userId from Analysis a where a.id = :analysisId") + Optional findUserIdById(@Param("analysisId") Long analysisId); + @Query(""" select a from Analysis a where a.playing.id in :playingIds and a.status = :status diff --git a/src/main/java/com/mr/domain/mentor/service/MentorService.java b/src/main/java/com/mr/domain/mentor/service/MentorService.java index 23b2f37d..dcb54d1b 100644 --- a/src/main/java/com/mr/domain/mentor/service/MentorService.java +++ b/src/main/java/com/mr/domain/mentor/service/MentorService.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.mr.domain.analysis.entity.Analysis; import com.mr.domain.analysis.exception.AnalysisErrorStatus; import com.mr.domain.analysis.repository.AnalysisRepository; import com.mr.domain.mentor.dto.res.MentorMessageHistoryResponseDTO; @@ -28,9 +27,9 @@ public class MentorService { private final ObjectMapper objectMapper; public MentorMessageHistoryResponseDTO getMessageHistory(Long userId, Long analysisId) { - Analysis analysis = analysisRepository.findById(analysisId) + Long ownerId = analysisRepository.findUserIdById(analysisId) .orElseThrow(() -> new GeneralException(AnalysisErrorStatus.ANALYSIS_NOT_FOUND)); - validateOwner(analysis, userId); + validateOwner(ownerId, userId); List messages = mentorMessageRepository .findByMentorChatSessionAnalysisIdOrderByCreatedAtAscIdAsc(analysisId) @@ -44,8 +43,8 @@ public MentorMessageHistoryResponseDTO getMessageHistory(Long userId, Long analy return new MentorMessageHistoryResponseDTO(analysisId, messages); } - private void validateOwner(Analysis analysis, Long userId) { - if (!Objects.equals(analysis.getUser().getUserId(), userId)) { + private void validateOwner(Long ownerId, Long userId) { + if (!Objects.equals(ownerId, userId)) { throw new GeneralException(MentorErrorStatus.MENTOR_ACCESS_DENIED); } } diff --git a/src/test/java/com/mr/domain/mentor/service/MentorServiceTest.java b/src/test/java/com/mr/domain/mentor/service/MentorServiceTest.java index 6202c92f..f9a78499 100644 --- a/src/test/java/com/mr/domain/mentor/service/MentorServiceTest.java +++ b/src/test/java/com/mr/domain/mentor/service/MentorServiceTest.java @@ -8,7 +8,6 @@ import static org.mockito.Mockito.verifyNoInteractions; import com.fasterxml.jackson.databind.ObjectMapper; -import com.mr.domain.analysis.entity.Analysis; import com.mr.domain.analysis.exception.AnalysisErrorStatus; import com.mr.domain.analysis.repository.AnalysisRepository; import com.mr.domain.mentor.dto.res.MentorMessageHistoryResponseDTO; @@ -16,7 +15,6 @@ import com.mr.domain.mentor.entity.enums.MessageRole; import com.mr.domain.mentor.exception.MentorErrorStatus; import com.mr.domain.mentor.repository.MentorMessageRepository; -import com.mr.domain.user.entity.User; import com.mr.global.apipayload.exception.GeneralException; import java.time.LocalDateTime; import java.util.List; @@ -51,8 +49,7 @@ void setUp() { @Test @DisplayName("대화 세션이 없으면 빈 메시지 목록 반환") void getMessageHistory_noSession_returnsEmptyMessages() { - Analysis analysis = analysisOwnedBy(1L); - given(analysisRepository.findById(10L)).willReturn(Optional.of(analysis)); + given(analysisRepository.findUserIdById(10L)).willReturn(Optional.of(1L)); given(mentorMessageRepository.findByMentorChatSessionAnalysisIdOrderByCreatedAtAscIdAsc(10L)) .willReturn(List.of()); @@ -65,7 +62,6 @@ void getMessageHistory_noSession_returnsEmptyMessages() { @Test @DisplayName("대화 메시지와 판단 근거 JSON 반환") void getMessageHistory_success() { - Analysis analysis = analysisOwnedBy(1L); MentorMessage message = mock(MentorMessage.class); LocalDateTime createdAt = LocalDateTime.of(2026, 7, 1, 14, 35); @@ -76,7 +72,7 @@ void getMessageHistory_success() { """); given(message.getContent()).willReturn("텐션음을 자주 사용했어요."); given(message.getCreatedAt()).willReturn(createdAt); - given(analysisRepository.findById(10L)).willReturn(Optional.of(analysis)); + given(analysisRepository.findUserIdById(10L)).willReturn(Optional.of(1L)); given(mentorMessageRepository.findByMentorChatSessionAnalysisIdOrderByCreatedAtAscIdAsc(10L)) .willReturn(List.of(message)); @@ -92,8 +88,7 @@ void getMessageHistory_success() { @Test @DisplayName("다른 사용자의 분석이면 접근 거부") void getMessageHistory_otherOwner_throwsAccessDenied() { - Analysis analysis = analysisOwnedBy(1L); - given(analysisRepository.findById(10L)).willReturn(Optional.of(analysis)); + given(analysisRepository.findUserIdById(10L)).willReturn(Optional.of(1L)); assertThatThrownBy(() -> mentorService.getMessageHistory(2L, 10L)) .isInstanceOf(GeneralException.class) @@ -105,7 +100,7 @@ void getMessageHistory_otherOwner_throwsAccessDenied() { @Test @DisplayName("분석이 없으면 분석 미존재 오류") void getMessageHistory_analysisNotFound_throwsNotFound() { - given(analysisRepository.findById(10L)).willReturn(Optional.empty()); + given(analysisRepository.findUserIdById(10L)).willReturn(Optional.empty()); assertThatThrownBy(() -> mentorService.getMessageHistory(1L, 10L)) .isInstanceOf(GeneralException.class) @@ -115,7 +110,6 @@ void getMessageHistory_analysisNotFound_throwsNotFound() { @Test @DisplayName("판단 근거 JSON 하나가 손상되어도 나머지 대화 내역 반환") void getMessageHistory_invalidReferences_returnsNullAndContinues() { - Analysis analysis = analysisOwnedBy(1L); MentorMessage invalidMessage = mock(MentorMessage.class); MentorMessage validMessage = mock(MentorMessage.class); @@ -126,7 +120,7 @@ void getMessageHistory_invalidReferences_returnsNullAndContinues() { given(validMessage.getId()).willReturn(31L); given(validMessage.getRole()).willReturn(MessageRole.USER); given(validMessage.getContent()).willReturn("다음 질문"); - given(analysisRepository.findById(10L)).willReturn(Optional.of(analysis)); + given(analysisRepository.findUserIdById(10L)).willReturn(Optional.of(1L)); given(mentorMessageRepository.findByMentorChatSessionAnalysisIdOrderByCreatedAtAscIdAsc(10L)) .willReturn(List.of(invalidMessage, validMessage)); @@ -138,12 +132,4 @@ void getMessageHistory_invalidReferences_returnsNullAndContinues() { assertThat(response.messages().get(1).mentorMessageId()).isEqualTo(31L); assertThat(response.messages().get(1).content()).isEqualTo("다음 질문"); } - - private Analysis analysisOwnedBy(Long userId) { - User user = mock(User.class); - Analysis analysis = mock(Analysis.class); - given(user.getUserId()).willReturn(userId); - given(analysis.getUser()).willReturn(user); - return analysis; - } }