Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 @@ -85,7 +85,7 @@ private LunaNotificationVariable createApplicationVariable(Long targetId) {
}

private LunaNotificationVariable createApplicationGuestVariable(Long targetId) {
ExamApplicationNotifyProjection projection = examApplicationRepository.findExamAndPaymentByExamApplicationId(
ExamApplicationNotifyProjection projection = examApplicationRepository.findExamAndVirtualAccountByExamApplicationId(
targetId)
.orElseThrow(
() -> new CustomRuntimeException(ErrorCode.EXAM_APPLICATION_NOT_FOUND));
Comment on lines +88 to 91

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

리포지토리 메서드의 반환 타입이 List로 변경됨에 따라, 여기서도 결과를 리스트로 받고 첫 번째 요소를 사용하도록 수정해야 합니다. 리스트가 비어있는 경우 기존과 동일하게 예외를 발생시킵니다.

이렇게 하면 IncorrectResultSizeDataAccessException 발생을 방지하고, 비정상적인 데이터가 존재하더라도 첫 번째 유효한 데이터를 기준으로 알림을 보낼 수 있어 시스템 안정성을 높일 수 있습니다.

        List<ExamApplicationNotifyProjection> projections = examApplicationRepository.findExamAndVirtualAccountByExamApplicationId(
                        targetId);
        if (projections.isEmpty()) {
            throw new CustomRuntimeException(ErrorCode.EXAM_APPLICATION_NOT_FOUND);
        }
        ExamApplicationNotifyProjection projection = projections.get(0);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,24 @@ Optional<ExamApplicationNotifyProjection> findExamAndPaymentByExamApplicationId(
@Param("targetId") Long targetId);


@Query("""
SELECT new life.mosu.mosuserver.domain.examapplication.projection.ExamApplicationNotifyProjection(
va.orderId,
e.examDate,
e.schoolName,
ea.isLunchChecked,
e.lunchName
)
FROM ExamApplicationJpaEntity ea
JOIN ExamJpaEntity e ON ea.examId = e.id
JOIN VirtualAccountLogJpaEntity va ON va.applicationId = ea.applicationId
WHERE ea.id = :examApplicationId
AND va.depositStatus = 'DONE'
""")
Optional<ExamApplicationNotifyProjection> findExamAndVirtualAccountByExamApplicationId(
@Param("examApplicationId") Long examApplicationId);
Comment on lines +132 to +133

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

현재 쿼리는 applicationId 당 여러 개의 VirtualAccountLogJpaEntityDONE 상태로 존재할 경우 IncorrectResultSizeDataAccessException을 발생시킬 수 있습니다. Optional을 반환 타입으로 사용하는 경우, 쿼리 결과가 2개 이상이면 예외가 발생합니다.

데이터 무결성이 깨지는 예외적인 상황에 대한 방어 코드를 추가하는 것이 좋습니다. 반환 타입을 List<ExamApplicationNotifyProjection>으로 변경하여 예상치 못한 다중 결과에 대비하는 것을 제안합니다.

Suggested change
Optional<ExamApplicationNotifyProjection> findExamAndVirtualAccountByExamApplicationId(
@Param("examApplicationId") Long examApplicationId);
List<ExamApplicationNotifyProjection> findExamAndVirtualAccountByExamApplicationId(
@Param("examApplicationId") Long examApplicationId);



@Query("""
SELECT new life.mosu.mosuserver.domain.examapplication.projection.ExamInfoProjection(
e.examDate,
Expand Down