From b6037ab22ad018a93781deaae4360681d03170bd Mon Sep 17 00:00:00 2001 From: Yeonri Date: Tue, 1 Jul 2025 15:39:04 +0900 Subject: [PATCH 01/11] =?UTF-8?q?refactor:=20community=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=A0=9C=EC=99=B8=20=EC=97=B0=EA=B4=80?= =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EC=82=AD=EC=A0=9C=20-=20Application,=20Co?= =?UTF-8?q?untry,=20GpaScore,=20InterestedCountry/Region,=20LanguageTestSc?= =?UTF-8?q?ore,=20LikedUniversity.=20SiteUser,=20UnivApplyInfo=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=88=98=EC=A0=95=20-=20=EC=97=B0?= =?UTF-8?q?=EA=B4=80=EA=B4=80=EA=B3=84=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=20parameter=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=8B=A4=EC=88=98=20-=20test=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/domain/Application.java | 10 ++-- .../dto/UniversityApplicantsResponse.java | 2 +- .../repository/ApplicationRepository.java | 12 ++--- .../service/ApplicationQueryService.java | 4 +- .../service/ApplicationSubmissionService.java | 6 +-- .../location/country/domain/Country.java | 8 +-- .../country/domain/InterestedCountry.java | 20 +++----- .../InterestedCountryRepository.java | 2 +- .../region/domain/InterestedRegion.java | 20 +++----- .../InterestedRegionRepository.java | 2 +- .../score/domain/GpaScore.java | 13 +---- .../score/domain/LanguageTestScore.java | 13 +---- .../score/repository/GpaScoreRepository.java | 6 ++- .../LanguageTestScoreRepository.java | 6 ++- .../custom/GpaScoreFilterRepositoryImpl.java | 4 +- ...LanguageTestScoreFilterRepositoryImpl.java | 4 +- .../score/service/ScoreService.java | 50 ++++++------------- .../siteuser/domain/SiteUser.java | 6 --- .../repository/LikedUniversityRepository.java | 17 +++++-- .../siteuser/service/MyPageService.java | 10 ++-- .../university/domain/LikedUniversity.java | 18 ++----- .../university/domain/UnivApplyInfo.java | 7 ++- .../UniversityInfoForApplyRepository.java | 34 ++++++------- .../UniversityFilterRepositoryImpl.java | 13 ++--- .../service/UniversityLikeService.java | 20 +++++--- .../service/UniversityRecommendService.java | 2 +- .../ApplicationSubmissionServiceTest.java | 2 +- .../fixture/CountryFixtureBuilder.java | 2 +- .../score/fixture/GpaScoreFixtureBuilder.java | 1 - .../LanguageTestScoreFixtureBuilder.java | 1 - .../siteuser/service/MyPageServiceTest.java | 8 +-- .../UniversityLikeRepositoryTest.java | 4 +- .../service/UniversityLikeServiceTest.java | 12 ++--- 33 files changed, 146 insertions(+), 193 deletions(-) diff --git a/src/main/java/com/example/solidconnection/application/domain/Application.java b/src/main/java/com/example/solidconnection/application/domain/Application.java index 5f982410e..8dc371a07 100644 --- a/src/main/java/com/example/solidconnection/application/domain/Application.java +++ b/src/main/java/com/example/solidconnection/application/domain/Application.java @@ -74,15 +74,15 @@ public class Application { @Column(name = "third_choice_university_info_for_apply_id") private Long thirdChoiceUnivApplyInfoId; - @ManyToOne(fetch = FetchType.LAZY) - private SiteUser siteUser; + @Column(name = "site_user_id") + private long siteUserId; public Application( SiteUser siteUser, Gpa gpa, LanguageTest languageTest, String term) { - this.siteUser = siteUser; + this.siteUserId = siteUser.getId(); this.gpa = gpa; this.languageTest = languageTest; this.term = term; @@ -100,7 +100,7 @@ public Application( Long secondChoiceUnivApplyInfoId, Long thirdChoiceUnivApplyInfoId, String nicknameForApply) { - this.siteUser = siteUser; + this.siteUserId = siteUser.getId(); this.gpa = gpa; this.languageTest = languageTest; this.term = term; @@ -121,7 +121,7 @@ public Application( Long secondChoiceUnivApplyInfoId, Long thirdChoiceUnivApplyInfoId, String nicknameForApply) { - this.siteUser = siteUser; + this.siteUserId = siteUser.getId(); this.gpa = gpa; this.languageTest = languageTest; this.term = term; diff --git a/src/main/java/com/example/solidconnection/application/dto/UniversityApplicantsResponse.java b/src/main/java/com/example/solidconnection/application/dto/UniversityApplicantsResponse.java index 1fe24546f..5a58f0898 100644 --- a/src/main/java/com/example/solidconnection/application/dto/UniversityApplicantsResponse.java +++ b/src/main/java/com/example/solidconnection/application/dto/UniversityApplicantsResponse.java @@ -24,6 +24,6 @@ public static UniversityApplicantsResponse of(UnivApplyInfo univApplyInfo, List< } private static boolean isUsers(Application application, SiteUser siteUser) { - return application.getSiteUser().getId().equals(siteUser.getId()); + return application.getSiteUserId() == siteUser.getId(); } } diff --git a/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java b/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java index 0cbf1cf68..5995d11d1 100644 --- a/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java +++ b/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java @@ -22,7 +22,6 @@ public interface ApplicationRepository extends JpaRepository @Query(""" SELECT a FROM Application a - JOIN FETCH a.siteUser WHERE (a.firstChoiceUnivApplyInfoId IN :universityIds OR a.secondChoiceUnivApplyInfoId IN :universityIds OR a.thirdChoiceUnivApplyInfoId IN :universityIds) @@ -30,19 +29,20 @@ public interface ApplicationRepository extends JpaRepository AND a.term = :term AND a.isDelete = false """) - List findAllByUnivApplyInfoIds(@Param("universityIds") List universityIds, @Param("status") VerifyStatus status, @Param("term") String term); + List findAllByUnivApplyInfoIds( + @Param("universityIds") List universityIds, @Param("status") VerifyStatus status, @Param("term") String term); @Query(""" SELECT a FROM Application a - WHERE a.siteUser = :siteUser + WHERE a.siteUserId = :siteUserId AND a.term = :term AND a.isDelete = false """) - Optional findBySiteUserAndTerm(@Param("siteUser") SiteUser siteUser, @Param("term") String term); + Optional findBySiteUserIdAndTerm(@Param("siteUserId") Long siteUserId, @Param("term") String term); - default Application getApplicationBySiteUserAndTerm(SiteUser siteUser, String term) { - return findBySiteUserAndTerm(siteUser, term) + default Application getApplicationBySiteUserIdAndTerm(Long siteUserId, String term) { + return findBySiteUserIdAndTerm(siteUserId, term) .orElseThrow(() -> new CustomException(APPLICATION_NOT_FOUND)); } } diff --git a/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java b/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java index dbfa28990..62c4ce731 100644 --- a/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java +++ b/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java @@ -56,7 +56,7 @@ public ApplicationsResponse getApplicants(SiteUser siteUser, String regionCode, @Transactional(readOnly = true) public ApplicationsResponse getApplicantsByUserApplications(SiteUser siteUser) { - Application userLatestApplication = applicationRepository.getApplicationBySiteUserAndTerm(siteUser, term); + Application userLatestApplication = applicationRepository.getApplicationBySiteUserIdAndTerm(siteUser.getId(), term); List universityInfoForApplyIds = Stream.of( userLatestApplication.getFirstChoiceUnivApplyInfoId(), @@ -120,7 +120,7 @@ private List createUniversityApplicantsResponses( @Transactional(readOnly = true) public void validateSiteUserCanViewApplicants(SiteUser siteUser) { - VerifyStatus verifyStatus = applicationRepository.getApplicationBySiteUserAndTerm(siteUser, term).getVerifyStatus(); + VerifyStatus verifyStatus = applicationRepository.getApplicationBySiteUserIdAndTerm(siteUser.getId(), term).getVerifyStatus(); if (verifyStatus != VerifyStatus.APPROVED) { throw new CustomException(APPLICATION_NOT_APPROVED); } diff --git a/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java b/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java index ea44840ee..47384e9f4 100644 --- a/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java +++ b/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java @@ -50,7 +50,7 @@ public ApplicationSubmissionResponse apply(SiteUser siteUser, ApplyRequest apply Long secondChoiceUniversityId = universityChoiceRequest.secondChoiceUniversityId(); Long thirdChoiceUniversityId = universityChoiceRequest.thirdChoiceUniversityId(); - Optional existingApplication = applicationRepository.findBySiteUserAndTerm(siteUser, term); + Optional existingApplication = applicationRepository.findBySiteUserIdAndTerm(siteUser.getId(), term); int updateCount = existingApplication .map(application -> { validateUpdateLimitNotExceed(application); @@ -78,7 +78,7 @@ public ApplicationSubmissionResponse apply(SiteUser siteUser, ApplyRequest apply } private GpaScore getValidGpaScore(SiteUser siteUser, Long gpaScoreId) { - GpaScore gpaScore = gpaScoreRepository.findGpaScoreBySiteUserAndId(siteUser, gpaScoreId) + GpaScore gpaScore = gpaScoreRepository.findGpaScoreBySiteUserIdAndId(siteUser.getId(), gpaScoreId) .orElseThrow(() -> new CustomException(GPA_SCORE_NOT_FOUND)); if (gpaScore.getVerifyStatus() != VerifyStatus.APPROVED) { throw new CustomException(INVALID_GPA_SCORE_STATUS); @@ -88,7 +88,7 @@ private GpaScore getValidGpaScore(SiteUser siteUser, Long gpaScoreId) { private LanguageTestScore getValidLanguageTestScore(SiteUser siteUser, Long languageTestScoreId) { LanguageTestScore languageTestScore = languageTestScoreRepository - .findLanguageTestScoreBySiteUserAndId(siteUser, languageTestScoreId) + .findLanguageTestScoreBySiteUserIdAndId(siteUser.getId(), languageTestScoreId) .orElseThrow(() -> new CustomException(INVALID_LANGUAGE_TEST_SCORE)); if (languageTestScore.getVerifyStatus() != VerifyStatus.APPROVED) { throw new CustomException(INVALID_LANGUAGE_TEST_SCORE_STATUS); diff --git a/src/main/java/com/example/solidconnection/location/country/domain/Country.java b/src/main/java/com/example/solidconnection/location/country/domain/Country.java index 5a14fef86..38ea46f71 100644 --- a/src/main/java/com/example/solidconnection/location/country/domain/Country.java +++ b/src/main/java/com/example/solidconnection/location/country/domain/Country.java @@ -23,12 +23,12 @@ public class Country { @Column(nullable = false, length = 100) private String koreanName; - @ManyToOne - private Region region; + @Column(name="region_code") + private String regionCode; - public Country(String code, String koreanName, Region region) { + public Country(String code, String koreanName, String regionCode) { this.code = code; this.koreanName = koreanName; - this.region = region; + this.regionCode = regionCode; } } diff --git a/src/main/java/com/example/solidconnection/location/country/domain/InterestedCountry.java b/src/main/java/com/example/solidconnection/location/country/domain/InterestedCountry.java index edc68ba79..d7bde3d08 100644 --- a/src/main/java/com/example/solidconnection/location/country/domain/InterestedCountry.java +++ b/src/main/java/com/example/solidconnection/location/country/domain/InterestedCountry.java @@ -1,13 +1,7 @@ package com.example.solidconnection.location.country.domain; import com.example.solidconnection.siteuser.domain.SiteUser; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import jakarta.persistence.UniqueConstraint; +import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -27,14 +21,14 @@ public class InterestedCountry { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne - private SiteUser siteUser; + @Column(name="site_user_id") + private long siteUserId; - @ManyToOne - private Country country; + @Column(name="country_code") + private String countryCode; public InterestedCountry(SiteUser siteUser, Country country) { - this.siteUser = siteUser; - this.country = country; + this.siteUserId = siteUser.getId(); + this.countryCode = country.getCode(); } } diff --git a/src/main/java/com/example/solidconnection/location/country/repository/InterestedCountryRepository.java b/src/main/java/com/example/solidconnection/location/country/repository/InterestedCountryRepository.java index 2eacc2ca9..18449e32a 100644 --- a/src/main/java/com/example/solidconnection/location/country/repository/InterestedCountryRepository.java +++ b/src/main/java/com/example/solidconnection/location/country/repository/InterestedCountryRepository.java @@ -9,5 +9,5 @@ @Repository public interface InterestedCountryRepository extends JpaRepository { - List findAllBySiteUser(SiteUser siteUser); + List findAllBySiteUserId(long siteUserId); } diff --git a/src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java b/src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java index 35214a95c..3800bffed 100644 --- a/src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java +++ b/src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java @@ -1,13 +1,7 @@ package com.example.solidconnection.location.region.domain; import com.example.solidconnection.siteuser.domain.SiteUser; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import jakarta.persistence.UniqueConstraint; +import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -27,14 +21,14 @@ public class InterestedRegion { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne - private SiteUser siteUser; + @Column(name="site_user_id") + private long siteUserId; - @ManyToOne - private Region region; + @Column(name="region_code") + private String regionCode; public InterestedRegion(SiteUser siteUser, Region region) { - this.siteUser = siteUser; - this.region = region; + this.siteUserId = siteUser.getId(); + this.regionCode = region.getCode(); } } diff --git a/src/main/java/com/example/solidconnection/location/region/repository/InterestedRegionRepository.java b/src/main/java/com/example/solidconnection/location/region/repository/InterestedRegionRepository.java index 90d860b3c..cc0177c9b 100644 --- a/src/main/java/com/example/solidconnection/location/region/repository/InterestedRegionRepository.java +++ b/src/main/java/com/example/solidconnection/location/region/repository/InterestedRegionRepository.java @@ -9,5 +9,5 @@ @Repository public interface InterestedRegionRepository extends JpaRepository { - List findAllBySiteUser(SiteUser siteUser); + List findAllBySiteUserId(long siteUserId); } diff --git a/src/main/java/com/example/solidconnection/score/domain/GpaScore.java b/src/main/java/com/example/solidconnection/score/domain/GpaScore.java index 0156dae9a..ed45eff3b 100644 --- a/src/main/java/com/example/solidconnection/score/domain/GpaScore.java +++ b/src/main/java/com/example/solidconnection/score/domain/GpaScore.java @@ -38,24 +38,15 @@ public class GpaScore extends BaseEntity { private String rejectedReason; - @ManyToOne - private SiteUser siteUser; + private long siteUserId; public GpaScore(Gpa gpa, SiteUser siteUser) { this.gpa = gpa; - this.siteUser = siteUser; + this.siteUserId = siteUser.getId(); this.verifyStatus = VerifyStatus.PENDING; this.rejectedReason = null; } - public void setSiteUser(SiteUser siteUser) { - if (this.siteUser != null) { - this.siteUser.getGpaScoreList().remove(this); - } - this.siteUser = siteUser; - siteUser.getGpaScoreList().add(this); - } - public void updateGpaScore(Gpa gpa, VerifyStatus verifyStatus, String rejectedReason) { this.gpa = gpa; this.verifyStatus = verifyStatus; diff --git a/src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java b/src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java index f2257561d..00d181399 100644 --- a/src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java +++ b/src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java @@ -38,21 +38,12 @@ public class LanguageTestScore extends BaseEntity { private String rejectedReason; - @ManyToOne - private SiteUser siteUser; + private long siteUserId; public LanguageTestScore(LanguageTest languageTest, SiteUser siteUser) { this.languageTest = languageTest; this.verifyStatus = VerifyStatus.PENDING; - this.siteUser = siteUser; - } - - public void setSiteUser(SiteUser siteUser) { - if (this.siteUser != null) { - this.siteUser.getLanguageTestScoreList().remove(this); - } - this.siteUser = siteUser; - siteUser.getLanguageTestScoreList().add(this); + this.siteUserId = siteUser.getId(); } public void updateLanguageTestScore(LanguageTest languageTest, VerifyStatus verifyStatus, String rejectedReason) { diff --git a/src/main/java/com/example/solidconnection/score/repository/GpaScoreRepository.java b/src/main/java/com/example/solidconnection/score/repository/GpaScoreRepository.java index 5610c8de3..7a916d64c 100644 --- a/src/main/java/com/example/solidconnection/score/repository/GpaScoreRepository.java +++ b/src/main/java/com/example/solidconnection/score/repository/GpaScoreRepository.java @@ -6,12 +6,14 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository public interface GpaScoreRepository extends JpaRepository, GpaScoreFilterRepository { - Optional findGpaScoreBySiteUser(SiteUser siteUser); + Optional findGpaScoreBySiteUserId(long siteUserId); - Optional findGpaScoreBySiteUserAndId(SiteUser siteUser, Long id); + Optional findGpaScoreBySiteUserIdAndId(long siteUser, Long id); + List findBySiteUserId(Long siteUserId); } diff --git a/src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java b/src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java index 1934a0612..0c5d44180 100644 --- a/src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java +++ b/src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java @@ -7,12 +7,14 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository public interface LanguageTestScoreRepository extends JpaRepository, LanguageTestScoreFilterRepository { - Optional findLanguageTestScoreBySiteUserAndLanguageTest_LanguageTestType(SiteUser siteUser, LanguageTestType languageTestType); + Optional findLanguageTestScoreBySiteUserIdAndLanguageTest_LanguageTestType(long siteUserId, LanguageTestType languageTestType); - Optional findLanguageTestScoreBySiteUserAndId(SiteUser siteUser, Long id); + Optional findLanguageTestScoreBySiteUserIdAndId(long siteUser, Long id); + List findBySiteUserId(Long siteUserId); } diff --git a/src/main/java/com/example/solidconnection/score/repository/custom/GpaScoreFilterRepositoryImpl.java b/src/main/java/com/example/solidconnection/score/repository/custom/GpaScoreFilterRepositoryImpl.java index a90961c3d..12aa626f5 100644 --- a/src/main/java/com/example/solidconnection/score/repository/custom/GpaScoreFilterRepositoryImpl.java +++ b/src/main/java/com/example/solidconnection/score/repository/custom/GpaScoreFilterRepositoryImpl.java @@ -70,7 +70,7 @@ public Page searchGpaScores(ScoreSearchCondition conditi List content = queryFactory .select(GPA_SCORE_SEARCH_RESPONSE_PROJECTION) .from(gpaScore) - .join(gpaScore.siteUser, siteUser) + .join(siteUser).on(gpaScore.siteUserId.eq(siteUser.id)) .where( verifyStatusEq(condition.verifyStatus()), nicknameContains(condition.nickname()), @@ -84,7 +84,7 @@ public Page searchGpaScores(ScoreSearchCondition conditi Long totalCount = queryFactory .select(gpaScore.count()) .from(gpaScore) - .join(gpaScore.siteUser, siteUser) + .join(siteUser).on(gpaScore.siteUserId.eq(siteUser.id)) .where( verifyStatusEq(condition.verifyStatus()), nicknameContains(condition.nickname()), diff --git a/src/main/java/com/example/solidconnection/score/repository/custom/LanguageTestScoreFilterRepositoryImpl.java b/src/main/java/com/example/solidconnection/score/repository/custom/LanguageTestScoreFilterRepositoryImpl.java index 28baaf521..555f7923c 100644 --- a/src/main/java/com/example/solidconnection/score/repository/custom/LanguageTestScoreFilterRepositoryImpl.java +++ b/src/main/java/com/example/solidconnection/score/repository/custom/LanguageTestScoreFilterRepositoryImpl.java @@ -70,7 +70,7 @@ public Page searchLanguageTestScores(ScoreSearc List content = queryFactory .select(LANGUAGE_TEST_SCORE_SEARCH_RESPONSE_PROJECTION) .from(languageTestScore) - .join(languageTestScore.siteUser, siteUser) + .join(siteUser).on(languageTestScore.siteUserId.eq(siteUser.id)) .where( verifyStatusEq(condition.verifyStatus()), nicknameContains(condition.nickname()), @@ -84,7 +84,7 @@ public Page searchLanguageTestScores(ScoreSearc Long totalCount = queryFactory .select(languageTestScore.count()) .from(languageTestScore) - .join(languageTestScore.siteUser, siteUser) + .join(siteUser).on(languageTestScore.siteUserId.eq(siteUser.id)) .where( verifyStatusEq(condition.verifyStatus()), nicknameContains(condition.nickname()), 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 5a6cf9801..a11756e6a 100644 --- a/src/main/java/com/example/solidconnection/score/service/ScoreService.java +++ b/src/main/java/com/example/solidconnection/score/service/ScoreService.java @@ -43,17 +43,10 @@ public class ScoreService { public Long submitGpaScore(SiteUser siteUser, GpaScoreRequest gpaScoreRequest, MultipartFile file) { UploadedFileUrlResponse uploadedFile = s3Service.uploadFile(file, ImgType.GPA); Gpa gpa = new Gpa(gpaScoreRequest.gpa(), gpaScoreRequest.gpaCriteria(), uploadedFile.fileUrl()); - - /* - * todo: siteUser를 영속 상태로 만들 수 있도록 컨트롤러에서 siteUserId 를 넘겨줄 것인지, - * siteUser 에 gpaScoreList 를 FetchType.EAGER 로 설정할 것인지, - * gpa 와 siteUser 사이의 양방향을 끊을 것인지 생각해봐야한다. - */ SiteUser siteUser1 = siteUserRepository.findById(siteUser.getId()).orElseThrow(() -> new CustomException(USER_NOT_FOUND)); GpaScore newGpaScore = new GpaScore(gpa, siteUser1); - newGpaScore.setSiteUser(siteUser1); - GpaScore savedNewGpaScore = gpaScoreRepository.save(newGpaScore); // 저장 후 반환된 객체 - return savedNewGpaScore.getId(); // 저장된 GPA Score의 ID 반환 + GpaScore savedNewGpaScore = gpaScoreRepository.save(newGpaScore); + return savedNewGpaScore.getId(); } @Transactional @@ -61,42 +54,31 @@ public Long submitLanguageTestScore(SiteUser siteUser, LanguageTestScoreRequest UploadedFileUrlResponse uploadedFile = s3Service.uploadFile(file, ImgType.LANGUAGE_TEST); LanguageTest languageTest = new LanguageTest(languageTestScoreRequest.languageTestType(), languageTestScoreRequest.languageTestScore(), uploadedFile.fileUrl()); - - /* - * todo: siteUser를 영속 상태로 만들 수 있도록 컨트롤러에서 siteUserId 를 넘겨줄 것인지, - * siteUser 에 languageTestScoreList 를 FetchType.EAGER 로 설정할 것인지, - * languageTest 와 siteUser 사이의 양방향을 끊을 것인지 생각해봐야한다. - */ - SiteUser siteUser1 = siteUserRepository.findById(siteUser.getId()).orElseThrow(() -> new CustomException(USER_NOT_FOUND)); - LanguageTestScore newScore = new LanguageTestScore(languageTest, siteUser1); - newScore.setSiteUser(siteUser1); - LanguageTestScore savedNewScore = languageTestScoreRepository.save(newScore); // 새로 저장한 객체 - return savedNewScore.getId(); // 저장된 객체의 ID 반환 + LanguageTestScore newScore = new LanguageTestScore(languageTest, siteUser); + LanguageTestScore savedNewScore = languageTestScoreRepository.save(newScore); + return savedNewScore.getId(); } @Transactional(readOnly = true) public GpaScoreStatusesResponse getGpaScoreStatus(SiteUser siteUser) { - // todo: ditto - SiteUser siteUser1 = siteUserRepository.findById(siteUser.getId()).orElseThrow(() -> new CustomException(USER_NOT_FOUND)); List gpaScoreStatusResponseList = - Optional.ofNullable(siteUser1.getGpaScoreList()) - .map(scores -> scores.stream() - .map(GpaScoreStatusResponse::from) - .collect(Collectors.toList())) - .orElse(Collections.emptyList()); + gpaScoreRepository.findBySiteUserId(siteUser.getId()) + .stream() + .map(GpaScoreStatusResponse::from) + .collect(Collectors.toList()); + return GpaScoreStatusesResponse.from(gpaScoreStatusResponseList); } @Transactional(readOnly = true) public LanguageTestScoreStatusesResponse getLanguageTestScoreStatus(SiteUser siteUser) { - // todo: ditto - SiteUser siteUser1 = siteUserRepository.findById(siteUser.getId()).orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + List languageTestScores = languageTestScoreRepository.findBySiteUserId(siteUser.getId()); + List languageTestScoreStatusResponseList = - Optional.ofNullable(siteUser1.getLanguageTestScoreList()) - .map(scores -> scores.stream() - .map(LanguageTestScoreStatusResponse::from) - .collect(Collectors.toList())) - .orElse(Collections.emptyList()); + languageTestScores.stream() + .map(LanguageTestScoreStatusResponse::from) + .collect(Collectors.toList()); + return LanguageTestScoreStatusesResponse.from(languageTestScoreStatusResponseList); } } diff --git a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java index 98c18b56a..479e628ed 100644 --- a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java +++ b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java @@ -88,12 +88,6 @@ public class SiteUser { @OneToMany(mappedBy = "siteUser", cascade = CascadeType.ALL, orphanRemoval = true) private List postLikeList = new ArrayList<>(); - @OneToMany(mappedBy = "siteUser", cascade = CascadeType.ALL, orphanRemoval = true) - private List languageTestScoreList = new ArrayList<>(); - - @OneToMany(mappedBy = "siteUser", cascade = CascadeType.ALL, orphanRemoval = true) - private List gpaScoreList = new ArrayList<>(); - public SiteUser( String email, String nickname, diff --git a/src/main/java/com/example/solidconnection/siteuser/repository/LikedUniversityRepository.java b/src/main/java/com/example/solidconnection/siteuser/repository/LikedUniversityRepository.java index f0d328c0a..13ed63a65 100644 --- a/src/main/java/com/example/solidconnection/siteuser/repository/LikedUniversityRepository.java +++ b/src/main/java/com/example/solidconnection/siteuser/repository/LikedUniversityRepository.java @@ -4,15 +4,26 @@ import com.example.solidconnection.university.domain.LikedUniversity; import com.example.solidconnection.university.domain.UnivApplyInfo; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; import java.util.Optional; public interface LikedUniversityRepository extends JpaRepository { - List findAllBySiteUser_Id(long siteUserId); + List findAllBySiteUserId(long siteUserId); - int countBySiteUser_Id(long siteUserId); + int countBySiteUserId(long siteUserId); - Optional findBySiteUserAndUnivApplyInfo(SiteUser siteUser, UnivApplyInfo univApplyInfo); + Optional findBySiteUserIdAndUnivApplyInfoId(long siteUserId, long univApplyInfoId); + @Query(""" + SELECT u + FROM UnivApplyInfo u + JOIN LikedUniversity l ON u.id = l.univApplyInfoId + WHERE l.siteUserId = :siteUserId + """) + List findUnivApplyInfosBySiteUserId(@Param("siteUserId") Long siteUserId); + + boolean existsBySiteUserIdAndUnivApplyInfoId(Long siteUserId, Long univApplyInfoId); } 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 7e22fd4bf..568610afc 100644 --- a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java +++ b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java @@ -9,6 +9,7 @@ import com.example.solidconnection.siteuser.repository.LikedUniversityRepository; import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.university.domain.LikedUniversity; +import com.example.solidconnection.university.domain.UnivApplyInfo; import com.example.solidconnection.university.dto.UniversityInfoForApplyPreviewResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -39,7 +40,7 @@ public class MyPageService { * */ @Transactional(readOnly = true) public MyPageResponse getMyPageInfo(SiteUser siteUser) { - int likedUniversityCount = likedUniversityRepository.countBySiteUser_Id(siteUser.getId()); + int likedUniversityCount = likedUniversityRepository.countBySiteUserId(siteUser.getId()); return MyPageResponse.of(siteUser, likedUniversityCount); } @@ -95,9 +96,10 @@ private boolean isDefaultProfileImage(String profileImageUrl) { * */ @Transactional(readOnly = true) public List getWishUniversity(SiteUser siteUser) { - List likedUniversities = likedUniversityRepository.findAllBySiteUser_Id(siteUser.getId()); - return likedUniversities.stream() - .map(likedUniversity -> UniversityInfoForApplyPreviewResponse.from(likedUniversity.getUnivApplyInfo())) + List univApplyInfos = likedUniversityRepository.findUnivApplyInfosBySiteUserId(siteUser.getId()); + + return univApplyInfos.stream() + .map(UniversityInfoForApplyPreviewResponse::from) .toList(); } } diff --git a/src/main/java/com/example/solidconnection/university/domain/LikedUniversity.java b/src/main/java/com/example/solidconnection/university/domain/LikedUniversity.java index 036346d5a..2c10a5444 100644 --- a/src/main/java/com/example/solidconnection/university/domain/LikedUniversity.java +++ b/src/main/java/com/example/solidconnection/university/domain/LikedUniversity.java @@ -1,14 +1,7 @@ package com.example.solidconnection.university.domain; import com.example.solidconnection.siteuser.domain.SiteUser; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import jakarta.persistence.UniqueConstraint; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -31,10 +24,9 @@ public class LikedUniversity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne - @JoinColumn(name = "university_info_for_apply_id") - private UnivApplyInfo univApplyInfo; + @Column(name="university_info_for_apply_id") + private long univApplyInfoId; - @ManyToOne - private SiteUser siteUser; + @Column(name="site_user_id") + private long siteUserId; } diff --git a/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java b/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java index 47edd15c8..a2511e1ec 100644 --- a/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java +++ b/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java @@ -11,6 +11,7 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; +import jakarta.persistence.CascadeType; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; @@ -76,13 +77,15 @@ public class UnivApplyInfo { @Column(length = 1000) private String details; - @OneToMany(mappedBy = "univApplyInfo", fetch = FetchType.EAGER) + @OneToMany(mappedBy = "univApplyInfo", cascade = CascadeType.ALL, orphanRemoval = true) private Set languageRequirements = new HashSet<>(); - @ManyToOne(fetch = FetchType.EAGER) + @ManyToOne(fetch = FetchType.LAZY) private University university; public void addLanguageRequirements(LanguageRequirement languageRequirements) { this.languageRequirements.add(languageRequirements); } + + } diff --git a/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java b/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java index 1ef541334..a8315171c 100644 --- a/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java +++ b/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java @@ -30,24 +30,22 @@ public interface UniversityInfoForApplyRepository extends JpaRepository findByUniversitiesAndTerm(@Param("universities") List universities, @Param("term") String term); @Query(""" - SELECT uifa - FROM UnivApplyInfo uifa - JOIN University u ON uifa.university = u - WHERE (u.country.code IN ( - SELECT c.code - FROM InterestedCountry ic - JOIN ic.country c - WHERE ic.siteUser = :siteUser - ) - OR u.region.code IN ( - SELECT r.code - FROM InterestedRegion ir - JOIN ir.region r - WHERE ir.siteUser = :siteUser - )) - AND uifa.term = :term - """) - List findUniversityInfoForAppliesBySiteUsersInterestedCountryOrRegionAndTerm(@Param("siteUser") SiteUser siteUser, @Param("term") String term); + SELECT uifa + FROM UnivApplyInfo uifa + JOIN University u ON uifa.university = u + WHERE (u.country IN ( + SELECT ic.countryCode + FROM InterestedCountry ic + WHERE ic.siteUserId = :siteUserId + ) + OR u.region IN ( + SELECT ir.regionCode + FROM InterestedRegion ir + WHERE ir.siteUserId = :siteUserId + )) + AND uifa.term = :term + """) + List findUniversityInfoForAppliesBySiteUsersInterestedCountryOrRegionAndTerm(@Param("siteUserId") Long siteUserId, @Param("term") String term); @Query(value = """ SELECT * diff --git a/src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java b/src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java index ee8416b9c..414ea242a 100644 --- a/src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java +++ b/src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java @@ -32,17 +32,15 @@ public List findByRegionCodeAndKeywords(String regionCode, List findByRegionCodeAndKeywords(String regionCode, List keywords) { @@ -86,7 +81,7 @@ public List findByRegionCodeAndKeywordsAndLanguageTestTypeAndTest .join(univApplyInfo.university, university) .join(university.country, country) .join(university.region, region) - .where(regionCodeEq(region, regionCode) + .where(regionCodeEq(country, regionCode) .and(countryOrUniversityContainsKeyword(country, university, keywords)) .and(univApplyInfo.term.eq(term))) .fetch(); diff --git a/src/main/java/com/example/solidconnection/university/service/UniversityLikeService.java b/src/main/java/com/example/solidconnection/university/service/UniversityLikeService.java index 7544ed7a8..b567c01b3 100644 --- a/src/main/java/com/example/solidconnection/university/service/UniversityLikeService.java +++ b/src/main/java/com/example/solidconnection/university/service/UniversityLikeService.java @@ -17,6 +17,7 @@ import static com.example.solidconnection.common.exception.ErrorCode.ALREADY_LIKED_UNIVERSITY; import static com.example.solidconnection.common.exception.ErrorCode.NOT_LIKED_UNIVERSITY; +import static com.example.solidconnection.common.exception.ErrorCode.UNIVERSITY_INFO_FOR_APPLY_NOT_FOUND; @RequiredArgsConstructor @Service @@ -36,21 +37,24 @@ public class UniversityLikeService { * */ @Transactional public LikeResultResponse likeUniversity(SiteUser siteUser, Long universityInfoForApplyId) { - UnivApplyInfo univApplyInfo = universityInfoForApplyRepository.getUniversityInfoForApplyById(universityInfoForApplyId); - - Optional optionalLikedUniversity = likedUniversityRepository.findBySiteUserAndUnivApplyInfo(siteUser, univApplyInfo); - if (optionalLikedUniversity.isPresent()) { + if (likedUniversityRepository.existsBySiteUserIdAndUnivApplyInfoId(siteUser.getId(), universityInfoForApplyId)) { throw new CustomException(ALREADY_LIKED_UNIVERSITY); } + if (!universityInfoForApplyRepository.existsById(universityInfoForApplyId)) { + throw new CustomException(UNIVERSITY_INFO_FOR_APPLY_NOT_FOUND); + } + LikedUniversity likedUniversity = LikedUniversity.builder() - .univApplyInfo(univApplyInfo) - .siteUser(siteUser) + .univApplyInfoId(universityInfoForApplyId) + .siteUserId(siteUser.getId()) .build(); + likedUniversityRepository.save(likedUniversity); return new LikeResultResponse(LIKE_SUCCESS_MESSAGE); } + /* * 대학교 '좋아요'를 취소한다. * */ @@ -58,7 +62,7 @@ public LikeResultResponse likeUniversity(SiteUser siteUser, Long universityInfoF public LikeResultResponse cancelLikeUniversity(SiteUser siteUser, long universityInfoForApplyId) throws CustomException { UnivApplyInfo univApplyInfo = universityInfoForApplyRepository.getUniversityInfoForApplyById(universityInfoForApplyId); - Optional optionalLikedUniversity = likedUniversityRepository.findBySiteUserAndUnivApplyInfo(siteUser, univApplyInfo); + Optional optionalLikedUniversity = likedUniversityRepository.findBySiteUserIdAndUnivApplyInfoId(siteUser.getId(), univApplyInfo.getId()); if (optionalLikedUniversity.isEmpty()) { throw new CustomException(NOT_LIKED_UNIVERSITY); } @@ -73,7 +77,7 @@ public LikeResultResponse cancelLikeUniversity(SiteUser siteUser, long universit @Transactional(readOnly = true) public IsLikeResponse getIsLiked(SiteUser siteUser, Long universityInfoForApplyId) { UnivApplyInfo univApplyInfo = universityInfoForApplyRepository.getUniversityInfoForApplyById(universityInfoForApplyId); - boolean isLike = likedUniversityRepository.findBySiteUserAndUnivApplyInfo(siteUser, univApplyInfo).isPresent(); + boolean isLike = likedUniversityRepository.findBySiteUserIdAndUnivApplyInfoId(siteUser.getId(), univApplyInfo.getId()).isPresent(); return new IsLikeResponse(isLike); } } diff --git a/src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java b/src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java index 94447316d..4c6261fd3 100644 --- a/src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java +++ b/src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java @@ -37,7 +37,7 @@ public class UniversityRecommendService { public UniversityRecommendsResponse getPersonalRecommends(SiteUser siteUser) { // 맞춤 추천 대학교를 불러온다. List personalRecommends = universityInfoForApplyRepository - .findUniversityInfoForAppliesBySiteUsersInterestedCountryOrRegionAndTerm(siteUser, term); + .findUniversityInfoForAppliesBySiteUsersInterestedCountryOrRegionAndTerm(siteUser.getId(), term); List trimmedRecommendUniversities = personalRecommends.subList(0, Math.min(RECOMMEND_UNIVERSITY_NUM, personalRecommends.size())); Collections.shuffle(trimmedRecommendUniversities); diff --git a/src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java b/src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java index 4d23073f7..b1716e023 100644 --- a/src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java +++ b/src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java @@ -84,7 +84,7 @@ void setUp() { ApplicationSubmissionResponse response = applicationSubmissionService.apply(user, request); // then - Application savedApplication = applicationRepository.findBySiteUserAndTerm(user, term).orElseThrow(); + Application savedApplication = applicationRepository.findBySiteUserIdAndTerm(user.getId(), term).orElseThrow(); assertAll( () -> assertThat(response.applyCount()) .isEqualTo(savedApplication.getUpdateCount()), diff --git a/src/test/java/com/example/solidconnection/location/country/fixture/CountryFixtureBuilder.java b/src/test/java/com/example/solidconnection/location/country/fixture/CountryFixtureBuilder.java index 85fdb466f..2f6ce7011 100644 --- a/src/test/java/com/example/solidconnection/location/country/fixture/CountryFixtureBuilder.java +++ b/src/test/java/com/example/solidconnection/location/country/fixture/CountryFixtureBuilder.java @@ -37,6 +37,6 @@ public CountryFixtureBuilder region(Region region) { public Country findOrCreate() { return countryRepositoryForTest.findByCode(code) - .orElseGet(() -> countryRepositoryForTest.save(new Country(code, koreanName, region))); + .orElseGet(() -> countryRepositoryForTest.save(new Country(code, koreanName, region.getCode()))); } } diff --git a/src/test/java/com/example/solidconnection/score/fixture/GpaScoreFixtureBuilder.java b/src/test/java/com/example/solidconnection/score/fixture/GpaScoreFixtureBuilder.java index 7943008b4..a5a18e006 100644 --- a/src/test/java/com/example/solidconnection/score/fixture/GpaScoreFixtureBuilder.java +++ b/src/test/java/com/example/solidconnection/score/fixture/GpaScoreFixtureBuilder.java @@ -39,7 +39,6 @@ public GpaScoreFixtureBuilder siteUser(SiteUser siteUser) { public GpaScore create() { GpaScore gpaScore = new GpaScore(gpa, siteUser); - gpaScore.setSiteUser(siteUser); gpaScore.setVerifyStatus(verifyStatus); return gpaScoreRepository.save(gpaScore); } diff --git a/src/test/java/com/example/solidconnection/score/fixture/LanguageTestScoreFixtureBuilder.java b/src/test/java/com/example/solidconnection/score/fixture/LanguageTestScoreFixtureBuilder.java index fd5a8d417..00e9d577e 100644 --- a/src/test/java/com/example/solidconnection/score/fixture/LanguageTestScoreFixtureBuilder.java +++ b/src/test/java/com/example/solidconnection/score/fixture/LanguageTestScoreFixtureBuilder.java @@ -39,7 +39,6 @@ public LanguageTestScoreFixtureBuilder siteUser(SiteUser siteUser) { public LanguageTestScore create() { LanguageTestScore languageTestScore = new LanguageTestScore(languageTest, siteUser); - languageTestScore.setSiteUser(siteUser); languageTestScore.setVerifyStatus(verifyStatus); return languageTestScoreRepository.save(languageTestScore); } diff --git a/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java b/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java index 59e0d6455..59737718a 100644 --- a/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java +++ b/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java @@ -193,14 +193,14 @@ void setUp() { } private int createLikedUniversities(SiteUser testUser) { - LikedUniversity likedUniversity1 = new LikedUniversity(null, univApplyInfoFixture.괌대학_A_지원_정보(), testUser); - LikedUniversity likedUniversity2 = new LikedUniversity(null, univApplyInfoFixture.메이지대학_지원_정보(), testUser); - LikedUniversity likedUniversity3 = new LikedUniversity(null, univApplyInfoFixture.코펜하겐IT대학_지원_정보(), testUser); + LikedUniversity likedUniversity1 = new LikedUniversity(null, univApplyInfoFixture.괌대학_A_지원_정보().getId(), testUser.getId()); + LikedUniversity likedUniversity2 = new LikedUniversity(null, univApplyInfoFixture.메이지대학_지원_정보().getId(), testUser.getId()); + LikedUniversity likedUniversity3 = new LikedUniversity(null, univApplyInfoFixture.코펜하겐IT대학_지원_정보().getId(), testUser.getId()); likedUniversityRepository.save(likedUniversity1); likedUniversityRepository.save(likedUniversity2); likedUniversityRepository.save(likedUniversity3); - return likedUniversityRepository.countBySiteUser_Id(testUser.getId()); + return likedUniversityRepository.countBySiteUserId(testUser.getId()); } private MockMultipartFile createValidImageFile() { diff --git a/src/test/java/com/example/solidconnection/university/repository/UniversityLikeRepositoryTest.java b/src/test/java/com/example/solidconnection/university/repository/UniversityLikeRepositoryTest.java index 1d34597be..9db7831fe 100644 --- a/src/test/java/com/example/solidconnection/university/repository/UniversityLikeRepositoryTest.java +++ b/src/test/java/com/example/solidconnection/university/repository/UniversityLikeRepositoryTest.java @@ -82,8 +82,8 @@ class 사용자와_좋아요한_대학은_복합_유니크_제약조건을_갖 private LikedUniversity createLikedUniversity(SiteUser siteUser, UnivApplyInfo univApplyInfo) { return LikedUniversity.builder() - .siteUser(siteUser) - .univApplyInfo(univApplyInfo) + .siteUserId(siteUser.getId()) + .univApplyInfoId(univApplyInfo.getId()) .build(); } } diff --git a/src/test/java/com/example/solidconnection/university/service/UniversityLikeServiceTest.java b/src/test/java/com/example/solidconnection/university/service/UniversityLikeServiceTest.java index 729c74c3b..d0b07e37c 100644 --- a/src/test/java/com/example/solidconnection/university/service/UniversityLikeServiceTest.java +++ b/src/test/java/com/example/solidconnection/university/service/UniversityLikeServiceTest.java @@ -61,8 +61,8 @@ class 대학_좋아요를_등록한다 { // then assertAll( () -> assertThat(response.result()).isEqualTo(LIKE_SUCCESS_MESSAGE), - () -> assertThat(likedUniversityRepository.findBySiteUserAndUnivApplyInfo( - user, 괌대학_A_지원_정보 + () -> assertThat(likedUniversityRepository.findBySiteUserIdAndUnivApplyInfoId( + user.getId(), 괌대학_A_지원_정보.getId() )).isPresent() ); } @@ -93,8 +93,8 @@ class 대학_좋아요를_취소한다 { // then assertAll( () -> assertThat(response.result()).isEqualTo(LIKE_CANCELED_MESSAGE), - () -> assertThat(likedUniversityRepository.findBySiteUserAndUnivApplyInfo( - user, 괌대학_A_지원_정보 + () -> assertThat(likedUniversityRepository.findBySiteUserIdAndUnivApplyInfoId( + user.getId(), 괌대학_A_지원_정보.getId() )).isEmpty() ); } @@ -153,8 +153,8 @@ class 대학_좋아요를_취소한다 { private void saveLikedUniversity(SiteUser siteUser, UnivApplyInfo univApplyInfo) { LikedUniversity likedUniversity = LikedUniversity.builder() - .siteUser(siteUser) - .univApplyInfo(univApplyInfo) + .siteUserId(siteUser.getId()) + .univApplyInfoId(univApplyInfo.getId()) .build(); likedUniversityRepository.save(likedUniversity); } From df1014944510fbaf08f4bd169c34bf7278e65d7b Mon Sep 17 00:00:00 2001 From: Yeonri Date: Tue, 1 Jul 2025 19:57:16 +0900 Subject: [PATCH 02/11] =?UTF-8?q?fix:=20application,=20university=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95=20-=20=EC=97=B0=EA=B4=80?= =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EB=B3=80=EA=B2=BD=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=A5=B8=20transaction=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=20-=20=EC=BF=BC=EB=A6=AC=20=EC=9D=BC=EB=B6=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9D=BC=EB=B6=80=20=EC=88=98=EC=A0=95=20-=20Gener?= =?UTF-8?q?alUniversityRecommendService=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UniversityInfoForApplyRepository.java | 28 ++++++++++--------- .../UniversityFilterRepositoryImpl.java | 5 +++- .../GeneralUniversityRecommendService.java | 28 +++++++++++-------- ...GeneralUniversityRecommendServiceTest.java | 1 - .../UniversityRecommendServiceTest.java | 20 +++++-------- 5 files changed, 42 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java b/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java index a8315171c..961d78735 100644 --- a/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java +++ b/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java @@ -4,6 +4,7 @@ import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.university.domain.UnivApplyInfo; import com.example.solidconnection.university.domain.University; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -30,32 +31,33 @@ public interface UniversityInfoForApplyRepository extends JpaRepository findByUniversitiesAndTerm(@Param("universities") List universities, @Param("term") String term); @Query(""" - SELECT uifa + SELECT DISTINCT uifa FROM UnivApplyInfo uifa - JOIN University u ON uifa.university = u - WHERE (u.country IN ( + LEFT JOIN FETCH uifa.languageRequirements lr + JOIN FETCH uifa.university u + LEFT JOIN FETCH u.country c + LEFT JOIN FETCH u.region r + WHERE (c.code IN ( SELECT ic.countryCode FROM InterestedCountry ic WHERE ic.siteUserId = :siteUserId ) - OR u.region IN ( + OR r.code IN ( SELECT ir.regionCode FROM InterestedRegion ir WHERE ir.siteUserId = :siteUserId )) AND uifa.term = :term - """) + """) List findUniversityInfoForAppliesBySiteUsersInterestedCountryOrRegionAndTerm(@Param("siteUserId") Long siteUserId, @Param("term") String term); - @Query(value = """ - SELECT * - FROM university_info_for_apply - WHERE term = :term - ORDER BY RAND() - LIMIT :limitNum - """, nativeQuery = true) + SELECT u.* + FROM university_info_for_apply u + WHERE u.term = :term + ORDER BY RAND() + LIMIT :limitNum + """, nativeQuery = true) List findRandomByTerm(@Param("term") String term, @Param("limitNum") int limitNum); - default UnivApplyInfo getUniversityInfoForApplyById(Long id) { return findById(id) .orElseThrow(() -> new CustomException(UNIVERSITY_INFO_FOR_APPLY_NOT_FOUND)); diff --git a/src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java b/src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java index 414ea242a..a330f5f8b 100644 --- a/src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java +++ b/src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java @@ -49,7 +49,10 @@ public List findByRegionCodeAndKeywords(String regionCode, List keywords) { diff --git a/src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java b/src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java index af2921c9a..6b1a3676e 100644 --- a/src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java +++ b/src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java @@ -2,12 +2,11 @@ import com.example.solidconnection.university.domain.UnivApplyInfo; import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository; -import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.hibernate.Hibernate; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -17,19 +16,24 @@ @RequiredArgsConstructor public class GeneralUniversityRecommendService { - /* - * 해당 시기에 열리는 대학교들 중 랜덤으로 선택해서 목록을 구성한다. - * */ private final UniversityInfoForApplyRepository universityInfoForApplyRepository; - @Getter - private List recommendUniversities; - @Value("${university.term}") public String term; - @EventListener(ApplicationReadyEvent.class) - public void init() { - recommendUniversities = universityInfoForApplyRepository.findRandomByTerm(term, RECOMMEND_UNIVERSITY_NUM); + @Transactional(readOnly = true) // 트랜잭션 추가 + public List getRecommendUniversities() { + List universities = universityInfoForApplyRepository.findRandomByTerm(term, RECOMMEND_UNIVERSITY_NUM); + + universities.forEach(univ -> { + Hibernate.initialize(univ.getLanguageRequirements()); + Hibernate.initialize(univ.getUniversity()); + if (univ.getUniversity() != null) { + Hibernate.initialize(univ.getUniversity().getCountry()); + Hibernate.initialize(univ.getUniversity().getRegion()); + } + }); + + return universities; } } diff --git a/src/test/java/com/example/solidconnection/university/service/GeneralUniversityRecommendServiceTest.java b/src/test/java/com/example/solidconnection/university/service/GeneralUniversityRecommendServiceTest.java index 5152dfbb2..9b383e295 100644 --- a/src/test/java/com/example/solidconnection/university/service/GeneralUniversityRecommendServiceTest.java +++ b/src/test/java/com/example/solidconnection/university/service/GeneralUniversityRecommendServiceTest.java @@ -40,7 +40,6 @@ void setUp() { univApplyInfoFixture.그라츠공과대학_지원_정보(); univApplyInfoFixture.린츠_카톨릭대학_지원_정보(); univApplyInfoFixture.메이지대학_지원_정보(); - generalUniversityRecommendService.init(); } @Test diff --git a/src/test/java/com/example/solidconnection/university/service/UniversityRecommendServiceTest.java b/src/test/java/com/example/solidconnection/university/service/UniversityRecommendServiceTest.java index a1bfba10b..9b238a54a 100644 --- a/src/test/java/com/example/solidconnection/university/service/UniversityRecommendServiceTest.java +++ b/src/test/java/com/example/solidconnection/university/service/UniversityRecommendServiceTest.java @@ -72,7 +72,6 @@ void setUp() { univApplyInfoFixture.그라츠공과대학_지원_정보(); univApplyInfoFixture.린츠_카톨릭대학_지원_정보(); univApplyInfoFixture.메이지대학_지원_정보(); - generalUniversityRecommendService.init(); } @Test @@ -136,18 +135,16 @@ void setUp() { @Test void 관심사_미설정_사용자는_일반_추천_대학을_조회한다() { // when - UniversityRecommendsResponse response = universityRecommendService.getPersonalRecommends(user); + UniversityRecommendsResponse personalResponse = universityRecommendService.getPersonalRecommends(user); + UniversityRecommendsResponse generalResponse = universityRecommendService.getGeneralRecommends(); // then - assertThat(response.recommendedUniversities()) + assertThat(personalResponse.recommendedUniversities()) .hasSize(RECOMMEND_UNIVERSITY_NUM) - .containsExactlyInAnyOrderElementsOf( - generalUniversityRecommendService.getRecommendUniversities().stream() - .map(UniversityInfoForApplyPreviewResponse::from) - .toList() - ); + .containsExactlyInAnyOrderElementsOf(generalResponse.recommendedUniversities()); } + @Test void 일반_추천_대학을_조회한다() { // when @@ -156,10 +153,7 @@ void setUp() { // then assertThat(response.recommendedUniversities()) .hasSize(RECOMMEND_UNIVERSITY_NUM) - .containsExactlyInAnyOrderElementsOf( - generalUniversityRecommendService.getRecommendUniversities().stream() - .map(UniversityInfoForApplyPreviewResponse::from) - .toList() - ); + .allMatch(univ -> univ.id() > 0) + .allMatch(univ -> univ.koreanName() != null); } } From 32cb72fb01a2c25177f2bb92b0a520883a10bb9b Mon Sep 17 00:00:00 2001 From: Yeonri Date: Tue, 1 Jul 2025 19:58:57 +0900 Subject: [PATCH 03/11] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20siteUser=20=EC=9E=AC=EC=A1=B0=ED=9A=8C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=20ScoreService=EC=97=90=EC=84=9C=20siteUser?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=8B=A4=EC=8B=9C=20=EB=B6=88?= =?UTF-8?q?=EB=9F=AC=EC=98=A4=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/solidconnection/score/service/ScoreService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 a11756e6a..cf9313210 100644 --- a/src/main/java/com/example/solidconnection/score/service/ScoreService.java +++ b/src/main/java/com/example/solidconnection/score/service/ScoreService.java @@ -43,8 +43,7 @@ public class ScoreService { public Long submitGpaScore(SiteUser siteUser, GpaScoreRequest gpaScoreRequest, MultipartFile file) { UploadedFileUrlResponse uploadedFile = s3Service.uploadFile(file, ImgType.GPA); Gpa gpa = new Gpa(gpaScoreRequest.gpa(), gpaScoreRequest.gpaCriteria(), uploadedFile.fileUrl()); - SiteUser siteUser1 = siteUserRepository.findById(siteUser.getId()).orElseThrow(() -> new CustomException(USER_NOT_FOUND)); - GpaScore newGpaScore = new GpaScore(gpa, siteUser1); + GpaScore newGpaScore = new GpaScore(gpa, siteUser); GpaScore savedNewGpaScore = gpaScoreRepository.save(newGpaScore); return savedNewGpaScore.getId(); } From 2938a79c43175c41a3c69f991a1c0a4482a10760 Mon Sep 17 00:00:00 2001 From: Yeonri Date: Wed, 2 Jul 2025 12:27:48 +0900 Subject: [PATCH 04/11] =?UTF-8?q?refactor:=20=EC=88=98=EC=A0=95=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81=20-=20=EC=BB=A8=EB=B2=A4?= =?UTF-8?q?=EC=85=98,=20=ED=83=80=EC=9E=85=EC=88=98=EC=A0=95=20=EB=8B=A4?= =?UTF-8?q?=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solidconnection/application/domain/Application.java | 2 -- .../application/dto/ApplicantsResponse.java | 3 ++- .../solidconnection/location/country/domain/Country.java | 2 -- .../location/country/domain/InterestedCountry.java | 8 +++++++- .../country/repository/InterestedCountryRepository.java | 2 +- .../location/region/domain/InterestedRegion.java | 8 +++++++- .../region/repository/InterestedRegionRepository.java | 1 + .../example/solidconnection/score/domain/GpaScore.java | 1 - .../solidconnection/score/domain/LanguageTestScore.java | 1 - .../score/repository/GpaScoreRepository.java | 6 +++--- .../score/repository/LanguageTestScoreRepository.java | 4 ++-- .../solidconnection/score/service/ScoreService.java | 6 ------ .../solidconnection/siteuser/domain/SiteUser.java | 2 -- .../university/domain/LikedUnivApplyInfo.java | 9 +++++++-- .../solidconnection/university/domain/UnivApplyInfo.java | 2 -- .../repository/LikedUnivApplyInfoRepository.java | 6 +++--- .../university/repository/UnivApplyInfoRepository.java | 1 - .../custom/UnivApplyInfoFilterRepositoryImpl.java | 1 - .../university/service/UniversityLikeService.java | 0 19 files changed, 33 insertions(+), 32 deletions(-) delete mode 100644 src/main/java/com/example/solidconnection/university/service/UniversityLikeService.java diff --git a/src/main/java/com/example/solidconnection/application/domain/Application.java b/src/main/java/com/example/solidconnection/application/domain/Application.java index 8dc371a07..fa0514af5 100644 --- a/src/main/java/com/example/solidconnection/application/domain/Application.java +++ b/src/main/java/com/example/solidconnection/application/domain/Application.java @@ -6,12 +6,10 @@ import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Index; -import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/example/solidconnection/application/dto/ApplicantsResponse.java b/src/main/java/com/example/solidconnection/application/dto/ApplicantsResponse.java index 065cba380..b92f699a7 100644 --- a/src/main/java/com/example/solidconnection/application/dto/ApplicantsResponse.java +++ b/src/main/java/com/example/solidconnection/application/dto/ApplicantsResponse.java @@ -5,6 +5,7 @@ import com.example.solidconnection.university.domain.UnivApplyInfo; import java.util.List; +import java.util.Objects; public record ApplicantsResponse( String koreanName, @@ -24,6 +25,6 @@ public static ApplicantsResponse of(UnivApplyInfo univApplyInfo, List { + List findAllBySiteUserId(long siteUserId); } diff --git a/src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java b/src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java index 3800bffed..29f6bcaa8 100644 --- a/src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java +++ b/src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java @@ -1,7 +1,13 @@ package com.example.solidconnection.location.region.domain; import com.example.solidconnection.siteuser.domain.SiteUser; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/example/solidconnection/location/region/repository/InterestedRegionRepository.java b/src/main/java/com/example/solidconnection/location/region/repository/InterestedRegionRepository.java index cc0177c9b..2d3b09954 100644 --- a/src/main/java/com/example/solidconnection/location/region/repository/InterestedRegionRepository.java +++ b/src/main/java/com/example/solidconnection/location/region/repository/InterestedRegionRepository.java @@ -9,5 +9,6 @@ @Repository public interface InterestedRegionRepository extends JpaRepository { + List findAllBySiteUserId(long siteUserId); } diff --git a/src/main/java/com/example/solidconnection/score/domain/GpaScore.java b/src/main/java/com/example/solidconnection/score/domain/GpaScore.java index ed45eff3b..1f7728dd9 100644 --- a/src/main/java/com/example/solidconnection/score/domain/GpaScore.java +++ b/src/main/java/com/example/solidconnection/score/domain/GpaScore.java @@ -12,7 +12,6 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java b/src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java index 00d181399..9db8cb3e9 100644 --- a/src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java +++ b/src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java @@ -12,7 +12,6 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/example/solidconnection/score/repository/GpaScoreRepository.java b/src/main/java/com/example/solidconnection/score/repository/GpaScoreRepository.java index 7a916d64c..70e551d1b 100644 --- a/src/main/java/com/example/solidconnection/score/repository/GpaScoreRepository.java +++ b/src/main/java/com/example/solidconnection/score/repository/GpaScoreRepository.java @@ -2,7 +2,6 @@ import com.example.solidconnection.score.domain.GpaScore; import com.example.solidconnection.score.repository.custom.GpaScoreFilterRepository; -import com.example.solidconnection.siteuser.domain.SiteUser; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -14,6 +13,7 @@ public interface GpaScoreRepository extends JpaRepository, GpaSc Optional findGpaScoreBySiteUserId(long siteUserId); - Optional findGpaScoreBySiteUserIdAndId(long siteUser, Long id); - List findBySiteUserId(Long siteUserId); + Optional findGpaScoreBySiteUserIdAndId(long siteUserId, Long id); + + List findBySiteUserId(long siteUserId); } diff --git a/src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java b/src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java index 0c5d44180..2486249a8 100644 --- a/src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java +++ b/src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java @@ -2,7 +2,6 @@ import com.example.solidconnection.score.domain.LanguageTestScore; import com.example.solidconnection.score.repository.custom.LanguageTestScoreFilterRepository; -import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.university.domain.LanguageTestType; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -16,5 +15,6 @@ public interface LanguageTestScoreRepository extends JpaRepository findLanguageTestScoreBySiteUserIdAndLanguageTest_LanguageTestType(long siteUserId, LanguageTestType languageTestType); Optional findLanguageTestScoreBySiteUserIdAndId(long siteUser, Long id); - List findBySiteUserId(Long siteUserId); + + List findBySiteUserId(long siteUserId); } 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 cf9313210..e0800883e 100644 --- a/src/main/java/com/example/solidconnection/score/service/ScoreService.java +++ b/src/main/java/com/example/solidconnection/score/service/ScoreService.java @@ -2,7 +2,6 @@ import com.example.solidconnection.application.domain.Gpa; import com.example.solidconnection.application.domain.LanguageTest; -import com.example.solidconnection.common.exception.CustomException; import com.example.solidconnection.s3.domain.ImgType; import com.example.solidconnection.s3.dto.UploadedFileUrlResponse; import com.example.solidconnection.s3.service.S3Service; @@ -23,13 +22,9 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; -import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND; - @Service @RequiredArgsConstructor public class ScoreService { @@ -37,7 +32,6 @@ public class ScoreService { private final GpaScoreRepository gpaScoreRepository; private final S3Service s3Service; private final LanguageTestScoreRepository languageTestScoreRepository; - private final SiteUserRepository siteUserRepository; @Transactional public Long submitGpaScore(SiteUser siteUser, GpaScoreRequest gpaScoreRequest, MultipartFile file) { diff --git a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java index 070690635..596801a97 100644 --- a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java +++ b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java @@ -3,8 +3,6 @@ import com.example.solidconnection.community.comment.domain.Comment; import com.example.solidconnection.community.post.domain.Post; import com.example.solidconnection.community.post.domain.PostLike; -import com.example.solidconnection.score.domain.GpaScore; -import com.example.solidconnection.score.domain.LanguageTestScore; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/com/example/solidconnection/university/domain/LikedUnivApplyInfo.java b/src/main/java/com/example/solidconnection/university/domain/LikedUnivApplyInfo.java index 8d5eb6ecd..0fc24ae3c 100644 --- a/src/main/java/com/example/solidconnection/university/domain/LikedUnivApplyInfo.java +++ b/src/main/java/com/example/solidconnection/university/domain/LikedUnivApplyInfo.java @@ -1,7 +1,12 @@ package com.example.solidconnection.university.domain; -import com.example.solidconnection.siteuser.domain.SiteUser; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java b/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java index a2511e1ec..81d8b8392 100644 --- a/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java +++ b/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java @@ -86,6 +86,4 @@ public class UnivApplyInfo { public void addLanguageRequirements(LanguageRequirement languageRequirements) { this.languageRequirements.add(languageRequirements); } - - } diff --git a/src/main/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepository.java b/src/main/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepository.java index 0d7d0f275..e5004dd75 100644 --- a/src/main/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepository.java +++ b/src/main/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepository.java @@ -1,6 +1,5 @@ package com.example.solidconnection.university.repository; -import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.university.domain.LikedUnivApplyInfo; import com.example.solidconnection.university.domain.UnivApplyInfo; import org.springframework.data.jpa.repository.JpaRepository; @@ -17,13 +16,14 @@ public interface LikedUnivApplyInfoRepository extends JpaRepository findBySiteUserIdAndUnivApplyInfoId(long siteUserId, long univApplyInfoId); + @Query(""" SELECT u FROM UnivApplyInfo u JOIN LikedUnivApplyInfo l ON u.id = l.univApplyInfoId WHERE l.siteUserId = :siteUserId """) - List findUnivApplyInfosBySiteUserId(@Param("siteUserId") Long siteUserId); + List findUnivApplyInfosBySiteUserId(@Param("siteUserId") long siteUserId); - boolean existsBySiteUserIdAndUnivApplyInfoId(Long siteUserId, Long univApplyInfoId); + boolean existsBySiteUserIdAndUnivApplyInfoId(long siteUserId, Long univApplyInfoId); } diff --git a/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java b/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java index 2c8a406bc..78dc9108d 100644 --- a/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java +++ b/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java @@ -1,7 +1,6 @@ package com.example.solidconnection.university.repository; import com.example.solidconnection.common.exception.CustomException; -import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.university.domain.UnivApplyInfo; import com.example.solidconnection.university.repository.custom.UnivApplyInfoFilterRepository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/example/solidconnection/university/repository/custom/UnivApplyInfoFilterRepositoryImpl.java b/src/main/java/com/example/solidconnection/university/repository/custom/UnivApplyInfoFilterRepositoryImpl.java index d338c3067..cf8f185d4 100644 --- a/src/main/java/com/example/solidconnection/university/repository/custom/UnivApplyInfoFilterRepositoryImpl.java +++ b/src/main/java/com/example/solidconnection/university/repository/custom/UnivApplyInfoFilterRepositoryImpl.java @@ -47,7 +47,6 @@ public List findAllByRegionCodeAndKeywords(String regionCode, Lis .fetch(); } - private BooleanExpression regionCodeEq(QCountry country, String regionCode) { if (regionCode == null || regionCode.isEmpty()) { return Expressions.asBoolean(true).isTrue(); diff --git a/src/main/java/com/example/solidconnection/university/service/UniversityLikeService.java b/src/main/java/com/example/solidconnection/university/service/UniversityLikeService.java deleted file mode 100644 index e69de29bb..000000000 From 541fed7c4ff46b57556acac7b0d26127047ade98 Mon Sep 17 00:00:00 2001 From: Yeonri Date: Wed, 2 Jul 2025 12:42:18 +0900 Subject: [PATCH 05/11] =?UTF-8?q?fix:=20conflict=20merge=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=95=EC=97=90=EC=84=9C=20=EC=83=9D=EA=B8=B4=20=EB=8D=94?= =?UTF-8?q?=EB=AF=B8=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../siteuser/repository/LikedUniversityRepository.java | 0 .../university/repository/UniversityInfoForApplyRepository.java | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/com/example/solidconnection/siteuser/repository/LikedUniversityRepository.java delete mode 100644 src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java diff --git a/src/main/java/com/example/solidconnection/siteuser/repository/LikedUniversityRepository.java b/src/main/java/com/example/solidconnection/siteuser/repository/LikedUniversityRepository.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java b/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java deleted file mode 100644 index e69de29bb..000000000 From 5cf0660da18b617e670369e1b1289a24bbd7a170 Mon Sep 17 00:00:00 2001 From: Yeonri Date: Wed, 2 Jul 2025 15:21:01 +0900 Subject: [PATCH 06/11] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=EB=AC=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/solidconnection/score/service/ScoreService.java | 1 - 1 file changed, 1 deletion(-) 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 e0800883e..818665db0 100644 --- a/src/main/java/com/example/solidconnection/score/service/ScoreService.java +++ b/src/main/java/com/example/solidconnection/score/service/ScoreService.java @@ -16,7 +16,6 @@ import com.example.solidconnection.score.repository.GpaScoreRepository; import com.example.solidconnection.score.repository.LanguageTestScoreRepository; import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; From f24495e47fddf186cf86a0d97e8d879332889d80 Mon Sep 17 00:00:00 2001 From: Yeonri Date: Tue, 8 Jul 2025 20:39:22 +0900 Subject: [PATCH 07/11] =?UTF-8?q?fix:=20=EC=84=9C=EB=B8=8C=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=B0=B8=EC=A1=B0=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/secret | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/secret b/src/main/resources/secret index 84002e866..be52e6ce9 160000 --- a/src/main/resources/secret +++ b/src/main/resources/secret @@ -1 +1 @@ -Subproject commit 84002e86670d380219f580c6605fb7c66ed7d977 +Subproject commit be52e6ce9ca3d2c6eb51442108328b00a539510b From 2bb6e95bc22793d2bcd0638f4d671dad195bea24 Mon Sep 17 00:00:00 2001 From: Yeonri Date: Tue, 8 Jul 2025 23:36:00 +0900 Subject: [PATCH 08/11] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=88=98=EC=A0=95=EC=82=AC=ED=95=AD=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=20-=20Long=ED=83=80=EC=9E=85=20long=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20-=20collect=20->=20toList=EB=8B=A8?= =?UTF-8?q?=EB=8F=85=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20-=20?= =?UTF-8?q?=EC=BB=A8=EB=B2=A4=EC=85=98=20=EC=88=98=EC=A0=95=20-=20Recommen?= =?UTF-8?q?t=20=EB=B3=80=EA=B2=BD=EC=82=AC=ED=95=AD=20=EC=9B=90=EB=B3=B5?= =?UTF-8?q?=20-=20getGeneralRecommendsExcludingSelected=ED=95=A8=EC=88=98?= =?UTF-8?q?=20OutOfRange=20=EB=B0=A9=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/ApplicationRepository.java | 2 +- .../score/service/ScoreService.java | 2 +- .../university/domain/UnivApplyInfo.java | 4 ++-- .../LikedUnivApplyInfoRepository.java | 2 +- .../repository/UnivApplyInfoRepository.java | 24 +++++++------------ .../GeneralUnivApplyInfoRecommendService.java | 13 ++++++---- .../UnivApplyInfoRecommendService.java | 4 ++-- ...eralUnivApplyInfoRecommendServiceTest.java | 1 + .../UnivApplyInfoRecommendServiceTest.java | 15 ++++++++---- 9 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java b/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java index 9d6fdeba1..7ca45f8b6 100644 --- a/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java +++ b/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java @@ -37,7 +37,7 @@ public interface ApplicationRepository extends JpaRepository """) Optional findBySiteUserIdAndTerm(@Param("siteUserId") Long siteUserId, @Param("term") String term); - default Application getApplicationBySiteUserIdAndTerm(Long siteUserId, String term) { + default Application getApplicationBySiteUserIdAndTerm(long siteUserId, String term) { return findBySiteUserIdAndTerm(siteUserId, term) .orElseThrow(() -> new CustomException(APPLICATION_NOT_FOUND)); } 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 818665db0..8b56461e9 100644 --- a/src/main/java/com/example/solidconnection/score/service/ScoreService.java +++ b/src/main/java/com/example/solidconnection/score/service/ScoreService.java @@ -57,7 +57,7 @@ public GpaScoreStatusesResponse getGpaScoreStatus(SiteUser siteUser) { gpaScoreRepository.findBySiteUserId(siteUser.getId()) .stream() .map(GpaScoreStatusResponse::from) - .collect(Collectors.toList()); + .toList(); return GpaScoreStatusesResponse.from(gpaScoreStatusResponseList); } diff --git a/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java b/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java index 9287f5bd4..26ecacf90 100644 --- a/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java +++ b/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java @@ -77,10 +77,10 @@ public class UnivApplyInfo { @Column(length = 1000) private String details; - @OneToMany(mappedBy = "univApplyInfo", cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(mappedBy = "univApplyInfo", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) private Set languageRequirements = new HashSet<>(); - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.EAGER) private University university; public void addLanguageRequirements(LanguageRequirement languageRequirements) { diff --git a/src/main/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepository.java b/src/main/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepository.java index e5004dd75..fe4f93676 100644 --- a/src/main/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepository.java +++ b/src/main/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepository.java @@ -25,5 +25,5 @@ public interface LikedUnivApplyInfoRepository extends JpaRepository findUnivApplyInfosBySiteUserId(@Param("siteUserId") long siteUserId); - boolean existsBySiteUserIdAndUnivApplyInfoId(long siteUserId, Long univApplyInfoId); + boolean existsBySiteUserIdAndUnivApplyInfoId(long siteUserId, long univApplyInfoId); } diff --git a/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java b/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java index 78dc9108d..b1cff1e87 100644 --- a/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java +++ b/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java @@ -37,22 +37,14 @@ OR r.code IN ( """) List findAllBySiteUsersInterestedCountryOrRegionAndTerm(@Param("siteUserId") Long siteUserId, @Param("term") String term); - @Query(""" - SELECT DISTINCT uai - FROM UnivApplyInfo uai - LEFT JOIN FETCH uai.languageRequirements lr - LEFT JOIN FETCH uai.university u - LEFT JOIN FETCH u.country c - LEFT JOIN FETCH u.region r - WHERE uai.term = :term - ORDER BY FUNCTION('RAND') - """) - List findAllRandomByTerm(@Param("term") String term); - default List findRandomByTerm(String term, int limitNum) { - return findAllRandomByTerm(term).stream() - .limit(limitNum) - .collect(Collectors.toList()); - } + @Query(value = """ + SELECT * + FROM university_info_for_apply + WHERE term = :term + ORDER BY RAND() + LIMIT :limitNum + """, nativeQuery = true) + List findRandomByTerm(@Param("term") String term, @Param("limitNum") int limitNum); default UnivApplyInfo getUnivApplyInfoById(Long id) { return findById(id) diff --git a/src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java b/src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java index d45a9634a..1835f4ed0 100644 --- a/src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java +++ b/src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java @@ -2,10 +2,12 @@ import com.example.solidconnection.university.domain.UnivApplyInfo; import com.example.solidconnection.university.repository.UnivApplyInfoRepository; +import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -20,11 +22,14 @@ public class GeneralUnivApplyInfoRecommendService { * */ private final UnivApplyInfoRepository univApplyInfoRepository; + @Getter + private List generalRecommends; + @Value("${university.term}") public String term; - @Transactional(readOnly = true) - public List getGeneralRecommends() { - return univApplyInfoRepository.findRandomByTerm(term, RECOMMEND_UNIV_APPLY_INFO_NUM); + @EventListener(ApplicationReadyEvent.class) + public void init() { + generalRecommends = univApplyInfoRepository.findRandomByTerm(term, RECOMMEND_UNIV_APPLY_INFO_NUM); } } diff --git a/src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java b/src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java index 3adec99bc..194c7aff4 100644 --- a/src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java +++ b/src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java @@ -56,9 +56,9 @@ private List getGeneralRecommendsExcludingSelected(List generalRecommend = new ArrayList<>(generalUnivApplyInfoRecommendService.getGeneralRecommends()); generalRecommend.removeAll(alreadyPicked); Collections.shuffle(generalRecommend); - return generalRecommend.subList(0, RECOMMEND_UNIV_APPLY_INFO_NUM - alreadyPicked.size()); + int needed = RECOMMEND_UNIV_APPLY_INFO_NUM - alreadyPicked.size(); + return generalRecommend.subList(0, Math.min(needed, generalRecommend.size())); } - /* * 공통 추천 대학교를 불러온다. * */ diff --git a/src/test/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendServiceTest.java b/src/test/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendServiceTest.java index 696558783..e2dcdd255 100644 --- a/src/test/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendServiceTest.java +++ b/src/test/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendServiceTest.java @@ -40,6 +40,7 @@ void setUp() { univApplyInfoFixture.그라츠공과대학_지원_정보(); univApplyInfoFixture.린츠_카톨릭대학_지원_정보(); univApplyInfoFixture.메이지대학_지원_정보(); + generalUnivApplyInfoRecommendService.init(); } @Test diff --git a/src/test/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendServiceTest.java b/src/test/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendServiceTest.java index accc29681..96e8bf81d 100644 --- a/src/test/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendServiceTest.java +++ b/src/test/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendServiceTest.java @@ -72,6 +72,7 @@ void setUp() { univApplyInfoFixture.그라츠공과대학_지원_정보(); univApplyInfoFixture.린츠_카톨릭대학_지원_정보(); univApplyInfoFixture.메이지대학_지원_정보(); + generalUnivApplyInfoRecommendService.init(); } @Test @@ -140,9 +141,10 @@ void setUp() { // then assertThat(response.recommendedUniversities()) .hasSize(RECOMMEND_UNIV_APPLY_INFO_NUM) - .allMatch(univ -> univ.koreanName() != null) - .allMatch(univ -> univ.id() > 0) - .allMatch(univ -> univ.term().equals("2024-1")); + .containsExactlyInAnyOrderElementsOf( + generalUnivApplyInfoRecommendService.getGeneralRecommends().stream() + .map(UnivApplyInfoPreviewResponse::from).toList() + ); } @Test void 일반_추천_대학_지원_정보를_조회한다() { @@ -152,7 +154,10 @@ void setUp() { // then assertThat(response.recommendedUniversities()) .hasSize(RECOMMEND_UNIV_APPLY_INFO_NUM) - .allMatch(univ -> univ.id() > 0) - .allMatch(univ -> univ.koreanName() != null); + .containsExactlyInAnyOrderElementsOf( + generalUnivApplyInfoRecommendService.getGeneralRecommends().stream() + .map(UnivApplyInfoPreviewResponse::from) + .toList() + ); } } From d3c9b0ee1a804a76010a18d2b49f0a2884e129e7 Mon Sep 17 00:00:00 2001 From: Yeonri Date: Wed, 9 Jul 2025 15:14:23 +0900 Subject: [PATCH 09/11] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=88=98=EC=A0=95=EC=82=AC=ED=95=AD=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=20-=20UnivApplyInfo=20University=20fetchType=20LAZY?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20-=20=EC=BB=A8=EB=B2=A4?= =?UTF-8?q?=EC=85=98=20=EC=88=98=EC=A0=95=20-=20findRandomByTerm=ED=95=A8?= =?UTF-8?q?=EC=88=98=20nativeQuery=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20Pageabl?= =?UTF-8?q?e=EB=A1=9C=20LIMIT=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../university/domain/UnivApplyInfo.java | 4 ++-- .../repository/UnivApplyInfoRepository.java | 21 +++++++++++-------- .../GeneralUnivApplyInfoRecommendService.java | 5 ++++- .../UnivApplyInfoRecommendService.java | 1 + 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java b/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java index 26ecacf90..9287f5bd4 100644 --- a/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java +++ b/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java @@ -77,10 +77,10 @@ public class UnivApplyInfo { @Column(length = 1000) private String details; - @OneToMany(mappedBy = "univApplyInfo", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) + @OneToMany(mappedBy = "univApplyInfo", cascade = CascadeType.ALL, orphanRemoval = true) private Set languageRequirements = new HashSet<>(); - @ManyToOne(fetch = FetchType.EAGER) + @ManyToOne(fetch = FetchType.LAZY) private University university; public void addLanguageRequirements(LanguageRequirement languageRequirements) { diff --git a/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java b/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java index b1cff1e87..c99ac01eb 100644 --- a/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java +++ b/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java @@ -3,13 +3,13 @@ import com.example.solidconnection.common.exception.CustomException; import com.example.solidconnection.university.domain.UnivApplyInfo; import com.example.solidconnection.university.repository.custom.UnivApplyInfoFilterRepository; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; -import java.util.stream.Collectors; import static com.example.solidconnection.common.exception.ErrorCode.UNIV_APPLY_INFO_NOT_FOUND; @@ -37,14 +37,17 @@ OR r.code IN ( """) List findAllBySiteUsersInterestedCountryOrRegionAndTerm(@Param("siteUserId") Long siteUserId, @Param("term") String term); - @Query(value = """ - SELECT * - FROM university_info_for_apply - WHERE term = :term - ORDER BY RAND() - LIMIT :limitNum - """, nativeQuery = true) - List findRandomByTerm(@Param("term") String term, @Param("limitNum") int limitNum); + @Query(""" + SELECT uai + FROM UnivApplyInfo uai + LEFT JOIN FETCH uai.languageRequirements lr + LEFT JOIN FETCH uai.university u + LEFT JOIN FETCH u.country c + LEFT JOIN FETCH u.region r + WHERE uai.term = :term + ORDER BY FUNCTION('RAND') + """) + List findRandomByTerm(@Param("term") String term, Pageable pageable); // JPA에서 LIMIT 사용이 불가하므로 Pageable을 통해 0page에서 정해진 개수 만큼 가져오는 방식으로 구현 default UnivApplyInfo getUnivApplyInfoById(Long id) { return findById(id) diff --git a/src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java b/src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java index 1835f4ed0..07c2ef653 100644 --- a/src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java +++ b/src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java @@ -7,6 +7,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import java.util.List; @@ -30,6 +32,7 @@ public class GeneralUnivApplyInfoRecommendService { @EventListener(ApplicationReadyEvent.class) public void init() { - generalRecommends = univApplyInfoRepository.findRandomByTerm(term, RECOMMEND_UNIV_APPLY_INFO_NUM); + Pageable page = PageRequest.of(0, RECOMMEND_UNIV_APPLY_INFO_NUM); + generalRecommends = univApplyInfoRepository.findRandomByTerm(term, page); } } diff --git a/src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java b/src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java index 194c7aff4..eaff6eec9 100644 --- a/src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java +++ b/src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java @@ -59,6 +59,7 @@ private List getGeneralRecommendsExcludingSelected(List Date: Wed, 9 Jul 2025 23:04:56 +0900 Subject: [PATCH 10/11] =?UTF-8?q?refactor:=20Parameter=20=EB=AA=85?= =?UTF-8?q?=EC=B9=AD=20=EB=B3=80=EA=B2=BD=20-=20siteUser=20->=20siteUserId?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../score/repository/LanguageTestScoreRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java b/src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java index 42f249f39..2f4268c06 100644 --- a/src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java +++ b/src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java @@ -12,7 +12,7 @@ public interface LanguageTestScoreRepository extends JpaRepository findLanguageTestScoreBySiteUserIdAndLanguageTest_LanguageTestType(long siteUserId, LanguageTestType languageTestType); - Optional findLanguageTestScoreBySiteUserIdAndId(long siteUser, Long id); + Optional findLanguageTestScoreBySiteUserIdAndId(long siteUserId, Long id); List findBySiteUserId(long siteUserId); } From fbd6c97a876acde19e29c8c43375f6226e853296 Mon Sep 17 00:00:00 2001 From: Yeonri Date: Wed, 9 Jul 2025 23:11:11 +0900 Subject: [PATCH 11/11] =?UTF-8?q?refactor:=20Parameter=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EB=B3=80=EA=B2=BD=20-=20Long=20->=20long=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/repository/ApplicationRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java b/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java index 7ca45f8b6..54cb93ada 100644 --- a/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java +++ b/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java @@ -35,7 +35,7 @@ public interface ApplicationRepository extends JpaRepository AND a.term = :term AND a.isDelete = false """) - Optional findBySiteUserIdAndTerm(@Param("siteUserId") Long siteUserId, @Param("term") String term); + Optional findBySiteUserIdAndTerm(@Param("siteUserId") long siteUserId, @Param("term") String term); default Application getApplicationBySiteUserIdAndTerm(long siteUserId, String term) { return findBySiteUserIdAndTerm(siteUserId, term)