From 8aa467b7b711a92cab6f1a892059267017347098 Mon Sep 17 00:00:00 2001 From: choiseoji Date: Wed, 13 Aug 2025 12:04:54 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[feat]=20Application=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EC=97=90=20=EB=9D=BD=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/application/helper/ApplicationHelper.java | 3 ++- .../application/repository/ApplicationRepository.java | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/ceos/backend/domain/application/helper/ApplicationHelper.java b/src/main/java/ceos/backend/domain/application/helper/ApplicationHelper.java index 34ed804..b1107fa 100644 --- a/src/main/java/ceos/backend/domain/application/helper/ApplicationHelper.java +++ b/src/main/java/ceos/backend/domain/application/helper/ApplicationHelper.java @@ -49,8 +49,9 @@ public void sendSlackUnableReasonMessage( } public Application getApplicationById(Long id) { + return applicationRepository - .findById(id) + .findByIdWithPessimisticLock(id) .orElseThrow( () -> { throw ApplicantNotFound.EXCEPTION; diff --git a/src/main/java/ceos/backend/domain/application/repository/ApplicationRepository.java b/src/main/java/ceos/backend/domain/application/repository/ApplicationRepository.java index 18a0b86..c1f7544 100644 --- a/src/main/java/ceos/backend/domain/application/repository/ApplicationRepository.java +++ b/src/main/java/ceos/backend/domain/application/repository/ApplicationRepository.java @@ -5,9 +5,12 @@ import ceos.backend.domain.application.domain.Pass; import ceos.backend.global.common.entity.Part; import java.util.Optional; + +import jakarta.persistence.LockModeType; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Lock; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -63,4 +66,10 @@ Page findAllByPartAndDocumentPassAndFinalPass( @Param("convertedDocPass") Pass convertedDocPass, @Param("convertedFinalPass") Pass convertedFinalPass, PageRequest pageRequest); + + + @Lock(LockModeType.PESSIMISTIC_WRITE) + @Query("select a from Application a where a.id = :id") + Optional findByIdWithPessimisticLock(@Param("id") Long id); + } From 454d34fc90f2edf299bd56ec2cdefc34a93f18f0 Mon Sep 17 00:00:00 2001 From: choiseoji Date: Wed, 13 Aug 2025 13:07:11 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[feat]=20=EC=9D=BD=EA=B8=B0=20=EC=A0=84?= =?UTF-8?q?=EC=9A=A9,=20=EC=93=B0=EA=B8=B0=20=EC=A0=84=EC=9A=A9=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/application/helper/ApplicationHelper.java | 8 ++++++++ .../domain/application/service/ApplicationService.java | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/ceos/backend/domain/application/helper/ApplicationHelper.java b/src/main/java/ceos/backend/domain/application/helper/ApplicationHelper.java index b1107fa..5c319b0 100644 --- a/src/main/java/ceos/backend/domain/application/helper/ApplicationHelper.java +++ b/src/main/java/ceos/backend/domain/application/helper/ApplicationHelper.java @@ -49,7 +49,15 @@ public void sendSlackUnableReasonMessage( } public Application getApplicationById(Long id) { + return applicationRepository + .findById(id) + .orElseThrow( + () -> { + throw ApplicantNotFound.EXCEPTION; + }); + } + public Application getApplicationByIdForUpdate(Long id) { return applicationRepository .findByIdWithPessimisticLock(id) .orElseThrow( diff --git a/src/main/java/ceos/backend/domain/application/service/ApplicationService.java b/src/main/java/ceos/backend/domain/application/service/ApplicationService.java index 5d421d7..80b69e6 100644 --- a/src/main/java/ceos/backend/domain/application/service/ApplicationService.java +++ b/src/main/java/ceos/backend/domain/application/service/ApplicationService.java @@ -237,7 +237,7 @@ public GetInterviewTime getInterviewTime(Long applicationId) { public void updateInterviewTime(Long applicationId, UpdateInterviewTime updateInterviewTime) { recruitmentValidator.validateBetweenStartDateDocAndResultDateDoc(); // 기간 검증 applicationValidator.validateExistingApplicant(applicationId); // 유저 검증 - final Application application = applicationHelper.getApplicationById(applicationId); + final Application application = applicationHelper.getApplicationByIdForUpdate(applicationId); applicationValidator.validateDocumentPassStatus(application); // 서류 통과 검증 final List interviews = interviewRepository.findAll(); final String duration = @@ -262,7 +262,7 @@ public void updateDocumentPassStatus(Long applicationId, UpdatePassStatus update recruitmentValidator.validateBetweenStartDateDocAndResultDateDoc(); // 기간 검증 applicationValidator.validateExistingApplicant(applicationId); // 유저 검증 - final Application application = applicationHelper.getApplicationById(applicationId); + final Application application = applicationHelper.getApplicationByIdForUpdate(applicationId); application.updateDocumentPass(updatePassStatus.getPass()); } @@ -270,7 +270,7 @@ public void updateDocumentPassStatus(Long applicationId, UpdatePassStatus update public void updateFinalPassStatus(Long applicationId, UpdatePassStatus updatePassStatus) { recruitmentValidator.validateBetweenResultDateDocAndResultDateFinal(); // 기간 검증 applicationValidator.validateExistingApplicant(applicationId); // 유저 검증 - final Application application = applicationHelper.getApplicationById(applicationId); + final Application application = applicationHelper.getApplicationByIdForUpdate(applicationId); applicationValidator.validateDocumentPassStatus(application); // 서류 통과 검증 application.updateFinalPass(updatePassStatus.getPass());