Skip to content

Commit db0287f

Browse files
authored
refactor: 대학 검색 응답 수정 (#624)
* refactor: home_university와 university_info_for_apply가 FK 관계를 가지도록 * chore: FK 변경에 따른 목데이터 수정 * refactor: 필터 검색 엔드포인트 삭제 * refactor: 필터 검색 관련 서비스 로직 삭제 * refactor: 필터 검색 관련 레포지토리 메서드 삭제 * refactor: 필터 검색 관련 DTO 삭제 * test: 필터 검색 관련 테스트 코드 삭제 * refactor: 지원 대학 관련 응답에 협정 대학 이름 추가 * test: 지원 대학 응답 수정에 따른 테스트 수정 * refactor: 간접 참조 대신 연관관계 추가 - N+1 방지를 위해 fetch join도 추가 * test: 간접 참조 방식에서 연관 관계 설정으로 따른 테스트 코드 수정 * chore: 목데이터에서 지원 대학 테이블에 협정 대학 ID를 설정하도록 * test: home university fixture 추가 * refactor: home university에 대한 fetch join 추가
1 parent 949d3d9 commit db0287f

19 files changed

Lines changed: 165 additions & 259 deletions

src/main/java/com/example/solidconnection/university/controller/UnivApplyInfoController.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,17 @@
33
import com.example.solidconnection.common.resolver.AuthorizedUser;
44
import com.example.solidconnection.university.dto.IsLikeResponse;
55
import com.example.solidconnection.university.dto.UnivApplyInfoDetailResponse;
6-
import com.example.solidconnection.university.dto.UnivApplyInfoFilterSearchRequest;
76
import com.example.solidconnection.university.dto.UnivApplyInfoPreviewResponse;
87
import com.example.solidconnection.university.dto.UnivApplyInfoPreviewResponses;
98
import com.example.solidconnection.university.dto.UnivApplyInfoRecommendsResponse;
109
import com.example.solidconnection.university.service.LikedUnivApplyInfoService;
1110
import com.example.solidconnection.university.service.UnivApplyInfoQueryService;
1211
import com.example.solidconnection.university.service.UnivApplyInfoRecommendService;
13-
import jakarta.validation.Valid;
1412
import java.util.List;
1513
import lombok.RequiredArgsConstructor;
1614
import org.springframework.http.ResponseEntity;
1715
import org.springframework.web.bind.annotation.DeleteMapping;
1816
import org.springframework.web.bind.annotation.GetMapping;
19-
import org.springframework.web.bind.annotation.ModelAttribute;
2017
import org.springframework.web.bind.annotation.PathVariable;
2118
import org.springframework.web.bind.annotation.PostMapping;
2219
import org.springframework.web.bind.annotation.RequestMapping;
@@ -87,14 +84,6 @@ public ResponseEntity<UnivApplyInfoDetailResponse> getUnivApplyInfoDetails(
8784
return ResponseEntity.ok(univApplyInfoDetailResponse);
8885
}
8986

90-
@GetMapping("/search/filter")
91-
public ResponseEntity<UnivApplyInfoPreviewResponses> searchUnivApplyInfoByFilter(
92-
@Valid @ModelAttribute UnivApplyInfoFilterSearchRequest request
93-
) {
94-
UnivApplyInfoPreviewResponses response = univApplyInfoQueryService.searchUnivApplyInfoByFilter(request);
95-
return ResponseEntity.ok(response);
96-
}
97-
9887
@GetMapping("/search/text")
9988
public ResponseEntity<UnivApplyInfoPreviewResponses> searchUnivApplyInfoByText(
10089
@RequestParam(required = false) String value

src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import jakarta.persistence.GeneratedValue;
1111
import jakarta.persistence.GenerationType;
1212
import jakarta.persistence.Id;
13+
import jakarta.persistence.JoinColumn;
1314
import jakarta.persistence.ManyToOne;
1415
import jakarta.persistence.OneToMany;
1516
import jakarta.persistence.Table;
@@ -36,8 +37,9 @@ public class UnivApplyInfo extends BaseEntity {
3637
@Column(nullable = false, name = "term_id")
3738
private long termId;
3839

39-
@Column(name = "home_university_id")
40-
private Long homeUniversityId;
40+
@ManyToOne(fetch = FetchType.LAZY)
41+
@JoinColumn(name = "home_university_id")
42+
private HomeUniversity homeUniversity;
4143

4244
@Column(nullable = false, length = 100)
4345
private String koreanName;

src/main/java/com/example/solidconnection/university/dto/UnivApplyInfoFilterSearchRequest.java

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/main/java/com/example/solidconnection/university/dto/UnivApplyInfoPreviewResponse.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,30 @@ public record UnivApplyInfoPreviewResponse(
99
long id,
1010
String term,
1111
String koreanName,
12+
String homeUniversityName,
1213
String region,
1314
String country,
1415
String logoImageUrl,
1516
String backgroundImageUrl,
1617
int studentCapacity,
1718
List<LanguageRequirementResponse> languageRequirements) {
1819

19-
public static UnivApplyInfoPreviewResponse from(UnivApplyInfo univApplyInfo, String termName) {
20+
public static UnivApplyInfoPreviewResponse of(UnivApplyInfo univApplyInfo, String termName) {
2021
List<LanguageRequirementResponse> languageRequirementResponses = new ArrayList<>(
2122
univApplyInfo.getLanguageRequirements().stream()
2223
.map(LanguageRequirementResponse::from)
2324
.toList());
2425
Collections.sort(languageRequirementResponses);
2526

27+
String homeUniversityName = univApplyInfo.getHomeUniversity() != null
28+
? univApplyInfo.getHomeUniversity().getName()
29+
: null;
30+
2631
return new UnivApplyInfoPreviewResponse(
2732
univApplyInfo.getId(),
2833
termName,
2934
univApplyInfo.getKoreanName(),
35+
homeUniversityName,
3036
univApplyInfo.getUniversity().getRegion().getKoreanName(),
3137
univApplyInfo.getUniversity().getCountry().getKoreanName(),
3238
univApplyInfo.getUniversity().getLogoImageUrl(),
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.example.solidconnection.university.repository;
2+
3+
import com.example.solidconnection.university.domain.HomeUniversity;
4+
import java.util.List;
5+
import java.util.Optional;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
8+
public interface HomeUniversityRepository extends JpaRepository<HomeUniversity, Long> {
9+
10+
List<HomeUniversity> findAllByIdIn(List<Long> ids);
11+
12+
Optional<HomeUniversity> findByName(String name);
13+
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,13 @@ public interface LikedUnivApplyInfoRepository extends JpaRepository<LikedUnivApp
1717
Optional<LikedUnivApplyInfo> findBySiteUserIdAndUnivApplyInfoId(long siteUserId, long univApplyInfoId);
1818

1919
@Query("""
20-
SELECT u
20+
SELECT DISTINCT u
2121
FROM UnivApplyInfo u
22+
LEFT JOIN FETCH u.languageRequirements lr
23+
LEFT JOIN FETCH u.homeUniversity hu
24+
LEFT JOIN FETCH u.university univ
25+
LEFT JOIN FETCH univ.country c
26+
LEFT JOIN FETCH univ.region r
2227
JOIN LikedUnivApplyInfo l ON u.id = l.univApplyInfoId
2328
WHERE l.siteUserId = :siteUserId
2429
""")

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public interface UnivApplyInfoRepository extends JpaRepository<UnivApplyInfo, Lo
1919
SELECT DISTINCT uai
2020
FROM UnivApplyInfo uai
2121
LEFT JOIN FETCH uai.languageRequirements lr
22+
LEFT JOIN FETCH uai.homeUniversity hu
2223
JOIN FETCH uai.university u
2324
LEFT JOIN FETCH u.country c
2425
LEFT JOIN FETCH u.region r
@@ -40,6 +41,7 @@ OR r.code IN (
4041
SELECT uai
4142
FROM UnivApplyInfo uai
4243
LEFT JOIN FETCH uai.languageRequirements lr
44+
LEFT JOIN FETCH uai.homeUniversity hu
4345
LEFT JOIN FETCH uai.university u
4446
LEFT JOIN FETCH u.country c
4547
LEFT JOIN FETCH u.region r
@@ -57,6 +59,7 @@ default UnivApplyInfo getUnivApplyInfoById(Long id) {
5759
SELECT DISTINCT uai
5860
FROM UnivApplyInfo uai
5961
LEFT JOIN FETCH uai.languageRequirements lr
62+
LEFT JOIN FETCH uai.homeUniversity hu
6063
LEFT JOIN FETCH uai.university u
6164
LEFT JOIN FETCH u.country c
6265
LEFT JOIN FETCH u.region r
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package com.example.solidconnection.university.repository.custom;
22

3-
import com.example.solidconnection.university.domain.LanguageTestType;
43
import com.example.solidconnection.university.domain.UnivApplyInfo;
54
import java.util.List;
65

76
public interface UnivApplyInfoFilterRepository {
87

98
List<UnivApplyInfo> findAllByRegionCodeAndKeywordsAndTermId(String regionCode, List<String> keywords, Long term);
109

11-
List<UnivApplyInfo> findAllByFilter(LanguageTestType testType, String testScore, Long termId, List<String> countryKoreanNames);
12-
1310
List<UnivApplyInfo> findAllByText(String text, Long termId);
1411
}

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

Lines changed: 6 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
import com.example.solidconnection.location.country.domain.QCountry;
44
import com.example.solidconnection.location.region.domain.QRegion;
5-
import com.example.solidconnection.university.domain.LanguageTestType;
5+
import com.example.solidconnection.university.domain.QHomeUniversity;
6+
import com.example.solidconnection.university.domain.QHostUniversity;
67
import com.example.solidconnection.university.domain.QLanguageRequirement;
78
import com.example.solidconnection.university.domain.QUnivApplyInfo;
8-
import com.example.solidconnection.university.domain.QHostUniversity;
99
import com.example.solidconnection.university.domain.UnivApplyInfo;
1010
import com.querydsl.core.BooleanBuilder;
1111
import com.querydsl.core.types.dsl.BooleanExpression;
@@ -34,13 +34,15 @@ public UnivApplyInfoFilterRepositoryImpl(EntityManager em) {
3434
public List<UnivApplyInfo> findAllByRegionCodeAndKeywordsAndTermId(String regionCode, List<String> keywords, Long termId) {
3535
QUnivApplyInfo univApplyInfo = QUnivApplyInfo.univApplyInfo;
3636
QHostUniversity university = QHostUniversity.hostUniversity;
37+
QHomeUniversity homeUniversity = QHomeUniversity.homeUniversity;
3738
QCountry country = QCountry.country;
3839
QLanguageRequirement languageRequirement = QLanguageRequirement.languageRequirement;
3940

4041
return queryFactory
4142
.selectFrom(univApplyInfo)
4243
.join(univApplyInfo.university, university).fetchJoin()
4344
.join(university.country, country).fetchJoin()
45+
.leftJoin(univApplyInfo.homeUniversity, homeUniversity).fetchJoin()
4446
.leftJoin(univApplyInfo.languageRequirements, languageRequirement).fetchJoin()
4547
.where(
4648
regionCodeEq(country, regionCode)
@@ -74,79 +76,18 @@ private BooleanExpression createKeywordCondition(StringPath namePath, List<Strin
7476
.orElse(Expressions.FALSE);
7577
}
7678

77-
@Override
78-
public List<UnivApplyInfo> findAllByFilter(
79-
LanguageTestType testType, String testScore, Long termId, List<String> countryCodes
80-
) {
81-
QHostUniversity university = QHostUniversity.hostUniversity;
82-
QUnivApplyInfo univApplyInfo = QUnivApplyInfo.univApplyInfo;
83-
QCountry country = QCountry.country;
84-
QLanguageRequirement languageRequirement = QLanguageRequirement.languageRequirement;
85-
86-
List<UnivApplyInfo> filteredUnivApplyInfo = queryFactory.selectFrom(univApplyInfo)
87-
.join(univApplyInfo.university, university)
88-
.join(university.country, country)
89-
.join(univApplyInfo.languageRequirements, languageRequirement)
90-
.fetchJoin()
91-
.where(
92-
languageTestTypeEq(languageRequirement, testType),
93-
termIdEq(univApplyInfo, termId),
94-
countryCodesIn(country, countryCodes)
95-
)
96-
.distinct()
97-
.fetch();
98-
99-
if (testScore == null || testScore.isBlank()) {
100-
return filteredUnivApplyInfo;
101-
}
102-
103-
/*
104-
* 시험 유형에 따라 성적 비교 방식이 다르다.
105-
* 입력된 점수가 대학에서 요구하는 최소 점수보다 높은지를 '쿼리로' 비교하기엔 쿼리가 지나치게 복잡해진다.
106-
* 따라서 이 부분만 자바 코드로 필터링한다.
107-
* */
108-
return filteredUnivApplyInfo.stream()
109-
.filter(uai -> isGivenScoreOverMinPassScore(uai, testType, testScore))
110-
.toList();
111-
}
112-
113-
private BooleanExpression languageTestTypeEq(
114-
QLanguageRequirement languageRequirement, LanguageTestType givenTestType
115-
) {
116-
if (givenTestType == null) {
117-
return null;
118-
}
119-
return languageRequirement.languageTestType.eq(givenTestType);
120-
}
121-
12279
private BooleanExpression termIdEq(QUnivApplyInfo univApplyInfo, Long givenTermId) {
12380
if (givenTermId == null) {
12481
return null;
12582
}
12683
return univApplyInfo.termId.eq(givenTermId);
12784
}
12885

129-
private BooleanExpression countryCodesIn(QCountry country, List<String> givenCountryCodes) {
130-
if (givenCountryCodes == null || givenCountryCodes.isEmpty()) {
131-
return null;
132-
}
133-
return country.code.in(givenCountryCodes);
134-
}
135-
136-
private boolean isGivenScoreOverMinPassScore(
137-
UnivApplyInfo univApplyInfo, LanguageTestType givenTestType, String givenTestScore
138-
) {
139-
return univApplyInfo.getLanguageRequirements().stream()
140-
.filter(languageRequirement -> languageRequirement.getLanguageTestType().equals(givenTestType))
141-
.findFirst()
142-
.map(requirement -> givenTestType.compare(givenTestScore, requirement.getMinScore()))
143-
.orElse(-1) >= 0;
144-
}
145-
14686
@Override
14787
public List<UnivApplyInfo> findAllByText(String text, Long termId) {
14888
QUnivApplyInfo univApplyInfo = QUnivApplyInfo.univApplyInfo;
14989
QHostUniversity university = QHostUniversity.hostUniversity;
90+
QHomeUniversity homeUniversity = QHomeUniversity.homeUniversity;
15091
QLanguageRequirement languageRequirement = QLanguageRequirement.languageRequirement;
15192
QCountry country = QCountry.country;
15293
QRegion region = QRegion.region;
@@ -155,6 +96,7 @@ public List<UnivApplyInfo> findAllByText(String text, Long termId) {
15596
.join(univApplyInfo.university, university).fetchJoin()
15697
.join(university.country, country).fetchJoin()
15798
.join(region).on(country.regionCode.eq(region.code))
99+
.leftJoin(univApplyInfo.homeUniversity, homeUniversity).fetchJoin()
158100
.leftJoin(univApplyInfo.languageRequirements, languageRequirement).fetchJoin()
159101
.where(termIdEq(univApplyInfo, termId));
160102

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import java.util.Set;
1919
import java.util.stream.Collectors;
2020
import lombok.RequiredArgsConstructor;
21-
import org.springframework.beans.factory.annotation.Value;
2221
import org.springframework.stereotype.Service;
2322
import org.springframework.transaction.annotation.Transactional;
2423

@@ -46,7 +45,7 @@ public List<UnivApplyInfoPreviewResponse> getLikedUnivApplyInfos(long siteUserId
4645
return univApplyInfos.stream()
4746
.map(univApplyInfo -> {
4847
String termName = termMap.getOrDefault(univApplyInfo.getTermId(), "Unknown");
49-
return UnivApplyInfoPreviewResponse.from(univApplyInfo, termName);
48+
return UnivApplyInfoPreviewResponse.of(univApplyInfo, termName);
5049
})
5150
.toList();
5251
}

0 commit comments

Comments
 (0)