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..5c319b0 100644 --- a/src/main/java/ceos/backend/domain/application/helper/ApplicationHelper.java +++ b/src/main/java/ceos/backend/domain/application/helper/ApplicationHelper.java @@ -57,6 +57,15 @@ public Application getApplicationById(Long id) { }); } + public Application getApplicationByIdForUpdate(Long id) { + return applicationRepository + .findByIdWithPessimisticLock(id) + .orElseThrow( + () -> { + throw ApplicantNotFound.EXCEPTION; + }); + } + public Application getApplicationByUuidAndEmail(String uuid, String email) { return applicationRepository .findByUuidAndEmail(uuid, email) 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); + } 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());