Skip to content

Commit a14a510

Browse files
authored
refactor: application 도메인 리팩터링 (#330)
* refactor: Application Entity 변경 - UniversityInfoForApply FK매핑 삭제 및 Long타입으로 변경, 네이밍 변경 - 사용하지 않는 updateUniversityChoice 메서드 제거 * refactor: ApplicationQueryService 변경 - AS-IS: 각 지망별로 Repository를 호출하여 N+1 문제 발생 단일키 임시 캐싱 - TO-BE: 매핑 제거 후 직접 데이터를 분류하여 N+1문제 제거 및 성능 향상 캐싱 제거 * refactor: University관련 Repository 변경 - AS-IS: 기존 Repository에서 University타입으로 반환 - TO-BE: Entity변경, 비즈니스 로직 변환에 맞춰 반환타입 Long으로 수정 findByIdsWithUniversityAndLocation 메서드 추가 사용하지 않게 된 getUniversityInfoForApplyByIdAndTerm 메서드 삭제 * refactor: ApplicationRepository 변경 - 서비스 로직 변경을 위해 3개로 분리되어 있는 기존 메서드를 한 번의 쿼리로 조회하도록 변경 * refactor: ApplicationSubmissionService 변경 - Entity변경에 따른 수정. 기존 로직은 변화 없음 * refactor: ApplicationTest코드 수정 - Entity변경에 따른 수정 - 전원 통과 - ApplicationQueryService 마지막 메서드 테스트 의도에 맞게 수정 * refactor: ApplicationTest코드 수정 - UniversityInfoForApplyId 하드코딩 되어있는 부분 수정 - 테스트 통과 확인 * refactor: 테스트 코드 제외 코드 리뷰 수정사항 반영 - 코드 컨벤션 통일 - 변수명 이해하기 쉽도록 수정 - Application Repository universityId기반과 uiaId기반으로 분기 * refactor: ApplicationTest코드 수정 - 마지막 메서드 테스트 의도에 맞게 수정 - 컨벤션에 맞게 수정 - BaseIntegrationTest에서 firstUIAId에 null값을 입력하는 부분 수정 * refactor: Application Entity Index 추가 - 조회 성능 향상을 위해 Application Entity Index추가 - Application Repository 불필요한 공백 삭제 * refactor: Flyway V13 script 등록 - Application FK제약조건 제거 - column명 변경 - Index 추가 * refactor: 테스트 코드 제외 코드 리뷰 수정사항 반영 - 가벼운 수정 사항(공백 삭제 및 함수 명 변경) - Application Column명 수정 - 쿼리 간결화 - DTO에 매핑책임 이관 * refactor: 테스트 코드 수정 및 Flyway 수정 - 테스트 코드 데이터 형식 수정 - Flyway Column명 수정 * refactor: Flyway V13 FK제약조건 유지로 변경
1 parent 3d5820c commit a14a510

File tree

13 files changed

+283
-238
lines changed

13 files changed

+283
-238
lines changed
Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.example.solidconnection.application.domain;
22

33
import com.example.solidconnection.siteuser.domain.SiteUser;
4-
import com.example.solidconnection.university.domain.UniversityInfoForApply;
54
import jakarta.persistence.Column;
65
import jakarta.persistence.Embedded;
76
import jakarta.persistence.Entity;
@@ -11,7 +10,9 @@
1110
import jakarta.persistence.GeneratedValue;
1211
import jakarta.persistence.GenerationType;
1312
import jakarta.persistence.Id;
13+
import jakarta.persistence.Index;
1414
import jakarta.persistence.ManyToOne;
15+
import jakarta.persistence.Table;
1516
import lombok.Getter;
1617
import lombok.NoArgsConstructor;
1718
import lombok.Setter;
@@ -25,6 +26,16 @@
2526
@DynamicUpdate
2627
@DynamicInsert
2728
@Entity
29+
@Table(indexes = {
30+
@Index(name = "idx_app_user_term_delete",
31+
columnList = "site_user_id, term, is_delete"),
32+
@Index(name = "idx_app_first_choice_search",
33+
columnList = "verify_status, term, is_delete, first_choice_university_info_for_apply_id"),
34+
@Index(name = "idx_app_second_choice_search",
35+
columnList = "verify_status, term, is_delete, second_choice_university_info_for_apply_id"),
36+
@Index(name = "idx_app_third_choice_search",
37+
columnList = "verify_status, term, is_delete, third_choice_university_info_for_apply_id")
38+
})
2839
public class Application {
2940

3041
@Id
@@ -38,30 +49,30 @@ public class Application {
3849
private LanguageTest languageTest;
3950

4051
@Setter
41-
@Column(columnDefinition = "varchar(50) not null default 'PENDING'")
52+
@Column(columnDefinition = "varchar(50) not null default 'PENDING'", name="verify_status")
4253
@Enumerated(EnumType.STRING)
4354
private VerifyStatus verifyStatus;
4455

45-
@Column(length = 100)
56+
@Column(length = 100, name="nickname_for_apply")
4657
private String nicknameForApply;
4758

48-
@Column(columnDefinition = "int not null default 1")
59+
@Column(columnDefinition = "int not null default 1", name="update_count")
4960
private Integer updateCount;
5061

51-
@Column(length = 50, nullable = false)
62+
@Column(length = 50, nullable = false, name="term")
5263
private String term;
5364

54-
@Column
65+
@Column(name="is_delete")
5566
private boolean isDelete = false;
5667

57-
@ManyToOne(fetch = FetchType.LAZY)
58-
private UniversityInfoForApply firstChoiceUniversity;
68+
@Column(nullable = false , name = "first_choice_university_info_for_apply_id")
69+
private long firstChoiceUnivApplyInfoId;
5970

60-
@ManyToOne(fetch = FetchType.LAZY)
61-
private UniversityInfoForApply secondChoiceUniversity;
71+
@Column(name = "second_choice_university_info_for_apply_id")
72+
private Long secondChoiceUnivApplyInfoId;
6273

63-
@ManyToOne(fetch = FetchType.LAZY)
64-
private UniversityInfoForApply thirdChoiceUniversity;
74+
@Column(name = "third_choice_university_info_for_apply_id")
75+
private Long thirdChoiceUnivApplyInfoId;
6576

6677
@ManyToOne(fetch = FetchType.LAZY)
6778
private SiteUser siteUser;
@@ -85,18 +96,18 @@ public Application(
8596
LanguageTest languageTest,
8697
String term,
8798
Integer updateCount,
88-
UniversityInfoForApply firstChoiceUniversity,
89-
UniversityInfoForApply secondChoiceUniversity,
90-
UniversityInfoForApply thirdChoiceUniversity,
99+
long firstChoiceUnivApplyInfoId,
100+
Long secondChoiceUnivApplyInfoId,
101+
Long thirdChoiceUnivApplyInfoId,
91102
String nicknameForApply) {
92103
this.siteUser = siteUser;
93104
this.gpa = gpa;
94105
this.languageTest = languageTest;
95106
this.term = term;
96107
this.updateCount = updateCount;
97-
this.firstChoiceUniversity = firstChoiceUniversity;
98-
this.secondChoiceUniversity = secondChoiceUniversity;
99-
this.thirdChoiceUniversity = thirdChoiceUniversity;
108+
this.firstChoiceUnivApplyInfoId = firstChoiceUnivApplyInfoId;
109+
this.secondChoiceUnivApplyInfoId = secondChoiceUnivApplyInfoId;
110+
this.thirdChoiceUnivApplyInfoId = thirdChoiceUnivApplyInfoId;
100111
this.nicknameForApply = nicknameForApply;
101112
this.verifyStatus = PENDING;
102113
}
@@ -106,37 +117,23 @@ public Application(
106117
Gpa gpa,
107118
LanguageTest languageTest,
108119
String term,
109-
UniversityInfoForApply firstChoiceUniversity,
110-
UniversityInfoForApply secondChoiceUniversity,
111-
UniversityInfoForApply thirdChoiceUniversity,
120+
long firstChoiceUnivApplyInfoId,
121+
Long secondChoiceUnivApplyInfoId,
122+
Long thirdChoiceUnivApplyInfoId,
112123
String nicknameForApply) {
113124
this.siteUser = siteUser;
114125
this.gpa = gpa;
115126
this.languageTest = languageTest;
116127
this.term = term;
117128
this.updateCount = 1;
118-
this.firstChoiceUniversity = firstChoiceUniversity;
119-
this.secondChoiceUniversity = secondChoiceUniversity;
120-
this.thirdChoiceUniversity = thirdChoiceUniversity;
129+
this.firstChoiceUnivApplyInfoId = firstChoiceUnivApplyInfoId;
130+
this.secondChoiceUnivApplyInfoId = secondChoiceUnivApplyInfoId;
131+
this.thirdChoiceUnivApplyInfoId = thirdChoiceUnivApplyInfoId;
121132
this.nicknameForApply = nicknameForApply;
122133
this.verifyStatus = PENDING;
123134
}
124135

125136
public void setIsDeleteTrue() {
126137
this.isDelete = true;
127138
}
128-
129-
public void updateUniversityChoice(
130-
UniversityInfoForApply firstChoiceUniversity,
131-
UniversityInfoForApply secondChoiceUniversity,
132-
UniversityInfoForApply thirdChoiceUniversity,
133-
String nicknameForApply) {
134-
if (this.firstChoiceUniversity != null) {
135-
this.updateCount++;
136-
}
137-
this.firstChoiceUniversity = firstChoiceUniversity;
138-
this.secondChoiceUniversity = secondChoiceUniversity;
139-
this.thirdChoiceUniversity = thirdChoiceUniversity;
140-
this.nicknameForApply = nicknameForApply;
141-
}
142139
}
Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.example.solidconnection.application.dto;
22

3+
import com.example.solidconnection.application.domain.Application;
4+
import com.example.solidconnection.siteuser.domain.SiteUser;
35
import com.example.solidconnection.university.domain.UniversityInfoForApply;
46

57
import java.util.List;
@@ -10,13 +12,18 @@ public record UniversityApplicantsResponse(
1012
String region,
1113
String country,
1214
List<ApplicantResponse> applicants) {
13-
14-
public static UniversityApplicantsResponse of(UniversityInfoForApply universityInfoForApply, List<ApplicantResponse> applicant) {
15+
public static UniversityApplicantsResponse of(UniversityInfoForApply universityInfoForApply, List<Application> applications, SiteUser siteUser) {
1516
return new UniversityApplicantsResponse(
1617
universityInfoForApply.getKoreanName(),
1718
universityInfoForApply.getStudentCapacity(),
1819
universityInfoForApply.getUniversity().getRegion().getKoreanName(),
1920
universityInfoForApply.getUniversity().getCountry().getKoreanName(),
20-
applicant);
21+
applications.stream()
22+
.map(application -> ApplicantResponse.of(application, isUsers(application, siteUser)))
23+
.toList());
24+
}
25+
26+
private static boolean isUsers(Application application, SiteUser siteUser) {
27+
return application.getSiteUser().getId().equals(siteUser.getId());
2128
}
2229
}

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

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,26 @@ public interface ApplicationRepository extends JpaRepository<Application, Long>
2020

2121
boolean existsByNicknameForApply(String nicknameForApply);
2222

23-
List<Application> findAllByFirstChoiceUniversityAndVerifyStatusAndTermAndIsDeleteFalse(
24-
UniversityInfoForApply firstChoiceUniversity, VerifyStatus verifyStatus, String term);
25-
26-
List<Application> findAllBySecondChoiceUniversityAndVerifyStatusAndTermAndIsDeleteFalse(
27-
UniversityInfoForApply secondChoiceUniversity, VerifyStatus verifyStatus, String term);
28-
29-
List<Application> findAllByThirdChoiceUniversityAndVerifyStatusAndTermAndIsDeleteFalse(
30-
UniversityInfoForApply thirdChoiceUniversity, VerifyStatus verifyStatus, String term);
23+
@Query("""
24+
SELECT a
25+
FROM Application a
26+
JOIN FETCH a.siteUser
27+
WHERE (a.firstChoiceUnivApplyInfoId IN :universityIds
28+
OR a.secondChoiceUnivApplyInfoId IN :universityIds
29+
OR a.thirdChoiceUnivApplyInfoId IN :universityIds)
30+
AND a.verifyStatus = :status
31+
AND a.term = :term
32+
AND a.isDelete = false
33+
""")
34+
List<Application> findAllByUnivApplyInfoIds(@Param("universityIds") List<Long> universityIds, @Param("status") VerifyStatus status, @Param("term") String term);
3135

3236
@Query("""
33-
SELECT a FROM Application a
34-
WHERE a.siteUser = :siteUser
35-
AND a.term = :term
36-
AND a.isDelete = false
37-
""")
37+
SELECT a
38+
FROM Application a
39+
WHERE a.siteUser = :siteUser
40+
AND a.term = :term
41+
AND a.isDelete = false
42+
""")
3843
Optional<Application> findBySiteUserAndTerm(@Param("siteUser") SiteUser siteUser, @Param("term") String term);
3944

4045
default Application getApplicationBySiteUserAndTerm(SiteUser siteUser, String term) {

0 commit comments

Comments
 (0)