Skip to content

Commit 0144cb2

Browse files
authored
refactor: University 도메인 리팩터링 (#338)
* refactor: rename UniversityInfoForApply to UnivApplyInfo - 엔티티명만 변경, 이에 따른 변수명 변경 * fix: 동일한 사용자가 동일한 대학 좋아요가 가능했던 문제 수정 - 복합 unique 제약 조건 추가, 관련 테스트 코드 추가 * refactor: liked_university 테이블에 복합 unique 제약 조건을 설정하는 sql 작성 * refactor: 파일 및 변수명 변경 * chore: 미사용 함수 제거 * chore: UK 제약 조건 이름 변경 * chore: 테스트 코드에서 불필요한 검증 제거 * chore: 마이그레이션 파일 버전 수정 V14 -> V15
1 parent af2ba81 commit 0144cb2

35 files changed

+350
-260
lines changed

src/main/java/com/example/solidconnection/application/dto/UniversityApplicantsResponse.java

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

33
import com.example.solidconnection.application.domain.Application;
44
import com.example.solidconnection.siteuser.domain.SiteUser;
5-
import com.example.solidconnection.university.domain.UniversityInfoForApply;
5+
import com.example.solidconnection.university.domain.UnivApplyInfo;
66

77
import java.util.List;
88

@@ -12,12 +12,12 @@ public record UniversityApplicantsResponse(
1212
String region,
1313
String country,
1414
List<ApplicantResponse> applicants) {
15-
public static UniversityApplicantsResponse of(UniversityInfoForApply universityInfoForApply, List<Application> applications, SiteUser siteUser) {
15+
public static UniversityApplicantsResponse of(UnivApplyInfo univApplyInfo, List<Application> applications, SiteUser siteUser) {
1616
return new UniversityApplicantsResponse(
17-
universityInfoForApply.getKoreanName(),
18-
universityInfoForApply.getStudentCapacity(),
19-
universityInfoForApply.getUniversity().getRegion().getKoreanName(),
20-
universityInfoForApply.getUniversity().getCountry().getKoreanName(),
17+
univApplyInfo.getKoreanName(),
18+
univApplyInfo.getStudentCapacity(),
19+
univApplyInfo.getUniversity().getRegion().getKoreanName(),
20+
univApplyInfo.getUniversity().getCountry().getKoreanName(),
2121
applications.stream()
2222
.map(application -> ApplicantResponse.of(application, isUsers(application, siteUser)))
2323
.toList());

src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.example.solidconnection.application.domain.VerifyStatus;
55
import com.example.solidconnection.common.exception.CustomException;
66
import com.example.solidconnection.siteuser.domain.SiteUser;
7-
import com.example.solidconnection.university.domain.UniversityInfoForApply;
87
import org.springframework.data.jpa.repository.JpaRepository;
98
import org.springframework.data.jpa.repository.Query;
109
import org.springframework.data.repository.query.Param;

src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java

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

33
import com.example.solidconnection.application.domain.Application;
44
import com.example.solidconnection.application.domain.VerifyStatus;
5-
import com.example.solidconnection.application.dto.ApplicantResponse;
65
import com.example.solidconnection.application.dto.ApplicationsResponse;
76
import com.example.solidconnection.application.dto.UniversityApplicantsResponse;
87
import com.example.solidconnection.application.repository.ApplicationRepository;
98
import com.example.solidconnection.common.exception.CustomException;
109
import com.example.solidconnection.siteuser.domain.SiteUser;
11-
import com.example.solidconnection.university.domain.UniversityInfoForApply;
10+
import com.example.solidconnection.university.domain.UnivApplyInfo;
1211
import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository;
1312
import com.example.solidconnection.university.repository.custom.UniversityFilterRepositoryImpl;
1413
import lombok.RequiredArgsConstructor;
1514
import org.springframework.beans.factory.annotation.Value;
1615
import org.springframework.stereotype.Service;
1716
import org.springframework.transaction.annotation.Transactional;
1817

18+
import java.util.ArrayList;
19+
import java.util.HashMap;
20+
import java.util.List;
21+
import java.util.Map;
22+
import java.util.Objects;
1923
import java.util.function.Function;
2024
import java.util.stream.Collectors;
2125
import java.util.stream.Stream;
22-
import java.util.List;
23-
import java.util.Objects;
24-
import java.util.Map;
25-
import java.util.HashMap;
26-
import java.util.ArrayList;
2726

2827
import static com.example.solidconnection.common.exception.ErrorCode.APPLICATION_NOT_APPROVED;
2928

@@ -42,13 +41,13 @@ public class ApplicationQueryService {
4241
@Transactional(readOnly = true)
4342
public ApplicationsResponse getApplicants(SiteUser siteUser, String regionCode, String keyword) {
4443
// 1. 대학 지원 정보 필터링 (regionCode, keyword)
45-
List<UniversityInfoForApply> univApplyInfos = universityFilterRepository.findByRegionCodeAndKeywords(regionCode, List.of(keyword));
44+
List<UnivApplyInfo> univApplyInfos = universityFilterRepository.findByRegionCodeAndKeywords(regionCode, List.of(keyword));
4645
if (univApplyInfos.isEmpty()) {
4746
return new ApplicationsResponse(List.of(), List.of(), List.of());
4847
}
4948
// 2. 조건에 맞는 모든 Application 한 번에 조회
5049
List<Long> univApplyInfoIds = univApplyInfos.stream()
51-
.map(UniversityInfoForApply::getId)
50+
.map(UnivApplyInfo::getId)
5251
.toList();
5352
List<Application> applications = applicationRepository.findAllByUnivApplyInfoIds(univApplyInfoIds, VerifyStatus.APPROVED, term);
5453
// 3. 지원서 분류 및 DTO 변환
@@ -72,13 +71,13 @@ public ApplicationsResponse getApplicantsByUserApplications(SiteUser siteUser) {
7271
}
7372

7473
List<Application> applications = applicationRepository.findAllByUnivApplyInfoIds(universityInfoForApplyIds, VerifyStatus.APPROVED, term);
75-
List<UniversityInfoForApply> universityInfosForApply = universityInfoForApplyRepository.findAllByUniversityIds(universityInfoForApplyIds);
74+
List<UnivApplyInfo> universityInfosForApply = universityInfoForApplyRepository.findAllByUniversityIds(universityInfoForApplyIds);
7675

7776
return classifyApplicationsByChoice(universityInfosForApply, applications, siteUser);
7877
}
7978

8079
private ApplicationsResponse classifyApplicationsByChoice(
81-
List<UniversityInfoForApply> universityInfosForApply,
80+
List<UnivApplyInfo> universityInfosForApply,
8281
List<Application> applications,
8382
SiteUser siteUser) {
8483
Map<Long, List<Application>> firstChoiceMap = createChoiceMap(applications, Application::getFirstChoiceUnivApplyInfoId);
@@ -111,7 +110,7 @@ private Map<Long, List<Application>> createChoiceMap(
111110
}
112111

113112
private List<UniversityApplicantsResponse> createUniversityApplicantsResponses(
114-
List<UniversityInfoForApply> universityInfosForApply,
113+
List<UnivApplyInfo> universityInfosForApply,
115114
Map<Long, List<Application>> choiceMap,
116115
SiteUser siteUser) {
117116
return universityInfosForApply.stream()

src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import com.example.solidconnection.score.repository.GpaScoreRepository;
1313
import com.example.solidconnection.score.repository.LanguageTestScoreRepository;
1414
import com.example.solidconnection.siteuser.domain.SiteUser;
15-
import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository;
1615
import lombok.RequiredArgsConstructor;
1716
import org.springframework.beans.factory.annotation.Value;
1817
import org.springframework.stereotype.Service;
@@ -33,7 +32,6 @@ public class ApplicationSubmissionService {
3332
public static final int APPLICATION_UPDATE_COUNT_LIMIT = 3;
3433

3534
private final ApplicationRepository applicationRepository;
36-
private final UniversityInfoForApplyRepository universityInfoForApplyRepository;
3735
private final GpaScoreRepository gpaScoreRepository;
3836
private final LanguageTestScoreRepository languageTestScoreRepository;
3937

src/main/java/com/example/solidconnection/siteuser/repository/LikedUniversityRepository.java

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

33
import com.example.solidconnection.siteuser.domain.SiteUser;
44
import com.example.solidconnection.university.domain.LikedUniversity;
5-
import com.example.solidconnection.university.domain.UniversityInfoForApply;
5+
import com.example.solidconnection.university.domain.UnivApplyInfo;
66
import org.springframework.data.jpa.repository.JpaRepository;
77

88
import java.util.List;
@@ -14,5 +14,5 @@ public interface LikedUniversityRepository extends JpaRepository<LikedUniversity
1414

1515
int countBySiteUser_Id(long siteUserId);
1616

17-
Optional<LikedUniversity> findBySiteUserAndUniversityInfoForApply(SiteUser siteUser, UniversityInfoForApply universityInfoForApply);
17+
Optional<LikedUniversity> findBySiteUserAndUnivApplyInfo(SiteUser siteUser, UnivApplyInfo univApplyInfo);
1818
}

src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ private boolean isDefaultProfileImage(String profileImageUrl) {
9797
public List<UniversityInfoForApplyPreviewResponse> getWishUniversity(SiteUser siteUser) {
9898
List<LikedUniversity> likedUniversities = likedUniversityRepository.findAllBySiteUser_Id(siteUser.getId());
9999
return likedUniversities.stream()
100-
.map(likedUniversity -> UniversityInfoForApplyPreviewResponse.from(likedUniversity.getUniversityInfoForApply()))
100+
.map(likedUniversity -> UniversityInfoForApplyPreviewResponse.from(likedUniversity.getUnivApplyInfo()))
101101
.toList();
102102
}
103103
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import jakarta.persistence.GeneratedValue;
99
import jakarta.persistence.GenerationType;
1010
import jakarta.persistence.Id;
11+
import jakarta.persistence.JoinColumn;
1112
import jakarta.persistence.ManyToOne;
1213
import lombok.AccessLevel;
1314
import lombok.AllArgsConstructor;
@@ -32,5 +33,6 @@ public class LanguageRequirement {
3233
private String minScore;
3334

3435
@ManyToOne(fetch = FetchType.LAZY)
35-
private UniversityInfoForApply universityInfoForApply;
36+
@JoinColumn(name = "university_info_for_apply_id")
37+
private UnivApplyInfo univApplyInfo;
3638
}

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
import jakarta.persistence.GeneratedValue;
66
import jakarta.persistence.GenerationType;
77
import jakarta.persistence.Id;
8+
import jakarta.persistence.JoinColumn;
89
import jakarta.persistence.ManyToOne;
10+
import jakarta.persistence.Table;
11+
import jakarta.persistence.UniqueConstraint;
912
import lombok.AllArgsConstructor;
1013
import lombok.Builder;
1114
import lombok.Getter;
@@ -16,14 +19,21 @@
1619
@Builder
1720
@AllArgsConstructor
1821
@NoArgsConstructor
22+
@Table(uniqueConstraints = {
23+
@UniqueConstraint(
24+
name = "uk_liked_university_site_user_id_university_info_for_apply_id",
25+
columnNames = {"site_user_id", "university_info_for_apply_id"}
26+
)
27+
})
1928
public class LikedUniversity {
2029

2130
@Id
2231
@GeneratedValue(strategy = GenerationType.IDENTITY)
2332
private Long id;
2433

2534
@ManyToOne
26-
private UniversityInfoForApply universityInfoForApply;
35+
@JoinColumn(name = "university_info_for_apply_id")
36+
private UnivApplyInfo univApplyInfo;
2737

2838
@ManyToOne
2939
private SiteUser siteUser;

src/main/java/com/example/solidconnection/university/domain/UniversityInfoForApply.java renamed to 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.Id;
1111
import jakarta.persistence.ManyToOne;
1212
import jakarta.persistence.OneToMany;
13+
import jakarta.persistence.Table;
1314
import lombok.AccessLevel;
1415
import lombok.AllArgsConstructor;
1516
import lombok.EqualsAndHashCode;
@@ -24,7 +25,8 @@
2425
@AllArgsConstructor(access = AccessLevel.PUBLIC)
2526
@NoArgsConstructor(access = AccessLevel.PROTECTED)
2627
@Entity
27-
public class UniversityInfoForApply {
28+
@Table(name = "university_info_for_apply")
29+
public class UnivApplyInfo {
2830

2931
@Id
3032
@GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -74,7 +76,7 @@ public class UniversityInfoForApply {
7476
@Column(length = 1000)
7577
private String details;
7678

77-
@OneToMany(mappedBy = "universityInfoForApply", fetch = FetchType.EAGER)
79+
@OneToMany(mappedBy = "univApplyInfo", fetch = FetchType.EAGER)
7880
private Set<LanguageRequirement> languageRequirements = new HashSet<>();
7981

8082
@ManyToOne(fetch = FetchType.EAGER)

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.example.solidconnection.university.dto;
22

33
import com.example.solidconnection.university.domain.University;
4-
import com.example.solidconnection.university.domain.UniversityInfoForApply;
4+
import com.example.solidconnection.university.domain.UnivApplyInfo;
55

66
import java.util.List;
77

@@ -35,11 +35,11 @@ public record UniversityDetailResponse(
3535

3636
public static UniversityDetailResponse of(
3737
University university,
38-
UniversityInfoForApply universityInfoForApply) {
38+
UnivApplyInfo univApplyInfo) {
3939
return new UniversityDetailResponse(
40-
universityInfoForApply.getId(),
41-
universityInfoForApply.getTerm(),
42-
universityInfoForApply.getKoreanName(),
40+
univApplyInfo.getId(),
41+
univApplyInfo.getTerm(),
42+
univApplyInfo.getKoreanName(),
4343
university.getEnglishName(),
4444
university.getFormatName(),
4545
university.getRegion().getKoreanName(),
@@ -48,21 +48,21 @@ public static UniversityDetailResponse of(
4848
university.getLogoImageUrl(),
4949
university.getBackgroundImageUrl(),
5050
university.getDetailsForLocal(),
51-
universityInfoForApply.getStudentCapacity(),
52-
universityInfoForApply.getTuitionFeeType().getKoreanName(),
53-
universityInfoForApply.getSemesterAvailableForDispatch().getKoreanName(),
54-
universityInfoForApply.getLanguageRequirements().stream()
51+
univApplyInfo.getStudentCapacity(),
52+
univApplyInfo.getTuitionFeeType().getKoreanName(),
53+
univApplyInfo.getSemesterAvailableForDispatch().getKoreanName(),
54+
univApplyInfo.getLanguageRequirements().stream()
5555
.map(LanguageRequirementResponse::from)
5656
.toList(),
57-
universityInfoForApply.getDetailsForLanguage(),
58-
universityInfoForApply.getGpaRequirement(),
59-
universityInfoForApply.getGpaRequirementCriteria(),
60-
universityInfoForApply.getSemesterRequirement(),
61-
universityInfoForApply.getDetailsForApply(),
62-
universityInfoForApply.getDetailsForMajor(),
63-
universityInfoForApply.getDetailsForAccommodation(),
64-
universityInfoForApply.getDetailsForEnglishCourse(),
65-
universityInfoForApply.getDetails(),
57+
univApplyInfo.getDetailsForLanguage(),
58+
univApplyInfo.getGpaRequirement(),
59+
univApplyInfo.getGpaRequirementCriteria(),
60+
univApplyInfo.getSemesterRequirement(),
61+
univApplyInfo.getDetailsForApply(),
62+
univApplyInfo.getDetailsForMajor(),
63+
univApplyInfo.getDetailsForAccommodation(),
64+
univApplyInfo.getDetailsForEnglishCourse(),
65+
univApplyInfo.getDetails(),
6666
university.getAccommodationUrl(),
6767
university.getEnglishCourseUrl()
6868
);

0 commit comments

Comments
 (0)