Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
fe244b6
refactor: univ-apply-info로 URI 변경
nayonsoso Jun 25, 2025
bd3e1f3
refactor: UnivApplyInfo 사용하도록 컨트롤러 함수 변경
nayonsoso Jun 25, 2025
ed9f849
refactor: UnivApplyInfo 사용하도록 recommendService 변경
nayonsoso Jun 25, 2025
348edb4
refactor: UnivApplyInfo 사용하도록 레포지토리 이름 변경
nayonsoso Jun 25, 2025
9b5c63e
refactor: JPQL alias 변경
nayonsoso Jun 25, 2025
373093d
refactor: JPA 표준에 맞게 함수 이름 변경
nayonsoso Jun 25, 2025
ded3bb4
refactor: UnivApplyInfo 사용하도록 레포지토리 변경
nayonsoso Jun 25, 2025
27c2079
refactor: JPA 표준에 맞게 함수 이름 변경
nayonsoso Jun 25, 2025
3d5c0b4
refactor: UnivApplyInfo 반영하도록 JPQL 별칭 변경
nayonsoso Jun 25, 2025
46cdeda
refactor: 잘못되어있던 상속 관계 변경
nayonsoso Jun 25, 2025
2e3719b
refactor: 좋아요한 대학 도메인 이름 변경
nayonsoso Jun 25, 2025
2ff17bb
refactor: UnivApplyInfo 사용하도록 likeService 변경
nayonsoso Jun 25, 2025
9bbb2b8
refactor: LikedUnivApplyInfoRepository 패키지 이동
nayonsoso Jun 25, 2025
2e684c6
refactor: UnivApplyInfo 사용하도록 Dto 이름 변경
nayonsoso Jun 25, 2025
6cc1023
refactor: UnivApplyInfo 사용하도록 테스트 코드 변경
nayonsoso Jun 25, 2025
cf63e1d
refactor: UNIV_APPLY_INFO 사용하도록 ErrorCode 변경
nayonsoso Jun 25, 2025
0bde961
refactor: 지원자 응답 Dto 이름 변경
nayonsoso Jun 25, 2025
fa91c81
refactor: UnivApplyInfo 사용하도록 applicationService 변경
nayonsoso Jun 25, 2025
2834221
refactor: JPA 표준에 맞게 함수 이름 변경
nayonsoso Jun 25, 2025
0b2bfa1
chore: 추후 수정해야 할 부분 표시
nayonsoso Jun 25, 2025
0443d3b
refactor: UnivApplyInfo 사용하도록 Dto필드명 변경
nayonsoso Jun 28, 2025
00f13d6
refactor: 이름변경 누락된 부분 수정
nayonsoso Jun 28, 2025
6bf9076
refactor: 테스트 코드에서 이름변경 누락된 부분 수정
nayonsoso Jun 28, 2025
f781751
refactor: UnivApplyInfo 사용하도록 MyPageService 변경
nayonsoso Jun 29, 2025
2271c6e
refactor: 사용되지 않는 함수 삭제
nayonsoso Jun 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@

import java.util.List;

