From 804dcf03006ceea1ee15200f154df357a6a8fb98 Mon Sep 17 00:00:00 2001 From: Yeonri Date: Fri, 26 Jun 2026 22:04:10 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20GPA=20=EC=83=81=ED=83=9C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EC=97=90=20=EB=AA=A8=ED=95=99=EA=B5=90=EB=AA=85=20?= =?UTF-8?q?=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GPA 상태 조회 응답에 사용자의 모학교명을 포함 - 모학교가 없는 사용자는 모학교명을 null로 반환 - GPA 상태 조회 테스트를 검증 목적별로 분리 --- .../score/dto/GpaScoreStatusesResponse.java | 8 ++++-- .../score/service/ScoreService.java | 18 ++++++++++++- .../score/service/ScoreServiceTest.java | 27 +++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/solidconnection/score/dto/GpaScoreStatusesResponse.java b/src/main/java/com/example/solidconnection/score/dto/GpaScoreStatusesResponse.java index 4d31d4252..a79f8500f 100644 --- a/src/main/java/com/example/solidconnection/score/dto/GpaScoreStatusesResponse.java +++ b/src/main/java/com/example/solidconnection/score/dto/GpaScoreStatusesResponse.java @@ -3,10 +3,14 @@ import java.util.List; public record GpaScoreStatusesResponse( + String homeUniversityName, List gpaScoreStatusResponseList ) { - public static GpaScoreStatusesResponse from(List gpaScoreStatusResponseList) { - return new GpaScoreStatusesResponse(gpaScoreStatusResponseList); + public static GpaScoreStatusesResponse of( + String homeUniversityName, + List gpaScoreStatusResponseList + ) { + return new GpaScoreStatusesResponse(homeUniversityName, gpaScoreStatusResponseList); } } diff --git a/src/main/java/com/example/solidconnection/score/service/ScoreService.java b/src/main/java/com/example/solidconnection/score/service/ScoreService.java index f1f055c81..3e60b9bd3 100644 --- a/src/main/java/com/example/solidconnection/score/service/ScoreService.java +++ b/src/main/java/com/example/solidconnection/score/service/ScoreService.java @@ -1,5 +1,6 @@ package com.example.solidconnection.score.service; +import static com.example.solidconnection.common.exception.ErrorCode.UNIVERSITY_NOT_FOUND; import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND; import com.example.solidconnection.application.domain.Gpa; @@ -20,6 +21,8 @@ import com.example.solidconnection.score.repository.LanguageTestScoreRepository; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; +import com.example.solidconnection.university.domain.HomeUniversity; +import com.example.solidconnection.university.repository.HomeUniversityRepository; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -35,6 +38,7 @@ public class ScoreService { private final S3Service s3Service; private final LanguageTestScoreRepository languageTestScoreRepository; private final SiteUserRepository siteUserRepository; + private final HomeUniversityRepository homeUniversityRepository; @Transactional public Long submitGpaScore(long siteUserId, GpaScoreRequest gpaScoreRequest, MultipartFile file) { @@ -63,13 +67,25 @@ public Long submitLanguageTestScore(long siteUserId, LanguageTestScoreRequest la public GpaScoreStatusesResponse getGpaScoreStatus(long siteUserId) { SiteUser siteUser = siteUserRepository.findById(siteUserId) .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + String homeUniversityName = findHomeUniversityName(siteUser); List gpaScoreStatusResponseList = gpaScoreRepository.findBySiteUserId(siteUser.getId()) .stream() .map(GpaScoreStatusResponse::from) .toList(); - return GpaScoreStatusesResponse.from(gpaScoreStatusResponseList); + return GpaScoreStatusesResponse.of(homeUniversityName, gpaScoreStatusResponseList); + } + + private String findHomeUniversityName(SiteUser siteUser) { + Long homeUniversityId = siteUser.getHomeUniversityId(); + if (homeUniversityId == null) { + return null; + } + + HomeUniversity homeUniversity = homeUniversityRepository.findById(homeUniversityId) + .orElseThrow(() -> new CustomException(UNIVERSITY_NOT_FOUND)); + return homeUniversity.getName(); } @Transactional(readOnly = true) diff --git a/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java b/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java index ddf7a722e..634e40741 100644 --- a/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java +++ b/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java @@ -20,7 +20,9 @@ import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.fixture.SiteUserFixture; import com.example.solidconnection.support.TestContainerSpringBootTest; +import com.example.solidconnection.university.domain.HomeUniversity; import com.example.solidconnection.university.domain.LanguageTestType; +import com.example.solidconnection.university.fixture.HomeUniversityFixture; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -54,6 +56,9 @@ class ScoreServiceTest { @Autowired private LanguageTestScoreFixture languageTestScoreFixture; + @Autowired + private HomeUniversityFixture homeUniversityFixture; + private SiteUser user; @BeforeEach @@ -76,6 +81,19 @@ void setUp() { assertThat(response.gpaScoreStatusResponseList()).hasSize(scores.size()); } + @Test + void GPA_점수_상태를_조회할_때_사용자의_모학교명을_반환한다() { + // given + HomeUniversity homeUniversity = homeUniversityFixture.인하대학교(); + user = siteUserFixture.국내_대학_정보_소지_사용자(homeUniversity.getId()); + + // when + GpaScoreStatusesResponse response = scoreService.getGpaScoreStatus(user.getId()); + + // then + assertThat(response.homeUniversityName()).isEqualTo(homeUniversity.getName()); + } + @Test void GPA_점수가_없는_경우_빈_리스트를_반환한다() { // when @@ -85,6 +103,15 @@ void setUp() { assertThat(response.gpaScoreStatusResponseList()).isEmpty(); } + @Test + void 모학교가_없는_사용자의_GPA_점수_상태를_조회하면_모학교명은_null이다() { + // when + GpaScoreStatusesResponse response = scoreService.getGpaScoreStatus(user.getId()); + + // then + assertThat(response.homeUniversityName()).isNull(); + } + @Test void 어학_시험_점수_상태를_조회한다() { // given From 79e11710654755bed510e36f49151a5842e20004 Mon Sep 17 00:00:00 2001 From: Yeonri Date: Sat, 27 Jun 2026 11:48:26 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20GPA=20=EC=A1=B0=ED=9A=8C=20=ED=95=99?= =?UTF-8?q?=EA=B5=90=20=EC=9D=B8=EC=A6=9D=20=EC=A0=95=EC=B1=85=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 모학교 조회 로직을 HomeUniversityQueryService로 분리 - GPA 상태 조회 시 학교 미인증 사용자는 예외 처리 - 마이페이지는 미인증 사용자 모학교명을 null로 유지 - GPA 상태 조회 테스트를 학교 인증 정책에 맞게 수정 --- .../common/exception/ErrorCode.java | 1 + .../score/service/ScoreService.java | 19 ++------- .../siteuser/service/MyPageService.java | 18 ++------ .../service/HomeUniversityQueryService.java | 42 +++++++++++++++++++ .../score/service/ScoreServiceTest.java | 20 +++++---- 5 files changed, 60 insertions(+), 40 deletions(-) create mode 100644 src/main/java/com/example/solidconnection/university/service/HomeUniversityQueryService.java diff --git a/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java b/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java index 214da0838..5638c024a 100644 --- a/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java +++ b/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java @@ -88,6 +88,7 @@ public enum ErrorCode { SCHOOL_EMAIL_CONFIRM_CODE_DIFFERENT(HttpStatus.BAD_REQUEST.value(), "인증 코드가 일치하지 않습니다."), SCHOOL_EMAIL_VERIFICATION_INFO_SAVE_FAILED(HttpStatus.INTERNAL_SERVER_ERROR.value(), "학교 이메일 인증 정보 저장에 실패했습니다."), SCHOOL_EMAIL_VERIFICATION_INFO_CORRUPTED(HttpStatus.INTERNAL_SERVER_ERROR.value(), "학교 이메일 인증 정보가 손상되었습니다. 인증 코드 발송을 다시 요청해주세요."), + SCHOOL_EMAIL_NOT_VERIFIED(HttpStatus.BAD_REQUEST.value(), "학교 이메일 인증이 필요합니다."), // s3 S3_SERVICE_EXCEPTION(HttpStatus.BAD_REQUEST.value(), "S3 서비스 에러 발생"), diff --git a/src/main/java/com/example/solidconnection/score/service/ScoreService.java b/src/main/java/com/example/solidconnection/score/service/ScoreService.java index 3e60b9bd3..871c955f4 100644 --- a/src/main/java/com/example/solidconnection/score/service/ScoreService.java +++ b/src/main/java/com/example/solidconnection/score/service/ScoreService.java @@ -1,6 +1,5 @@ package com.example.solidconnection.score.service; -import static com.example.solidconnection.common.exception.ErrorCode.UNIVERSITY_NOT_FOUND; import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND; import com.example.solidconnection.application.domain.Gpa; @@ -21,8 +20,7 @@ import com.example.solidconnection.score.repository.LanguageTestScoreRepository; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.university.domain.HomeUniversity; -import com.example.solidconnection.university.repository.HomeUniversityRepository; +import com.example.solidconnection.university.service.HomeUniversityQueryService; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -38,7 +36,7 @@ public class ScoreService { private final S3Service s3Service; private final LanguageTestScoreRepository languageTestScoreRepository; private final SiteUserRepository siteUserRepository; - private final HomeUniversityRepository homeUniversityRepository; + private final HomeUniversityQueryService homeUniversityQueryService; @Transactional public Long submitGpaScore(long siteUserId, GpaScoreRequest gpaScoreRequest, MultipartFile file) { @@ -67,7 +65,7 @@ public Long submitLanguageTestScore(long siteUserId, LanguageTestScoreRequest la public GpaScoreStatusesResponse getGpaScoreStatus(long siteUserId) { SiteUser siteUser = siteUserRepository.findById(siteUserId) .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); - String homeUniversityName = findHomeUniversityName(siteUser); + String homeUniversityName = homeUniversityQueryService.findNameByRequiredId(siteUser.getHomeUniversityId()); List gpaScoreStatusResponseList = gpaScoreRepository.findBySiteUserId(siteUser.getId()) .stream() @@ -77,17 +75,6 @@ public GpaScoreStatusesResponse getGpaScoreStatus(long siteUserId) { return GpaScoreStatusesResponse.of(homeUniversityName, gpaScoreStatusResponseList); } - private String findHomeUniversityName(SiteUser siteUser) { - Long homeUniversityId = siteUser.getHomeUniversityId(); - if (homeUniversityId == null) { - return null; - } - - HomeUniversity homeUniversity = homeUniversityRepository.findById(homeUniversityId) - .orElseThrow(() -> new CustomException(UNIVERSITY_NOT_FOUND)); - return homeUniversity.getName(); - } - @Transactional(readOnly = true) public LanguageTestScoreStatusesResponse getLanguageTestScoreStatus(long siteUserId) { SiteUser siteUser = siteUserRepository.findById(siteUserId) diff --git a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java index 69daa9273..95367668b 100644 --- a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java +++ b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java @@ -25,10 +25,9 @@ import com.example.solidconnection.siteuser.dto.PasswordUpdateRequest; import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.university.domain.HostUniversity; -import com.example.solidconnection.university.domain.HomeUniversity; import com.example.solidconnection.university.repository.HostUniversityRepository; -import com.example.solidconnection.university.repository.HomeUniversityRepository; import com.example.solidconnection.university.repository.LikedUnivApplyInfoRepository; +import com.example.solidconnection.university.service.HomeUniversityQueryService; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; @@ -51,7 +50,7 @@ public class MyPageService { private final CountryRepository countryRepository; private final MentorRepository mentorRepository; private final HostUniversityRepository hostUniversityRepository; - private final HomeUniversityRepository homeUniversityRepository; + private final HomeUniversityQueryService homeUniversityQueryService; private final S3Service s3Service; private final InterestedCountryService interestedCountryService; private final InterestedRegionService interestedRegionService; @@ -67,7 +66,7 @@ public MyPageResponse getMyPageInfo(long siteUserId) { List interestedCountries = null; String universityKoreanName = null; - String homeUniversityName = findHomeUniversityName(siteUser); + String homeUniversityName = homeUniversityQueryService.findNameByNullableId(siteUser.getHomeUniversityId()); if (siteUser.getRole() == Role.MENTEE) { interestedCountries = countryRepository.findKoreanNamesBySiteUserId(siteUser.getId()); } else if (siteUser.getRole() == Role.MENTOR) { @@ -86,17 +85,6 @@ public MyPageResponse getMyPageInfo(long siteUserId) { ); } - private String findHomeUniversityName(SiteUser siteUser) { - Long homeUniversityId = siteUser.getHomeUniversityId(); - if (homeUniversityId == null) { - return null; - } - - HomeUniversity homeUniversity = homeUniversityRepository.findById(homeUniversityId) - .orElseThrow(() -> new CustomException(UNIVERSITY_NOT_FOUND)); - return homeUniversity.getName(); - } - /* * 마이페이지 정보를 수정한다. * */ diff --git a/src/main/java/com/example/solidconnection/university/service/HomeUniversityQueryService.java b/src/main/java/com/example/solidconnection/university/service/HomeUniversityQueryService.java new file mode 100644 index 000000000..6d489ae74 --- /dev/null +++ b/src/main/java/com/example/solidconnection/university/service/HomeUniversityQueryService.java @@ -0,0 +1,42 @@ +package com.example.solidconnection.university.service; + +import static com.example.solidconnection.common.exception.ErrorCode.SCHOOL_EMAIL_NOT_VERIFIED; +import static com.example.solidconnection.common.exception.ErrorCode.UNIVERSITY_NOT_FOUND; + +import com.example.solidconnection.common.exception.CustomException; +import com.example.solidconnection.university.domain.HomeUniversity; +import com.example.solidconnection.university.repository.HomeUniversityRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class HomeUniversityQueryService { + + private final HomeUniversityRepository homeUniversityRepository; + + @Transactional(readOnly = true) + public String findNameByNullableId(Long homeUniversityId) { + if (homeUniversityId == null) { + return null; + } + + return findNameById(homeUniversityId); + } + + @Transactional(readOnly = true) + public String findNameByRequiredId(Long homeUniversityId) { + if (homeUniversityId == null) { + throw new CustomException(SCHOOL_EMAIL_NOT_VERIFIED); + } + + return findNameById(homeUniversityId); + } + + private String findNameById(Long homeUniversityId) { + HomeUniversity homeUniversity = homeUniversityRepository.findById(homeUniversityId) + .orElseThrow(() -> new CustomException(UNIVERSITY_NOT_FOUND)); + return homeUniversity.getName(); + } +} diff --git a/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java b/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java index 634e40741..c4d25ce9c 100644 --- a/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java +++ b/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java @@ -1,9 +1,11 @@ package com.example.solidconnection.score.service; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.BDDMockito.given; import com.example.solidconnection.common.VerifyStatus; +import com.example.solidconnection.common.exception.ErrorCode; import com.example.solidconnection.s3.domain.UploadPath; import com.example.solidconnection.s3.dto.UploadedFileUrlResponse; import com.example.solidconnection.s3.service.S3Service; @@ -59,11 +61,13 @@ class ScoreServiceTest { @Autowired private HomeUniversityFixture homeUniversityFixture; + private HomeUniversity homeUniversity; private SiteUser user; @BeforeEach void setUp() { - user = siteUserFixture.사용자(); + homeUniversity = homeUniversityFixture.인하대학교(); + user = siteUserFixture.국내_대학_정보_소지_사용자(homeUniversity.getId()); } @Test @@ -83,10 +87,6 @@ void setUp() { @Test void GPA_점수_상태를_조회할_때_사용자의_모학교명을_반환한다() { - // given - HomeUniversity homeUniversity = homeUniversityFixture.인하대학교(); - user = siteUserFixture.국내_대학_정보_소지_사용자(homeUniversity.getId()); - // when GpaScoreStatusesResponse response = scoreService.getGpaScoreStatus(user.getId()); @@ -104,12 +104,14 @@ void setUp() { } @Test - void 모학교가_없는_사용자의_GPA_점수_상태를_조회하면_모학교명은_null이다() { - // when - GpaScoreStatusesResponse response = scoreService.getGpaScoreStatus(user.getId()); + void 모학교가_없는_사용자의_GPA_점수_상태를_조회하면_예외가_발생한다() { + // given + user = siteUserFixture.사용자(); + // when // then - assertThat(response.homeUniversityName()).isNull(); + assertThatThrownBy(() -> scoreService.getGpaScoreStatus(user.getId())) + .hasMessage(ErrorCode.SCHOOL_EMAIL_NOT_VERIFIED.getMessage()); } @Test