Skip to content

Commit 6e8a52d

Browse files
authored
[RELEASE] 251103 릴리즈
fix: PostRepository & CommentRepository의 일부 메서드의 정렬 순서 오류 해결 (#522) refactor: 이메일 유니크키 제거 refactor: 엔티티가 BaseEntity를 상속하도록 (#524) fix: BaseEntity 관련 마이그레이션 파일 수정 (#530) feat: 멘토 승격 api 구현 (#532) fix: 대학교 중복 오류 수정 (#510) refactor: 불필요한 로그 삭제 (#543) fix: 운영환경 8081 포트 설정 추가 (#542) fix: dev환경 디비명 변경 (#546) refactor: 불필요한 로그 삭제 (#547) refactor: 학기를 테이블로 관리하도록 변경 (#526) refactor: 모의지원 시 지원한 대학 정보 응답 추가 (#539)
2 parents edd2986 + 093b6af commit 6e8a52d

File tree

94 files changed

+1832
-424
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+1832
-424
lines changed

docker-compose.dev.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,16 @@ services:
66
container_name: redis
77
ports:
88
- "6379:6379"
9-
network_mode: host
109

1110
redis-exporter:
1211
image: oliver006/redis_exporter
1312
container_name: redis-exporter
1413
ports:
1514
- "9121:9121"
1615
environment:
17-
REDIS_ADDR: "localhost:6379"
16+
REDIS_ADDR: "redis:6379"
1817
depends_on:
1918
- redis
20-
network_mode: host
2119

2220
solid-connection-dev:
2321
build:
@@ -26,13 +24,15 @@ services:
2624
container_name: solid-connection-dev
2725
ports:
2826
- "8080:8080"
27+
- "8081:8081"
2928
environment:
3029
- SPRING_PROFILES_ACTIVE=dev
30+
- SPRING_DATA_REDIS_HOST=redis
31+
- SPRING_DATA_REDIS_PORT=6379
3132
volumes:
3233
- ./logs:/var/log/spring
3334
depends_on:
3435
- redis
35-
network_mode: host
3636

3737
alloy:
3838
image: grafana/alloy:latest

docker-compose.prod.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ services:
2424
container_name: solid-connection-server
2525
ports:
2626
- "8080:8080"
27+
- "8081:8081"
2728
environment:
2829
- SPRING_PROFILES_ACTIVE=prod
2930
- SPRING_DATA_REDIS_HOST=redis

src/main/java/com/example/solidconnection/application/domain/Application.java

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

33
import static com.example.solidconnection.common.VerifyStatus.PENDING;
44

5+
import com.example.solidconnection.common.BaseEntity;
56
import com.example.solidconnection.common.VerifyStatus;
67
import com.example.solidconnection.siteuser.domain.SiteUser;
78
import jakarta.persistence.Column;
@@ -27,15 +28,15 @@
2728
@Entity
2829
@Table(indexes = {
2930
@Index(name = "idx_app_user_term_delete",
30-
columnList = "site_user_id, term, is_delete"),
31+
columnList = "site_user_id, term_id, is_delete"),
3132
@Index(name = "idx_app_first_choice_search",
32-
columnList = "verify_status, term, is_delete, first_choice_university_info_for_apply_id"),
33+
columnList = "verify_status, term_id, is_delete, first_choice_university_info_for_apply_id"),
3334
@Index(name = "idx_app_second_choice_search",
34-
columnList = "verify_status, term, is_delete, second_choice_university_info_for_apply_id"),
35+
columnList = "verify_status, term_id, is_delete, second_choice_university_info_for_apply_id"),
3536
@Index(name = "idx_app_third_choice_search",
36-
columnList = "verify_status, term, is_delete, third_choice_university_info_for_apply_id")
37+
columnList = "verify_status, term_id, is_delete, third_choice_university_info_for_apply_id")
3738
})
38-
public class Application {
39+
public class Application extends BaseEntity {
3940

4041
@Id
4142
@GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -58,8 +59,8 @@ public class Application {
5859
@Column(columnDefinition = "int not null default 1", name = "update_count")
5960
private Integer updateCount;
6061

61-
@Column(length = 50, nullable = false, name = "term")
62-
private String term;
62+
@Column(nullable = false, name = "term_id")
63+
private long termId;
6364

6465
@Column(name = "is_delete")
6566
private boolean isDelete = false;
@@ -80,11 +81,11 @@ public Application(
8081
SiteUser siteUser,
8182
Gpa gpa,
8283
LanguageTest languageTest,
83-
String term) {
84+
long termId) {
8485
this.siteUserId = siteUser.getId();
8586
this.gpa = gpa;
8687
this.languageTest = languageTest;
87-
this.term = term;
88+
this.termId = termId;
8889
this.updateCount = 1;
8990
this.verifyStatus = PENDING;
9091
}
@@ -93,7 +94,7 @@ public Application(
9394
SiteUser siteUser,
9495
Gpa gpa,
9596
LanguageTest languageTest,
96-
String term,
97+
long termId,
9798
Integer updateCount,
9899
long firstChoiceUnivApplyInfoId,
99100
Long secondChoiceUnivApplyInfoId,
@@ -102,7 +103,7 @@ public Application(
102103
this.siteUserId = siteUser.getId();
103104
this.gpa = gpa;
104105
this.languageTest = languageTest;
105-
this.term = term;
106+
this.termId = termId;
106107
this.updateCount = updateCount;
107108
this.firstChoiceUnivApplyInfoId = firstChoiceUnivApplyInfoId;
108109
this.secondChoiceUnivApplyInfoId = secondChoiceUnivApplyInfoId;
@@ -115,15 +116,15 @@ public Application(
115116
SiteUser siteUser,
116117
Gpa gpa,
117118
LanguageTest languageTest,
118-
String term,
119+
long termId,
119120
long firstChoiceUnivApplyInfoId,
120121
Long secondChoiceUnivApplyInfoId,
121122
Long thirdChoiceUnivApplyInfoId,
122123
String nicknameForApply) {
123124
this.siteUserId = siteUser.getId();
124125
this.gpa = gpa;
125126
this.languageTest = languageTest;
126-
this.term = term;
127+
this.termId = termId;
127128
this.updateCount = 1;
128129
this.firstChoiceUnivApplyInfoId = firstChoiceUnivApplyInfoId;
129130
this.secondChoiceUnivApplyInfoId = secondChoiceUnivApplyInfoId;
Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
package com.example.solidconnection.application.dto;
22

33
import com.example.solidconnection.application.domain.Application;
4+
import com.example.solidconnection.university.domain.UnivApplyInfo;
5+
import java.util.List;
46

57
public record ApplicationSubmissionResponse(
6-
int applyCount
8+
int totalApplyCount,
9+
int applyCount,
10+
UnivApplyInfoResponse appliedUniversities
711
) {
812

9-
public static ApplicationSubmissionResponse from(Application application) {
10-
return new ApplicationSubmissionResponse(application.getUpdateCount());
13+
public static ApplicationSubmissionResponse of(int totalApplyCount, Application application, List<UnivApplyInfo> uniApplyInfos) {
14+
return new ApplicationSubmissionResponse(
15+
totalApplyCount,
16+
application.getUpdateCount(),
17+
UnivApplyInfoResponse.of(application, uniApplyInfos)
18+
);
1119
}
1220
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.example.solidconnection.application.dto;
2+
3+
import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
4+
5+
import com.example.solidconnection.application.domain.Application;
6+
import com.example.solidconnection.university.domain.UnivApplyInfo;
7+
import com.fasterxml.jackson.annotation.JsonInclude;
8+
import com.fasterxml.jackson.annotation.JsonProperty;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.stream.Collectors;
12+
13+
public record UnivApplyInfoResponse(
14+
15+
@JsonProperty("firstChoiceUniversity")
16+
String firstChoiceUnivApplyInfo,
17+
18+
@JsonProperty("secondChoiceUniversity")
19+
@JsonInclude(NON_NULL)
20+
String secondChoiceUnivApplyInfo,
21+
22+
@JsonProperty("thirdChoiceUniversity")
23+
@JsonInclude(NON_NULL)
24+
String thirdChoiceUnivApplyInfo) {
25+
26+
public static UnivApplyInfoResponse of(Application application, List<UnivApplyInfo> univApplyInfos) {
27+
Map<Long, String> univApplyInfoMap = univApplyInfos.stream()
28+
.collect(Collectors.toMap(
29+
UnivApplyInfo::getId,
30+
UnivApplyInfo::getKoreanName
31+
));
32+
33+
return new UnivApplyInfoResponse(
34+
univApplyInfoMap.get(application.getFirstChoiceUnivApplyInfoId()),
35+
application.getSecondChoiceUnivApplyInfoId() != null
36+
? univApplyInfoMap.get(application.getSecondChoiceUnivApplyInfoId()) : null,
37+
application.getThirdChoiceUnivApplyInfoId() != null
38+
? univApplyInfoMap.get(application.getThirdChoiceUnivApplyInfoId()) : null
39+
);
40+
}
41+
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,22 @@ public interface ApplicationRepository extends JpaRepository<Application, Long>
2222
OR a.secondChoiceUnivApplyInfoId IN :univApplyInfoIds
2323
OR a.thirdChoiceUnivApplyInfoId IN :univApplyInfoIds)
2424
AND a.verifyStatus = :status
25-
AND a.term = :term
25+
AND a.termId = :termId
2626
AND a.isDelete = false
2727
""")
28-
List<Application> findAllByUnivApplyInfoIds(@Param("univApplyInfoIds") List<Long> univApplyInfoIds, @Param("status") VerifyStatus status, @Param("term") String term);
28+
List<Application> findAllByUnivApplyInfoIds(@Param("univApplyInfoIds") List<Long> univApplyInfoIds, @Param("status") VerifyStatus status, @Param("termId") long termId);
2929

3030
@Query("""
3131
SELECT a
3232
FROM Application a
3333
WHERE a.siteUserId = :siteUserId
34-
AND a.term = :term
34+
AND a.termId = :termId
3535
AND a.isDelete = false
3636
""")
37-
Optional<Application> findBySiteUserIdAndTerm(@Param("siteUserId") long siteUserId, @Param("term") String term);
37+
Optional<Application> findBySiteUserIdAndTermId(@Param("siteUserId") long siteUserId, @Param("termId") long termId);
3838

39-
default Application getApplicationBySiteUserIdAndTerm(long siteUserId, String term) {
40-
return findBySiteUserIdAndTerm(siteUserId, term)
39+
default Application getApplicationBySiteUserIdAndTermId(long siteUserId, long termId) {
40+
return findBySiteUserIdAndTermId(siteUserId, termId)
4141
.orElseThrow(() -> new CustomException(APPLICATION_NOT_FOUND));
4242
}
4343
}

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

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.example.solidconnection.application.service;
22

33
import static com.example.solidconnection.common.exception.ErrorCode.APPLICATION_NOT_APPROVED;
4+
import static com.example.solidconnection.common.exception.ErrorCode.CURRENT_TERM_NOT_FOUND;
45
import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND;
56

67
import com.example.solidconnection.application.domain.Application;
@@ -11,9 +12,12 @@
1112
import com.example.solidconnection.common.exception.CustomException;
1213
import com.example.solidconnection.siteuser.domain.SiteUser;
1314
import com.example.solidconnection.siteuser.repository.SiteUserRepository;
15+
import com.example.solidconnection.term.domain.Term;
16+
import com.example.solidconnection.term.repository.TermRepository;
1417
import com.example.solidconnection.university.domain.UnivApplyInfo;
1518
import com.example.solidconnection.university.repository.UnivApplyInfoRepository;
1619
import com.example.solidconnection.university.repository.custom.UnivApplyInfoFilterRepositoryImpl;
20+
import io.micrometer.common.util.StringUtils;
1721
import java.util.ArrayList;
1822
import java.util.HashMap;
1923
import java.util.List;
@@ -23,7 +27,6 @@
2327
import java.util.stream.Collectors;
2428
import java.util.stream.Stream;
2529
import lombok.RequiredArgsConstructor;
26-
import org.springframework.beans.factory.annotation.Value;
2730
import org.springframework.stereotype.Service;
2831
import org.springframework.transaction.annotation.Transactional;
2932

@@ -35,25 +38,29 @@ public class ApplicationQueryService {
3538
private final UnivApplyInfoRepository univApplyInfoRepository;
3639
private final UnivApplyInfoFilterRepositoryImpl universityFilterRepository;
3740
private final SiteUserRepository siteUserRepository;
38-
39-
@Value("${university.term}")
40-
public String term;
41+
private final TermRepository termRepository;
4142

4243
// todo: 캐싱 정책 변경 시 수정 필요
4344
@Transactional(readOnly = true)
4445
public ApplicationsResponse getApplicants(long siteUserId, String regionCode, String keyword) {
4546
// 1. 대학 지원 정보 필터링 (regionCode, keyword)
4647
SiteUser siteUser = siteUserRepository.findById(siteUserId)
4748
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
48-
List<UnivApplyInfo> univApplyInfos = universityFilterRepository.findAllByRegionCodeAndKeywords(regionCode, List.of(keyword));
49+
List<String> keywords = StringUtils.isNotBlank(keyword) ? List.of(keyword) : List.of();
50+
51+
Term term = termRepository.findByIsCurrentTrue()
52+
.orElseThrow(() -> new CustomException(CURRENT_TERM_NOT_FOUND));
53+
54+
List<UnivApplyInfo> univApplyInfos = universityFilterRepository.findAllByRegionCodeAndKeywordsAndTermId(regionCode, keywords, term.getId());
4955
if (univApplyInfos.isEmpty()) {
5056
return new ApplicationsResponse(List.of(), List.of(), List.of());
5157
}
58+
5259
// 2. 조건에 맞는 모든 Application 한 번에 조회
5360
List<Long> univApplyInfoIds = univApplyInfos.stream()
5461
.map(UnivApplyInfo::getId)
5562
.toList();
56-
List<Application> applications = applicationRepository.findAllByUnivApplyInfoIds(univApplyInfoIds, VerifyStatus.APPROVED, term);
63+
List<Application> applications = applicationRepository.findAllByUnivApplyInfoIds(univApplyInfoIds, VerifyStatus.APPROVED, term.getId());
5764
// 3. 지원서 분류 및 DTO 변환
5865
return classifyApplicationsByChoice(univApplyInfos, applications, siteUser);
5966
}
@@ -62,7 +69,11 @@ public ApplicationsResponse getApplicants(long siteUserId, String regionCode, St
6269
public ApplicationsResponse getApplicantsByUserApplications(long siteUserId) {
6370
SiteUser siteUser = siteUserRepository.findById(siteUserId)
6471
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
65-
Application userLatestApplication = applicationRepository.getApplicationBySiteUserIdAndTerm(siteUser.getId(), term);
72+
73+
Term term = termRepository.findByIsCurrentTrue()
74+
.orElseThrow(() -> new CustomException(CURRENT_TERM_NOT_FOUND));
75+
76+
Application userLatestApplication = applicationRepository.getApplicationBySiteUserIdAndTermId(siteUser.getId(), term.getId());
6677

6778
List<Long> univApplyInfoIds = Stream.of(
6879
userLatestApplication.getFirstChoiceUnivApplyInfoId(),
@@ -76,7 +87,7 @@ public ApplicationsResponse getApplicantsByUserApplications(long siteUserId) {
7687
return new ApplicationsResponse(List.of(), List.of(), List.of());
7788
}
7889

79-
List<Application> applications = applicationRepository.findAllByUnivApplyInfoIds(univApplyInfoIds, VerifyStatus.APPROVED, term);
90+
List<Application> applications = applicationRepository.findAllByUnivApplyInfoIds(univApplyInfoIds, VerifyStatus.APPROVED, term.getId());
8091
List<UnivApplyInfo> univApplyInfos = univApplyInfoRepository.findAllByIds(univApplyInfoIds);
8192

8293
return classifyApplicationsByChoice(univApplyInfos, applications, siteUser);
@@ -128,7 +139,11 @@ private List<ApplicantsResponse> createUniversityApplicantsResponses(
128139
public void validateSiteUserCanViewApplicants(long siteUserId) {
129140
SiteUser siteUser = siteUserRepository.findById(siteUserId)
130141
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
131-
VerifyStatus verifyStatus = applicationRepository.getApplicationBySiteUserIdAndTerm(siteUser.getId(), term).getVerifyStatus();
142+
143+
Term term = termRepository.findByIsCurrentTrue()
144+
.orElseThrow(() -> new CustomException(CURRENT_TERM_NOT_FOUND));
145+
146+
VerifyStatus verifyStatus = applicationRepository.getApplicationBySiteUserIdAndTermId(siteUser.getId(), term.getId()).getVerifyStatus();
132147
if (verifyStatus != VerifyStatus.APPROVED) {
133148
throw new CustomException(APPLICATION_NOT_APPROVED);
134149
}

0 commit comments

Comments
 (0)