public record UniversityApplicantsResponse(
public record ApplicantsResponse(
String koreanName,
int studentCapacity,
String region,
String country,
List<ApplicantResponse> applicants) {
public static UniversityApplicantsResponse of(UnivApplyInfo univApplyInfo, List<Application> applications, SiteUser siteUser) {
return new UniversityApplicantsResponse(
public static ApplicantsResponse of(UnivApplyInfo univApplyInfo, List<Application> applications, SiteUser siteUser) {
return new ApplicantsResponse(
univApplyInfo.getKoreanName(),
univApplyInfo.getStudentCapacity(),
univApplyInfo.getUniversity().getRegion().getKoreanName(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import java.util.List;

public record ApplicationsResponse(
List<UniversityApplicantsResponse> firstChoice,
List<UniversityApplicantsResponse> secondChoice,
List<UniversityApplicantsResponse> thirdChoice) {
List<ApplicantsResponse> firstChoice,
List<ApplicantsResponse> secondChoice,
List<ApplicantsResponse> thirdChoice) {
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.example.solidconnection.application.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;

Expand All @@ -12,6 +13,7 @@ public record ApplyRequest(
Long languageTestScoreId,

@Valid
UniversityChoiceRequest universityChoiceRequest
@JsonProperty("universityChoiceRequest")
UnivApplyInfoChoiceRequest univApplyInfoChoiceRequest
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.solidconnection.application.dto;

import com.example.solidconnection.university.dto.validation.ValidUnivApplyInfoChoice;
import com.fasterxml.jackson.annotation.JsonProperty;

@ValidUnivApplyInfoChoice
public record UnivApplyInfoChoiceRequest(

@JsonProperty("firstChoiceUniversityId")
Long firstChoiceUnivApplyInfoId,

@JsonProperty("secondChoiceUniversityId")
Long secondChoiceUnivApplyInfoId,

@JsonProperty("thirdChoiceUniversityId")
Long thirdChoiceUnivApplyInfoId) {
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@ public interface ApplicationRepository extends JpaRepository<Application, Long>
SELECT a
FROM Application a
JOIN FETCH a.siteUser
WHERE (a.firstChoiceUnivApplyInfoId IN :universityIds
OR a.secondChoiceUnivApplyInfoId IN :universityIds
OR a.thirdChoiceUnivApplyInfoId IN :universityIds)
WHERE (a.firstChoiceUnivApplyInfoId IN :univApplyInfoIds
OR a.secondChoiceUnivApplyInfoId IN :univApplyInfoIds
OR a.thirdChoiceUnivApplyInfoId IN :univApplyInfoIds)
AND a.verifyStatus = :status
AND a.term = :term
AND a.isDelete = false
""")
List<Application> findAllByUnivApplyInfoIds(@Param("universityIds") List<Long> universityIds, @Param("status") VerifyStatus status, @Param("term") String term);
List<Application> findAllByUnivApplyInfoIds(@Param("univApplyInfoIds") List<Long> univApplyInfoIds, @Param("status") VerifyStatus status, @Param("term") String term);

@Query("""
SELECT a
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
import com.example.solidconnection.application.domain.Application;
import com.example.solidconnection.application.domain.VerifyStatus;
import com.example.solidconnection.application.dto.ApplicationsResponse;
import com.example.solidconnection.application.dto.UniversityApplicantsResponse;
import com.example.solidconnection.application.dto.ApplicantsResponse;
import com.example.solidconnection.application.repository.ApplicationRepository;
import com.example.solidconnection.common.exception.CustomException;
import com.example.solidconnection.siteuser.domain.SiteUser;
import com.example.solidconnection.university.domain.UnivApplyInfo;
import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository;
import com.example.solidconnection.university.repository.custom.UniversityFilterRepositoryImpl;
import com.example.solidconnection.university.repository.UnivApplyInfoRepository;
import com.example.solidconnection.university.repository.custom.UnivApplyInfoFilterRepositoryImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
Expand All @@ -31,8 +31,8 @@
public class ApplicationQueryService {

private final ApplicationRepository applicationRepository;
private final UniversityInfoForApplyRepository universityInfoForApplyRepository;
private final UniversityFilterRepositoryImpl universityFilterRepository;
private final UnivApplyInfoRepository univApplyInfoRepository;
private final UnivApplyInfoFilterRepositoryImpl universityFilterRepository;

@Value("${university.term}")
public String term;
Expand All @@ -41,7 +41,7 @@ public class ApplicationQueryService {
@Transactional(readOnly = true)
public ApplicationsResponse getApplicants(SiteUser siteUser, String regionCode, String keyword) {
// 1. 대학 지원 정보 필터링 (regionCode, keyword)
List<UnivApplyInfo> univApplyInfos = universityFilterRepository.findByRegionCodeAndKeywords(regionCode, List.of(keyword));
List<UnivApplyInfo> univApplyInfos = universityFilterRepository.findAllByRegionCodeAndKeywords(regionCode, List.of(keyword));
if (univApplyInfos.isEmpty()) {
return new ApplicationsResponse(List.of(), List.of(), List.of());
}
Expand All @@ -58,38 +58,38 @@ public ApplicationsResponse getApplicants(SiteUser siteUser, String regionCode,
public ApplicationsResponse getApplicantsByUserApplications(SiteUser siteUser) {
Application userLatestApplication = applicationRepository.getApplicationBySiteUserAndTerm(siteUser, term);

List<Long> universityInfoForApplyIds = Stream.of(
List<Long> univApplyInfoIds = Stream.of(
userLatestApplication.getFirstChoiceUnivApplyInfoId(),
userLatestApplication.getSecondChoiceUnivApplyInfoId(),
userLatestApplication.getThirdChoiceUnivApplyInfoId()
)
.filter(Objects::nonNull)
.collect(Collectors.toList());

if (universityInfoForApplyIds.isEmpty()) {
if (univApplyInfoIds.isEmpty()) {
return new ApplicationsResponse(List.of(), List.of(), List.of());
}

List<Application> applications = applicationRepository.findAllByUnivApplyInfoIds(universityInfoForApplyIds, VerifyStatus.APPROVED, term);
List<UnivApplyInfo> universityInfosForApply = universityInfoForApplyRepository.findAllByUniversityIds(universityInfoForApplyIds);
List<Application> applications = applicationRepository.findAllByUnivApplyInfoIds(univApplyInfoIds, VerifyStatus.APPROVED, term);
List<UnivApplyInfo> univApplyInfos = univApplyInfoRepository.findAllByIds(univApplyInfoIds);

return classifyApplicationsByChoice(universityInfosForApply, applications, siteUser);
return classifyApplicationsByChoice(univApplyInfos, applications, siteUser);
}

private ApplicationsResponse classifyApplicationsByChoice(
List<UnivApplyInfo> universityInfosForApply,
List<UnivApplyInfo> univApplyInfos,
List<Application> applications,
SiteUser siteUser) {
Map<Long, List<Application>> firstChoiceMap = createChoiceMap(applications, Application::getFirstChoiceUnivApplyInfoId);
Map<Long, List<Application>> secondChoiceMap = createChoiceMap(applications, Application::getSecondChoiceUnivApplyInfoId);
Map<Long, List<Application>> thirdChoiceMap = createChoiceMap(applications, Application::getThirdChoiceUnivApplyInfoId);

List<UniversityApplicantsResponse> firstChoiceApplicants =
createUniversityApplicantsResponses(universityInfosForApply, firstChoiceMap, siteUser);
List<UniversityApplicantsResponse> secondChoiceApplicants =
createUniversityApplicantsResponses(universityInfosForApply, secondChoiceMap, siteUser);
List<UniversityApplicantsResponse> thirdChoiceApplicants =
createUniversityApplicantsResponses(universityInfosForApply, thirdChoiceMap, siteUser);
List<ApplicantsResponse> firstChoiceApplicants =
createUniversityApplicantsResponses(univApplyInfos, firstChoiceMap, siteUser);
List<ApplicantsResponse> secondChoiceApplicants =
createUniversityApplicantsResponses(univApplyInfos, secondChoiceMap, siteUser);
List<ApplicantsResponse> thirdChoiceApplicants =
createUniversityApplicantsResponses(univApplyInfos, thirdChoiceMap, siteUser);

return new ApplicationsResponse(firstChoiceApplicants, secondChoiceApplicants, thirdChoiceApplicants);
}
Expand All @@ -109,12 +109,12 @@ private Map<Long, List<Application>> createChoiceMap(
return choiceMap;
}

private List<UniversityApplicantsResponse> createUniversityApplicantsResponses(
List<UnivApplyInfo> universityInfosForApply,
private List<ApplicantsResponse> createUniversityApplicantsResponses(
List<UnivApplyInfo> univApplyInfos,
Map<Long, List<Application>> choiceMap,
SiteUser siteUser) {
return universityInfosForApply.stream()
.map(uia -> UniversityApplicantsResponse.of(uia, choiceMap.getOrDefault(uia.getId(), List.of()), siteUser))
return univApplyInfos.stream()
.map(uia -> ApplicantsResponse.of(uia, choiceMap.getOrDefault(uia.getId(), List.of()), siteUser))
.toList();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.example.solidconnection.application.domain.VerifyStatus;
import com.example.solidconnection.application.dto.ApplicationSubmissionResponse;
import com.example.solidconnection.application.dto.ApplyRequest;
import com.example.solidconnection.application.dto.UniversityChoiceRequest;
import com.example.solidconnection.application.dto.UnivApplyInfoChoiceRequest;
import com.example.solidconnection.application.repository.ApplicationRepository;
import com.example.solidconnection.common.exception.CustomException;
import com.example.solidconnection.score.domain.GpaScore;
Expand Down Expand Up @@ -42,13 +42,13 @@ public class ApplicationSubmissionService {
// 기존에 있던 status field 우선 APRROVED로 입력시킨다.
@Transactional
public ApplicationSubmissionResponse apply(SiteUser siteUser, ApplyRequest applyRequest) {
UniversityChoiceRequest universityChoiceRequest = applyRequest.universityChoiceRequest();
UnivApplyInfoChoiceRequest univApplyInfoChoiceRequest = applyRequest.univApplyInfoChoiceRequest();
GpaScore gpaScore = getValidGpaScore(siteUser, applyRequest.gpaScoreId());
LanguageTestScore languageTestScore = getValidLanguageTestScore(siteUser, applyRequest.languageTestScoreId());

long firstChoiceUniversityId = universityChoiceRequest.firstChoiceUniversityId();
Long secondChoiceUniversityId = universityChoiceRequest.secondChoiceUniversityId();
Long thirdChoiceUniversityId = universityChoiceRequest.thirdChoiceUniversityId();
long firstChoiceUnivApplyInfoId = univApplyInfoChoiceRequest.firstChoiceUnivApplyInfoId();
Long secondChoiceUnivApplyInfoId = univApplyInfoChoiceRequest.secondChoiceUnivApplyInfoId();
Long thirdChoiceUnivApplyInfoId = univApplyInfoChoiceRequest.thirdChoiceUnivApplyInfoId();

Optional<Application> existingApplication = applicationRepository.findBySiteUserAndTerm(siteUser, term);
int updateCount = existingApplication
Expand All @@ -65,9 +65,9 @@ public ApplicationSubmissionResponse apply(SiteUser siteUser, ApplyRequest apply
languageTestScore.getLanguageTest(),
term,
updateCount,
firstChoiceUniversityId,
secondChoiceUniversityId,
thirdChoiceUniversityId,
firstChoiceUnivApplyInfoId,
secondChoiceUnivApplyInfoId,
thirdChoiceUnivApplyInfoId,
getRandomNickname()
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ public enum ErrorCode {
SIGN_UP_TOKEN_NOT_ISSUED_BY_SERVER(HttpStatus.BAD_REQUEST.value(), "회원가입 토큰이 우리 서버에서 발급되지 않았습니다."),

// data not found
UNIVERSITY_INFO_FOR_APPLY_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "존재하지 않는 대학교 지원 정보입니다."),
UNIVERSITY_INFO_FOR_APPLY_NOT_FOUND_FOR_TERM(HttpStatus.NOT_FOUND.value(), "해당하는 대학교가 이번 모집 기간에 열리지 않았습니다."),
UNIV_APPLY_INFO_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "존재하지 않는 대학교 지원 정보입니다."),
UNIV_APPLY_INFO_NOT_FOUND_FOR_TERM(HttpStatus.NOT_FOUND.value(), "해당하는 대학교가 이번 모집 기간에 열리지 않았습니다."),
APPLICATION_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "사용자의 대학 지원 정보를 찾을 수 없습니다."),
USER_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "회원을 찾을 수 없습니다."),
UNIVERSITY_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "대학교를 찾을 수 없습니다."),
Expand Down Expand Up @@ -71,7 +71,7 @@ public enum ErrorCode {
PROFILE_IMAGE_NEEDED(HttpStatus.BAD_REQUEST.value(), "프로필 이미지가 필요합니다."),
FIRST_CHOICE_REQUIRED(HttpStatus.BAD_REQUEST.value(), "1지망 대학교를 입력해주세요."),
THIRD_CHOICE_REQUIRES_SECOND(HttpStatus.BAD_REQUEST.value(), "2지망 없이 3지망을 선택할 수 없습니다."),
DUPLICATE_UNIVERSITY_CHOICE(HttpStatus.BAD_REQUEST.value(), "지망 선택이 중복되었습니다."),
DUPLICATE_UNIV_APPLY_INFO_CHOICE(HttpStatus.BAD_REQUEST.value(), "지망 선택이 중복되었습니다."),

// community
INVALID_POST_CATEGORY(HttpStatus.BAD_REQUEST.value(), "잘못된 카테고리명입니다."),
Expand All @@ -86,8 +86,8 @@ public enum ErrorCode {
CAN_NOT_UPDATE_DEPRECATED_COMMENT(HttpStatus.BAD_REQUEST.value(), "이미 삭제된 댓글을 수정할 수 없습니다."),
INVALID_POST_LIKE(HttpStatus.BAD_REQUEST.value(), "존재하지 않는 게시글 좋아요입니다."),
DUPLICATE_POST_LIKE(HttpStatus.BAD_REQUEST.value(), "이미 좋아요한 게시글입니다."),
ALREADY_LIKED_UNIVERSITY(HttpStatus.BAD_REQUEST.value(), "이미 좋아요한 대학입니다."),
NOT_LIKED_UNIVERSITY(HttpStatus.BAD_REQUEST.value(), "좋아요하지 않은 대학입니다."),
ALREADY_LIKED_UNIV_APPLY_INFO(HttpStatus.BAD_REQUEST.value(), "이미 좋아요한 대학입니다."),
NOT_LIKED_UNIV_APPLY_INFO(HttpStatus.BAD_REQUEST.value(), "좋아요하지 않은 대학입니다."),

// score
INVALID_GPA_SCORE_STATUS(HttpStatus.BAD_REQUEST.value(), "학점이 승인되지 않았습니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.example.solidconnection.siteuser.domain.AuthType;
import com.example.solidconnection.siteuser.domain.Role;
import com.example.solidconnection.siteuser.domain.SiteUser;
import com.fasterxml.jackson.annotation.JsonProperty;

public record MyPageResponse(
String nickname,
Expand All @@ -12,9 +13,11 @@ public record MyPageResponse(
String email,
int likedPostCount,
int likedMentorCount,
int likedUniversityCount) {

public static MyPageResponse of(SiteUser siteUser, int likedUniversityCount) {
@JsonProperty("likedUniversityCount")
int likedUnivApplyInfoCount) {

public static MyPageResponse of(SiteUser siteUser, int likedUnivApplyInfoCount) {
return new MyPageResponse(
siteUser.getNickname(),
siteUser.getProfileImageUrl(),
Expand All @@ -23,7 +26,7 @@ public static MyPageResponse of(SiteUser siteUser, int likedUniversityCount) {
siteUser.getEmail(),
0, // TODO: 커뮤니티 기능 생기면 업데이트 필요
0, // TODO: 멘토 기능 생기면 업데이트 필요
likedUniversityCount
likedUnivApplyInfoCount
);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
import com.example.solidconnection.s3.service.S3Service;
import com.example.solidconnection.siteuser.domain.SiteUser;
import com.example.solidconnection.siteuser.dto.MyPageResponse;
import com.example.solidconnection.siteuser.repository.LikedUniversityRepository;
import com.example.solidconnection.university.repository.LikedUnivApplyInfoRepository;
import com.example.solidconnection.siteuser.repository.SiteUserRepository;
import com.example.solidconnection.university.domain.LikedUniversity;
import com.example.solidconnection.university.dto.UniversityInfoForApplyPreviewResponse;
import com.example.solidconnection.university.domain.LikedUnivApplyInfo;
import com.example.solidconnection.university.dto.UnivApplyInfoPreviewResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -31,16 +31,16 @@ public class MyPageService {
public static final DateTimeFormatter NICKNAME_LAST_CHANGE_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

private final SiteUserRepository siteUserRepository;
private final LikedUniversityRepository likedUniversityRepository;
private final LikedUnivApplyInfoRepository likedUnivApplyInfoRepository;
private final S3Service s3Service;

/*
* 마이페이지 정보를 조회한다.
* */
@Transactional(readOnly = true)
public MyPageResponse getMyPageInfo(SiteUser siteUser) {
int likedUniversityCount = likedUniversityRepository.countBySiteUser_Id(siteUser.getId());
return MyPageResponse.of(siteUser, likedUniversityCount);
int likedUnivApplyInfoCount = likedUnivApplyInfoRepository.countBySiteUser_Id(siteUser.getId());
return MyPageResponse.of(siteUser, likedUnivApplyInfoCount);
}

/*
Expand Down Expand Up @@ -94,10 +94,10 @@ private boolean isDefaultProfileImage(String profileImageUrl) {
* 관심 대학교 목록을 조회한다.
* */
@Transactional(readOnly = true)
public List<UniversityInfoForApplyPreviewResponse> getWishUniversity(SiteUser siteUser) {
List<LikedUniversity> likedUniversities = likedUniversityRepository.findAllBySiteUser_Id(siteUser.getId());
return likedUniversities.stream()
.map(likedUniversity -> UniversityInfoForApplyPreviewResponse.from(likedUniversity.getUnivApplyInfo()))
public List<UnivApplyInfoPreviewResponse> getWishUnivApplyInfo(SiteUser siteUser) {
List<LikedUnivApplyInfo> likedUnivApplyInfos = likedUnivApplyInfoRepository.findAllBySiteUser_Id(siteUser.getId());
return likedUnivApplyInfos.stream()
.map(likedUnivApplyInfo -> UnivApplyInfoPreviewResponse.from(likedUnivApplyInfo.getUnivApplyInfo()))
.toList();
}
}
Loading
Loading