Skip to content

Commit df10149

Browse files
committed
fix: application, university 테스트 코드 오류 수정
- 연관관계 변경에 따른 transaction 문제 해결 - 쿼리 일부 수정, 테스트 코드 일부 수정 - GeneralUniversityRecommendService 로직 수정
1 parent b6037ab commit df10149

5 files changed

Lines changed: 42 additions & 40 deletions

File tree

src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.example.solidconnection.siteuser.domain.SiteUser;
55
import com.example.solidconnection.university.domain.UnivApplyInfo;
66
import com.example.solidconnection.university.domain.University;
7+
import org.springframework.data.jpa.repository.EntityGraph;
78
import org.springframework.data.jpa.repository.JpaRepository;
89
import org.springframework.data.jpa.repository.Query;
910
import org.springframework.data.repository.query.Param;
@@ -30,32 +31,33 @@ public interface UniversityInfoForApplyRepository extends JpaRepository<UnivAppl
3031
List<UnivApplyInfo> findByUniversitiesAndTerm(@Param("universities") List<University> universities, @Param("term") String term);
3132

3233
@Query("""
33-
SELECT uifa
34+
SELECT DISTINCT uifa
3435
FROM UnivApplyInfo uifa
35-
JOIN University u ON uifa.university = u
36-
WHERE (u.country IN (
36+
LEFT JOIN FETCH uifa.languageRequirements lr
37+
JOIN FETCH uifa.university u
38+
LEFT JOIN FETCH u.country c
39+
LEFT JOIN FETCH u.region r
40+
WHERE (c.code IN (
3741
SELECT ic.countryCode
3842
FROM InterestedCountry ic
3943
WHERE ic.siteUserId = :siteUserId
4044
)
41-
OR u.region IN (
45+
OR r.code IN (
4246
SELECT ir.regionCode
4347
FROM InterestedRegion ir
4448
WHERE ir.siteUserId = :siteUserId
4549
))
4650
AND uifa.term = :term
47-
""")
51+
""")
4852
List<UnivApplyInfo> findUniversityInfoForAppliesBySiteUsersInterestedCountryOrRegionAndTerm(@Param("siteUserId") Long siteUserId, @Param("term") String term);
49-
5053
@Query(value = """
51-
SELECT *
52-
FROM university_info_for_apply
53-
WHERE term = :term
54-
ORDER BY RAND()
55-
LIMIT :limitNum
56-
""", nativeQuery = true)
54+
SELECT u.*
55+
FROM university_info_for_apply u
56+
WHERE u.term = :term
57+
ORDER BY RAND()
58+
LIMIT :limitNum
59+
""", nativeQuery = true)
5760
List<UnivApplyInfo> findRandomByTerm(@Param("term") String term, @Param("limitNum") int limitNum);
58-
5961
default UnivApplyInfo getUniversityInfoForApplyById(Long id) {
6062
return findById(id)
6163
.orElseThrow(() -> new CustomException(UNIVERSITY_INFO_FOR_APPLY_NOT_FOUND));

src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ public List<UnivApplyInfo> findByRegionCodeAndKeywords(String regionCode, List<S
4949

5050

5151
private BooleanExpression regionCodeEq(QCountry country, String regionCode) {
52-
return regionCode != null ? country.regionCode.eq(regionCode) : null;
52+
if (regionCode == null || regionCode.isEmpty()) {
53+
return Expressions.asBoolean(true).isTrue();
54+
}
55+
return country.regionCode.eq(regionCode);
5356
}
5457

5558
private BooleanExpression countryOrUniversityContainsKeyword(QCountry country, QUniversity university, List<String> keywords) {

src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22

33
import com.example.solidconnection.university.domain.UnivApplyInfo;
44
import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository;
5-
import lombok.Getter;
65
import lombok.RequiredArgsConstructor;
6+
import org.hibernate.Hibernate;
77
import org.springframework.beans.factory.annotation.Value;
8-
import org.springframework.boot.context.event.ApplicationReadyEvent;
9-
import org.springframework.context.event.EventListener;
108
import org.springframework.stereotype.Service;
9+
import org.springframework.transaction.annotation.Transactional;
1110

1211
import java.util.List;
1312

@@ -17,19 +16,24 @@
1716
@RequiredArgsConstructor
1817
public class GeneralUniversityRecommendService {
1918

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

25-
@Getter
26-
private List<UnivApplyInfo> recommendUniversities;
27-
2821
@Value("${university.term}")
2922
public String term;
3023

31-
@EventListener(ApplicationReadyEvent.class)
32-
public void init() {
33-
recommendUniversities = universityInfoForApplyRepository.findRandomByTerm(term, RECOMMEND_UNIVERSITY_NUM);
24+
@Transactional(readOnly = true) // 트랜잭션 추가
25+
public List<UnivApplyInfo> getRecommendUniversities() {
26+
List<UnivApplyInfo> universities = universityInfoForApplyRepository.findRandomByTerm(term, RECOMMEND_UNIVERSITY_NUM);
27+
28+
universities.forEach(univ -> {
29+
Hibernate.initialize(univ.getLanguageRequirements());
30+
Hibernate.initialize(univ.getUniversity());
31+
if (univ.getUniversity() != null) {
32+
Hibernate.initialize(univ.getUniversity().getCountry());
33+
Hibernate.initialize(univ.getUniversity().getRegion());
34+
}
35+
});
36+
37+
return universities;
3438
}
3539
}

src/test/java/com/example/solidconnection/university/service/GeneralUniversityRecommendServiceTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ void setUp() {
4040
univApplyInfoFixture.그라츠공과대학_지원_정보();
4141
univApplyInfoFixture.린츠_카톨릭대학_지원_정보();
4242
univApplyInfoFixture.메이지대학_지원_정보();
43-
generalUniversityRecommendService.init();
4443
}
4544

4645
@Test

src/test/java/com/example/solidconnection/university/service/UniversityRecommendServiceTest.java

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ void setUp() {
7272
univApplyInfoFixture.그라츠공과대학_지원_정보();
7373
univApplyInfoFixture.린츠_카톨릭대학_지원_정보();
7474
univApplyInfoFixture.메이지대학_지원_정보();
75-
generalUniversityRecommendService.init();
7675
}
7776

7877
@Test
@@ -136,18 +135,16 @@ void setUp() {
136135
@Test
137136
void 관심사_미설정_사용자는_일반_추천_대학을_조회한다() {
138137
// when
139-
UniversityRecommendsResponse response = universityRecommendService.getPersonalRecommends(user);
138+
UniversityRecommendsResponse personalResponse = universityRecommendService.getPersonalRecommends(user);
139+
UniversityRecommendsResponse generalResponse = universityRecommendService.getGeneralRecommends();
140140

141141
// then
142-
assertThat(response.recommendedUniversities())
142+
assertThat(personalResponse.recommendedUniversities())
143143
.hasSize(RECOMMEND_UNIVERSITY_NUM)
144-
.containsExactlyInAnyOrderElementsOf(
145-
generalUniversityRecommendService.getRecommendUniversities().stream()
146-
.map(UniversityInfoForApplyPreviewResponse::from)
147-
.toList()
148-
);
144+
.containsExactlyInAnyOrderElementsOf(generalResponse.recommendedUniversities());
149145
}
150146

147+
151148
@Test
152149
void 일반_추천_대학을_조회한다() {
153150
// when
@@ -156,10 +153,7 @@ void setUp() {
156153
// then
157154
assertThat(response.recommendedUniversities())
158155
.hasSize(RECOMMEND_UNIVERSITY_NUM)
159-
.containsExactlyInAnyOrderElementsOf(
160-
generalUniversityRecommendService.getRecommendUniversities().stream()
161-
.map(UniversityInfoForApplyPreviewResponse::from)
162-
.toList()
163-
);
156+
.allMatch(univ -> univ.id() > 0)
157+
.allMatch(univ -> univ.koreanName() != null);
164158
}
165159
}

0 commit comments

Comments
 (0)