From 3a514cfe8242df0efeb63b8da9dc51decb674911 Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Wed, 29 Jan 2025 07:25:52 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor:=20=EA=B3=B5=ED=86=B5=20=EC=B6=94?= =?UTF-8?q?=EC=B2=9C=20=EB=8C=80=ED=95=99=20=EB=A1=9C=EC=A7=81=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 해당 학기에 열리는 대학들을 랜덤으로 가져오도록 --- .../UniversityInfoForApplyRepository.java | 8 ++++ .../service/GeneralRecommendUniversities.java | 26 +++--------- .../GeneralRecommendUniversitiesTest.java | 41 +++++++++++++++++++ 3 files changed, 54 insertions(+), 21 deletions(-) create mode 100644 src/test/java/com/example/solidconnection/university/service/GeneralRecommendUniversitiesTest.java 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 4adc0d718..b574282cb 100644 --- a/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java +++ b/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java @@ -45,6 +45,14 @@ OR u.region.code IN ( """) List findUniversityInfoForAppliesBySiteUsersInterestedCountryOrRegionAndTerm(@Param("siteUser") SiteUser siteUser, @Param("term") String term); + @Query(""" + SELECT uifa + FROM UniversityInfoForApply uifa + WHERE uifa.term = :term + ORDER BY RAND() LIMIT :limitNum + """) + List findRandomByTerm(@Param("term") String term, @Param("limitNum") int limitNum); + default UniversityInfoForApply 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/service/GeneralRecommendUniversities.java b/src/main/java/com/example/solidconnection/university/service/GeneralRecommendUniversities.java index 92054eee6..289b93d43 100644 --- a/src/main/java/com/example/solidconnection/university/service/GeneralRecommendUniversities.java +++ b/src/main/java/com/example/solidconnection/university/service/GeneralRecommendUniversities.java @@ -1,6 +1,5 @@ package com.example.solidconnection.university.service; -import com.example.solidconnection.repositories.CountryRepository; import com.example.solidconnection.university.domain.UniversityInfoForApply; import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository; import lombok.Getter; @@ -8,43 +7,28 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import java.util.List; import static com.example.solidconnection.university.service.UniversityRecommendService.RECOMMEND_UNIVERSITY_NUM; +@Service @RequiredArgsConstructor -@Component public class GeneralRecommendUniversities { /* - * 매 선발 시기(term) 마다 지원할 수 있는 대학교가 달라지므르, 추천 대학교도 달라져야 한다. - * 하지만 매번 추천 대학교를 바꾸기에는 번거롭다. - * 따라서 '추천 대학교 후보'들을 설정하고, DB 에서 현재 term 에 대해 찾아지는 대학교만 추천 대학교로 지정한다. + * 해당 시기에 열리는 대학교들 중 랜덤으로 선택해서 목록을 구성한다. * */ @Getter - private final List recommendUniversities; + private List recommendUniversities; private final UniversityInfoForApplyRepository universityInfoForApplyRepository; - private final CountryRepository countryRepository; - private final List candidates = List.of( - "오스트라바 대학", "RMIT멜버른공과대학(A형)", "알브슈타트 지그마링엔 대학", - "뉴저지시티대학(A형)", "도요대학", "템플대학(A형)", "빈 공과대학교", - "리스본대학 공과대학", "바덴뷔르템베르크 산학협력대학", "긴다이대학", "네바다주립대학 라스베이거스(B형)", "릴 가톨릭 대학", - "그라츠공과대학", "그라츠 대학", "코펜하겐 IT대학", "메이지대학", "분쿄가쿠인대학", "린츠 카톨릭 대학교", - "밀라노공과대학", "장물랭리옹3세대학교", "시드니대학", "아우크스부르크대학", "쳄니츠 공과대학", "북경외국어대학교 IBS" - ); @Value("${university.term}") public String term; @EventListener(ApplicationReadyEvent.class) public void init() { - int i = 0; - while (recommendUniversities.size() < RECOMMEND_UNIVERSITY_NUM && i < candidates.size()) { - universityInfoForApplyRepository.findFirstByKoreanNameAndTerm(candidates.get(i), term) - .ifPresent(recommendUniversities::add); - i++; - } + recommendUniversities = universityInfoForApplyRepository.findRandomByTerm(term, RECOMMEND_UNIVERSITY_NUM); } } diff --git a/src/test/java/com/example/solidconnection/university/service/GeneralRecommendUniversitiesTest.java b/src/test/java/com/example/solidconnection/university/service/GeneralRecommendUniversitiesTest.java new file mode 100644 index 000000000..a1bb0687d --- /dev/null +++ b/src/test/java/com/example/solidconnection/university/service/GeneralRecommendUniversitiesTest.java @@ -0,0 +1,41 @@ +package com.example.solidconnection.university.service; + +import com.example.solidconnection.support.TestContainerSpringBootTest; +import com.example.solidconnection.support.integration.BaseIntegrationTest; +import com.example.solidconnection.university.domain.UniversityInfoForApply; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; + +import java.util.List; + +import static com.example.solidconnection.university.service.UniversityRecommendService.RECOMMEND_UNIVERSITY_NUM; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +@DisplayName("공통 추천 대학 서비스 테스트") +@TestContainerSpringBootTest +class GeneralRecommendUniversitiesTest extends BaseIntegrationTest { + + @Autowired + private GeneralRecommendUniversities generalRecommendUniversities; + + @Value("${university.term}") + private String term; + + @Test + void 모집_시기의_대학들_중에서_랜덤하게_N개를_추천_목록으로_구성한다() { + // given + generalRecommendUniversities.init(); + List universities = generalRecommendUniversities.getRecommendUniversities(); + + // when & then + assertAll( + () -> assertThat(universities) + .extracting("term") + .allMatch(term::equals), + () -> assertThat(universities).hasSize(RECOMMEND_UNIVERSITY_NUM) + ); + } +} From 41ba090dff46b485db62ed21d2cc59f846442310 Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Wed, 29 Jan 2025 07:26:18 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=85=94=ED=94=8C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 랜덤으로 가져오는 것을 다시 셔플할 필요는 없으므로 --- .../university/service/UniversityRecommendService.java | 1 - 1 file changed, 1 deletion(-) 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 6a6a43fbf..ab901ea2d 100644 --- a/src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java +++ b/src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java @@ -69,7 +69,6 @@ private List getGeneralRecommendsExcludingSelected(List< @ThunderingHerdCaching(key = "university:recommend:general", cacheManager = "customCacheManager", ttlSec = 86400) public UniversityRecommendsResponse getGeneralRecommends() { List generalRecommends = new ArrayList<>(generalRecommendUniversities.getRecommendUniversities()); - Collections.shuffle(generalRecommends); return new UniversityRecommendsResponse(generalRecommends.stream() .map(UniversityInfoForApplyPreviewResponse::from) .toList()); From 824f64facdc3b8597787464438f0fc6cc074fc88 Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Wed, 29 Jan 2025 07:29:14 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ies.java => GeneralUniversityRecommendService.java} | 2 +- .../university/service/UniversityRecommendService.java | 6 +++--- .../solidconnection/e2e/UniversityRecommendTest.java | 10 +++++----- ...java => GeneralUniversityRecommendServiceTest.java} | 8 ++++---- .../service/UniversityRecommendServiceTest.java | 8 ++++---- 5 files changed, 17 insertions(+), 17 deletions(-) rename src/main/java/com/example/solidconnection/university/service/{GeneralRecommendUniversities.java => GeneralUniversityRecommendService.java} (96%) rename src/test/java/com/example/solidconnection/university/service/{GeneralRecommendUniversitiesTest.java => GeneralUniversityRecommendServiceTest.java} (80%) diff --git a/src/main/java/com/example/solidconnection/university/service/GeneralRecommendUniversities.java b/src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java similarity index 96% rename from src/main/java/com/example/solidconnection/university/service/GeneralRecommendUniversities.java rename to src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java index 289b93d43..d6f1f41b5 100644 --- a/src/main/java/com/example/solidconnection/university/service/GeneralRecommendUniversities.java +++ b/src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java @@ -15,7 +15,7 @@ @Service @RequiredArgsConstructor -public class GeneralRecommendUniversities { +public class GeneralUniversityRecommendService { /* * 해당 시기에 열리는 대학교들 중 랜덤으로 선택해서 목록을 구성한다. 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 ab901ea2d..654b08390 100644 --- a/src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java +++ b/src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java @@ -23,7 +23,7 @@ public class UniversityRecommendService { public static final int RECOMMEND_UNIVERSITY_NUM = 6; private final UniversityInfoForApplyRepository universityInfoForApplyRepository; - private final GeneralRecommendUniversities generalRecommendUniversities; + private final GeneralUniversityRecommendService generalUniversityRecommendService; private final SiteUserRepository siteUserRepository; @Value("${university.term}") @@ -56,7 +56,7 @@ public UniversityRecommendsResponse getPersonalRecommends(String email) { } private List getGeneralRecommendsExcludingSelected(List alreadyPicked) { - List generalRecommend = new ArrayList<>(generalRecommendUniversities.getRecommendUniversities()); + List generalRecommend = new ArrayList<>(generalUniversityRecommendService.getRecommendUniversities()); generalRecommend.removeAll(alreadyPicked); Collections.shuffle(generalRecommend); return generalRecommend.subList(0, RECOMMEND_UNIVERSITY_NUM - alreadyPicked.size()); @@ -68,7 +68,7 @@ private List getGeneralRecommendsExcludingSelected(List< @Transactional(readOnly = true) @ThunderingHerdCaching(key = "university:recommend:general", cacheManager = "customCacheManager", ttlSec = 86400) public UniversityRecommendsResponse getGeneralRecommends() { - List generalRecommends = new ArrayList<>(generalRecommendUniversities.getRecommendUniversities()); + List generalRecommends = new ArrayList<>(generalUniversityRecommendService.getRecommendUniversities()); return new UniversityRecommendsResponse(generalRecommends.stream() .map(UniversityInfoForApplyPreviewResponse::from) .toList()); diff --git a/src/test/java/com/example/solidconnection/e2e/UniversityRecommendTest.java b/src/test/java/com/example/solidconnection/e2e/UniversityRecommendTest.java index 00afbc8e3..4f3bd3042 100644 --- a/src/test/java/com/example/solidconnection/e2e/UniversityRecommendTest.java +++ b/src/test/java/com/example/solidconnection/e2e/UniversityRecommendTest.java @@ -10,7 +10,7 @@ import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.university.dto.UniversityInfoForApplyPreviewResponse; import com.example.solidconnection.university.dto.UniversityRecommendsResponse; -import com.example.solidconnection.university.service.GeneralRecommendUniversities; +import com.example.solidconnection.university.service.GeneralUniversityRecommendService; import io.restassured.RestAssured; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -41,7 +41,7 @@ class UniversityRecommendTest extends UniversityDataSetUpEndToEndTest { private TokenProvider tokenProvider; @Autowired - private GeneralRecommendUniversities generalRecommendUniversities; + private GeneralUniversityRecommendService generalUniversityRecommendService; private SiteUser siteUser; private String accessToken; @@ -51,7 +51,7 @@ void setUp() { // setUp - 회원 정보 저장 String email = "email@email.com"; siteUser = siteUserRepository.save(createSiteUserByEmail(email)); - generalRecommendUniversities.init(); + generalUniversityRecommendService.init(); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 accessToken = tokenProvider.generateToken(email, TokenType.ACCESS); @@ -156,7 +156,7 @@ void setUp() { .extract().as(UniversityRecommendsResponse.class); List generalRecommendUniversities - = this.generalRecommendUniversities.getRecommendUniversities().stream() + = this.generalUniversityRecommendService.getRecommendUniversities().stream() .map(UniversityInfoForApplyPreviewResponse::from) .toList(); assertAll( @@ -179,7 +179,7 @@ void setUp() { .extract().as(UniversityRecommendsResponse.class); List generalRecommendUniversities - = this.generalRecommendUniversities.getRecommendUniversities().stream() + = this.generalUniversityRecommendService.getRecommendUniversities().stream() .map(UniversityInfoForApplyPreviewResponse::from) .toList(); assertAll( diff --git a/src/test/java/com/example/solidconnection/university/service/GeneralRecommendUniversitiesTest.java b/src/test/java/com/example/solidconnection/university/service/GeneralUniversityRecommendServiceTest.java similarity index 80% rename from src/test/java/com/example/solidconnection/university/service/GeneralRecommendUniversitiesTest.java rename to src/test/java/com/example/solidconnection/university/service/GeneralUniversityRecommendServiceTest.java index a1bb0687d..d93765a44 100644 --- a/src/test/java/com/example/solidconnection/university/service/GeneralRecommendUniversitiesTest.java +++ b/src/test/java/com/example/solidconnection/university/service/GeneralUniversityRecommendServiceTest.java @@ -16,10 +16,10 @@ @DisplayName("공통 추천 대학 서비스 테스트") @TestContainerSpringBootTest -class GeneralRecommendUniversitiesTest extends BaseIntegrationTest { +class GeneralUniversityRecommendServiceTest extends BaseIntegrationTest { @Autowired - private GeneralRecommendUniversities generalRecommendUniversities; + private GeneralUniversityRecommendService generalUniversityRecommendService; @Value("${university.term}") private String term; @@ -27,8 +27,8 @@ class GeneralRecommendUniversitiesTest extends BaseIntegrationTest { @Test void 모집_시기의_대학들_중에서_랜덤하게_N개를_추천_목록으로_구성한다() { // given - generalRecommendUniversities.init(); - List universities = generalRecommendUniversities.getRecommendUniversities(); + generalUniversityRecommendService.init(); + List universities = generalUniversityRecommendService.getRecommendUniversities(); // when & then assertAll( 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 cadd45aaf..17d951614 100644 --- a/src/test/java/com/example/solidconnection/university/service/UniversityRecommendServiceTest.java +++ b/src/test/java/com/example/solidconnection/university/service/UniversityRecommendServiceTest.java @@ -38,11 +38,11 @@ class UniversityRecommendServiceTest extends BaseIntegrationTest { private InterestedCountyRepository interestedCountyRepository; @Autowired - private GeneralRecommendUniversities generalRecommendUniversities; + private GeneralUniversityRecommendService generalUniversityRecommendService; @BeforeEach void setUp() { - generalRecommendUniversities.init(); + generalUniversityRecommendService.init(); } @Test @@ -118,7 +118,7 @@ void setUp() { assertThat(response.recommendedUniversities()) .hasSize(RECOMMEND_UNIVERSITY_NUM) .containsExactlyInAnyOrderElementsOf( - generalRecommendUniversities.getRecommendUniversities().stream() + generalUniversityRecommendService.getRecommendUniversities().stream() .map(UniversityInfoForApplyPreviewResponse::from) .toList() ); @@ -133,7 +133,7 @@ void setUp() { assertThat(response.recommendedUniversities()) .hasSize(RECOMMEND_UNIVERSITY_NUM) .containsExactlyInAnyOrderElementsOf( - generalRecommendUniversities.getRecommendUniversities().stream() + generalUniversityRecommendService.getRecommendUniversities().stream() .map(UniversityInfoForApplyPreviewResponse::from) .toList() ); From e26dbb9748b47bcabc99af90bd3b9eabf14eae29 Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Wed, 29 Jan 2025 07:36:08 +0900 Subject: [PATCH 4/5] =?UTF-8?q?style:=20=ED=95=84=EB=93=9C=20=EC=84=A0?= =?UTF-8?q?=EC=96=B8=20=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - final 이 위로 가도록 --- .../university/service/GeneralUniversityRecommendService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 d6f1f41b5..d39fee1ec 100644 --- a/src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java +++ b/src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java @@ -20,9 +20,10 @@ public class GeneralUniversityRecommendService { /* * 해당 시기에 열리는 대학교들 중 랜덤으로 선택해서 목록을 구성한다. * */ + private final UniversityInfoForApplyRepository universityInfoForApplyRepository; + @Getter private List recommendUniversities; - private final UniversityInfoForApplyRepository universityInfoForApplyRepository; @Value("${university.term}") public String term; From d3c300174068cb0aef8c369269da467e4ada19fb Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Thu, 30 Jan 2025 05:31:40 +0900 Subject: [PATCH 5/5] =?UTF-8?q?refactor:=20native=20query=20=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/UniversityInfoForApplyRepository.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 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 b574282cb..60474c13d 100644 --- a/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java +++ b/src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java @@ -45,12 +45,12 @@ OR u.region.code IN ( """) List findUniversityInfoForAppliesBySiteUsersInterestedCountryOrRegionAndTerm(@Param("siteUser") SiteUser siteUser, @Param("term") String term); - @Query(""" - SELECT uifa - FROM UniversityInfoForApply uifa - WHERE uifa.term = :term - ORDER BY RAND() LIMIT :limitNum - """) + @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 UniversityInfoForApply getUniversityInfoForApplyById(Long id) {