From ba84722f37584a25fa84d42516e9557779a823cf Mon Sep 17 00:00:00 2001 From: ThreeeJ <2171266@hansung.ac.kr> Date: Thu, 4 Jun 2026 14:56:13 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=8F=99=EB=AA=85=20=EC=9D=B4=EC=88=98?= =?UTF-8?q?=20=EA=B3=BC=EB=AA=A9=20=EC=B6=94=EA=B0=80=20=EC=8B=9C=20500=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/SubjectRepository.java | 2 +- .../service/CompletedSubjectService.java | 2 +- .../service/CompletedSubjectServiceTest.java | 25 ++++++++++++++++--- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hansung/tracktory/domain/catalog/curriculum/repository/SubjectRepository.java b/src/main/java/com/hansung/tracktory/domain/catalog/curriculum/repository/SubjectRepository.java index fa4f74e..9d8d521 100644 --- a/src/main/java/com/hansung/tracktory/domain/catalog/curriculum/repository/SubjectRepository.java +++ b/src/main/java/com/hansung/tracktory/domain/catalog/curriculum/repository/SubjectRepository.java @@ -9,7 +9,7 @@ public interface SubjectRepository extends JpaRepository { Optional findByCode(String code); - Optional findByName(String name); + Optional findFirstByNameOrderByIdAsc(String name); boolean existsByCode(String code); diff --git a/src/main/java/com/hansung/tracktory/domain/profile/service/CompletedSubjectService.java b/src/main/java/com/hansung/tracktory/domain/profile/service/CompletedSubjectService.java index e66c03c..dd56629 100644 --- a/src/main/java/com/hansung/tracktory/domain/profile/service/CompletedSubjectService.java +++ b/src/main/java/com/hansung/tracktory/domain/profile/service/CompletedSubjectService.java @@ -31,7 +31,7 @@ public class CompletedSubjectService { public CompletedSubjectResponse add(Long userId, CompletedSubjectAddRequest request) { Subject subject = subjectRepository - .findByName(request.getSubjectName()) + .findFirstByNameOrderByIdAsc(request.getSubjectName()) .orElseThrow( () -> new BusinessException(ErrorCode.VALIDATION_FAILED, "subjectName 이 존재하지 않습니다.")); diff --git a/src/test/java/com/hansung/tracktory/domain/profile/service/CompletedSubjectServiceTest.java b/src/test/java/com/hansung/tracktory/domain/profile/service/CompletedSubjectServiceTest.java index 277e098..54917cf 100644 --- a/src/test/java/com/hansung/tracktory/domain/profile/service/CompletedSubjectServiceTest.java +++ b/src/test/java/com/hansung/tracktory/domain/profile/service/CompletedSubjectServiceTest.java @@ -45,7 +45,7 @@ class CompletedSubjectServiceTest { void add_success_returnsSavedRow() { // 정상: 저장 후 id/과목/학년/학기 반환 Subject subject = mock(Subject.class); given(subject.getId()).willReturn(142L); - given(subjectRepository.findByName("자료구조")).willReturn(Optional.of(subject)); + given(subjectRepository.findFirstByNameOrderByIdAsc("자료구조")).willReturn(Optional.of(subject)); given(userCompletedSubjectRepository.existsByUserIdAndSubjectId(1L, 142L)).willReturn(false); given(userRepository.getReferenceById(1L)).willReturn(user); @@ -64,7 +64,7 @@ void add_success_returnsSavedRow() { // 정상: 저장 후 id/과목/학년/학 @Test void add_subjectNotFound_throws422() { // 없는 과목 이름이면 422 - given(subjectRepository.findByName("없는과목")).willReturn(Optional.empty()); + given(subjectRepository.findFirstByNameOrderByIdAsc("없는과목")).willReturn(Optional.empty()); assertThatThrownBy(() -> service.add(1L, addRequest("없는과목", 1, 1))) .isInstanceOf(BusinessException.class) @@ -75,11 +75,30 @@ void add_subjectNotFound_throws422() { // 없는 과목 이름이면 422 verify(eventPublisher, never()).publishEvent(any()); } + @Test + void add_duplicateName_picksFirstSubject() { // 동명 과목이 여러 개여도 첫 번째 과목으로 정상 추가 + Subject first = mock(Subject.class); + given(first.getId()).willReturn(100L); + // 카탈로그에 동명 과목이 여러 건 있어도 repository 가 id 오름차순 첫 과목만 반환 + given(subjectRepository.findFirstByNameOrderByIdAsc("데이터베이스")).willReturn(Optional.of(first)); + given(userCompletedSubjectRepository.existsByUserIdAndSubjectId(1L, 100L)).willReturn(false); + given(userRepository.getReferenceById(1L)).willReturn(user); + + UserCompletedSubject saved = UserCompletedSubject.of(user, first, 1, 1); + ReflectionTestUtils.setField(saved, "id", 9L); + given(userCompletedSubjectRepository.save(any())).willReturn(saved); + + CompletedSubjectResponse result = service.add(1L, addRequest("데이터베이스", 1, 1)); + + assertThat(result.subjectId()).isEqualTo(100L); + verify(eventPublisher).publishEvent(new CompletedSubjectsChangedEvent(1L)); + } + @Test void add_duplicate_throws409() { // 이미 이수한 과목이면 409 Subject subject = mock(Subject.class); given(subject.getId()).willReturn(142L); - given(subjectRepository.findByName("자료구조")).willReturn(Optional.of(subject)); + given(subjectRepository.findFirstByNameOrderByIdAsc("자료구조")).willReturn(Optional.of(subject)); given(userCompletedSubjectRepository.existsByUserIdAndSubjectId(1L, 142L)).willReturn(true); assertThatThrownBy(() -> service.add(1L, addRequest("자료구조", 2, 1)))