Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,14 @@ OR u.region.code IN (
""")
List<UniversityInfoForApply> findUniversityInfoForAppliesBySiteUsersInterestedCountryOrRegionAndTerm(@Param("siteUser") SiteUser siteUser, @Param("term") String term);

@Query(value = """
SELECT *
FROM university_info_for_apply
WHERE term = :term
ORDER BY RAND() LIMIT :limitNum
""", nativeQuery = true)
List<UniversityInfoForApply> 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));
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.example.solidconnection.university.service;

import com.example.solidconnection.university.domain.UniversityInfoForApply;
import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository;
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 java.util.List;

import static com.example.solidconnection.university.service.UniversityRecommendService.RECOMMEND_UNIVERSITY_NUM;

@Service
@RequiredArgsConstructor
public class GeneralUniversityRecommendService {

Comment on lines +16 to +19
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

기존에 GeneralRecommendUniversities 였던 클래스 이름을
GeneralUniversityRecommendService 로 바꿨습니다.
이전 이름은 도메인의 느낌이 들어서 변경의 필요성을 느꼈고,
비지니스 로직이 담긴 클래스이니 Service 를 붙여주었습니다.

/*
* 해당 시기에 열리는 대학교들 중 랜덤으로 선택해서 목록을 구성한다.
* */
private final UniversityInfoForApplyRepository universityInfoForApplyRepository;

@Getter
private List<UniversityInfoForApply> recommendUniversities;

@Value("${university.term}")
public String term;

@EventListener(ApplicationReadyEvent.class)
public void init() {
recommendUniversities = universityInfoForApplyRepository.findRandomByTerm(term, RECOMMEND_UNIVERSITY_NUM);
}
Comment on lines +31 to +34
Copy link
Collaborator Author

@nayonsoso nayonsoso Jan 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

원래 List<UniversityInfoForApply> recommendUniversities가 final 이었고,
init() 함수에서 대학들을 리스트에 add 하는식으로 구현되었었는데, 이를 바꿨습니다.

add 를 사용하면, 외부에서 init() 함수를 호출할 때마다 list 에 12개, 18개, 24개.. 이런식으로 쌓이게 됩니다.
이는 예상치 못한 동작입니다😨
이를 예방하고자 새로운 리스트를 할당하는 식으로 변경했습니다.

}
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
Expand Down Expand Up @@ -56,7 +56,7 @@ public UniversityRecommendsResponse getPersonalRecommends(String email) {
}

private List<UniversityInfoForApply> getGeneralRecommendsExcludingSelected(List<UniversityInfoForApply> alreadyPicked) {
List<UniversityInfoForApply> generalRecommend = new ArrayList<>(generalRecommendUniversities.getRecommendUniversities());
List<UniversityInfoForApply> generalRecommend = new ArrayList<>(generalUniversityRecommendService.getRecommendUniversities());
generalRecommend.removeAll(alreadyPicked);
Collections.shuffle(generalRecommend);
return generalRecommend.subList(0, RECOMMEND_UNIVERSITY_NUM - alreadyPicked.size());
Expand All @@ -68,8 +68,7 @@ private List<UniversityInfoForApply> getGeneralRecommendsExcludingSelected(List<
@Transactional(readOnly = true)
@ThunderingHerdCaching(key = "university:recommend:general", cacheManager = "customCacheManager", ttlSec = 86400)
public UniversityRecommendsResponse getGeneralRecommends() {
List<UniversityInfoForApply> generalRecommends = new ArrayList<>(generalRecommendUniversities.getRecommendUniversities());
Collections.shuffle(generalRecommends);
Copy link
Collaborator Author

@nayonsoso nayonsoso Jan 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

셔플하는 코드를 없앴습니다.
랜덤한 것을 반환하기도 하고, 애초에 이 부분이 캐싱되어있어서 셔플이 무의미하다 생각합니다.

List<UniversityInfoForApply> generalRecommends = new ArrayList<>(generalUniversityRecommendService.getRecommendUniversities());
return new UniversityRecommendsResponse(generalRecommends.stream()
.map(UniversityInfoForApplyPreviewResponse::from)
.toList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -41,7 +41,7 @@ class UniversityRecommendTest extends UniversityDataSetUpEndToEndTest {
private TokenProvider tokenProvider;

@Autowired
private GeneralRecommendUniversities generalRecommendUniversities;
private GeneralUniversityRecommendService generalUniversityRecommendService;

private SiteUser siteUser;
private String accessToken;
Expand All @@ -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);
Expand Down Expand Up @@ -156,7 +156,7 @@ void setUp() {
.extract().as(UniversityRecommendsResponse.class);

List<UniversityInfoForApplyPreviewResponse> generalRecommendUniversities
= this.generalRecommendUniversities.getRecommendUniversities().stream()
= this.generalUniversityRecommendService.getRecommendUniversities().stream()
.map(UniversityInfoForApplyPreviewResponse::from)
.toList();
assertAll(
Expand All @@ -179,7 +179,7 @@ void setUp() {
.extract().as(UniversityRecommendsResponse.class);

List<UniversityInfoForApplyPreviewResponse> generalRecommendUniversities
= this.generalRecommendUniversities.getRecommendUniversities().stream()
= this.generalUniversityRecommendService.getRecommendUniversities().stream()
.map(UniversityInfoForApplyPreviewResponse::from)
.toList();
assertAll(
Expand Down
Original file line number Diff line number Diff line change
@@ -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 GeneralUniversityRecommendServiceTest extends BaseIntegrationTest {

@Autowired
private GeneralUniversityRecommendService generalUniversityRecommendService;

@Value("${university.term}")
private String term;

@Test
void 모집_시기의_대학들_중에서_랜덤하게_N개를_추천_목록으로_구성한다() {
// given
generalUniversityRecommendService.init();
List<UniversityInfoForApply> universities = generalUniversityRecommendService.getRecommendUniversities();

// when & then
assertAll(
() -> assertThat(universities)
.extracting("term")
.allMatch(term::equals),
() -> assertThat(universities).hasSize(RECOMMEND_UNIVERSITY_NUM)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -118,7 +118,7 @@ void setUp() {
assertThat(response.recommendedUniversities())
.hasSize(RECOMMEND_UNIVERSITY_NUM)
.containsExactlyInAnyOrderElementsOf(
generalRecommendUniversities.getRecommendUniversities().stream()
generalUniversityRecommendService.getRecommendUniversities().stream()
.map(UniversityInfoForApplyPreviewResponse::from)
.toList()
);
Expand All @@ -133,7 +133,7 @@ void setUp() {
assertThat(response.recommendedUniversities())
.hasSize(RECOMMEND_UNIVERSITY_NUM)
.containsExactlyInAnyOrderElementsOf(
generalRecommendUniversities.getRecommendUniversities().stream()
generalUniversityRecommendService.getRecommendUniversities().stream()
.map(UniversityInfoForApplyPreviewResponse::from)
.toList()
);
Expand Down