Skip to content

Commit fdfb3e2

Browse files
committed
feat: 합격자 관리시 비관락 적용
1 parent 169f9d5 commit fdfb3e2

3 files changed

Lines changed: 29 additions & 8 deletions

File tree

src/main/java/ceos/backend/domain/application/helper/ApplicationHelper.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111
import ceos.backend.global.common.dto.AwsSESMail;
1212
import ceos.backend.global.common.dto.SlackUnavailableReason;
1313
import ceos.backend.global.common.event.Event;
14-
import java.util.List;
15-
import java.util.UUID;
1614
import lombok.RequiredArgsConstructor;
1715
import lombok.extern.slf4j.Slf4j;
1816
import org.springframework.stereotype.Component;
1917

18+
import java.util.List;
19+
import java.util.UUID;
20+
2021
@Slf4j
2122
@Component
2223
@RequiredArgsConstructor
@@ -74,4 +75,14 @@ public Application getApplicationByUuidAndEmail(String uuid, String email) {
7475
throw ApplicantNotFound.EXCEPTION;
7576
});
7677
}
78+
79+
public Application getApplicationByUuidAndEmailForUpdate(String uuid, String email) {
80+
return applicationRepository
81+
.findByUuidAndEmailWithPessimisticLock(uuid, email)
82+
.orElseThrow(
83+
() -> {
84+
throw ApplicantNotFound.EXCEPTION;
85+
});
86+
}
87+
7788
}

src/main/java/ceos/backend/domain/application/repository/ApplicationRepository.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
import ceos.backend.domain.application.domain.Application;
55
import ceos.backend.domain.application.domain.Pass;
66
import ceos.backend.global.common.entity.Part;
7-
import java.util.Optional;
8-
97
import jakarta.persistence.LockModeType;
108
import org.springframework.data.domain.Page;
119
import org.springframework.data.domain.PageRequest;
@@ -14,6 +12,8 @@
1412
import org.springframework.data.jpa.repository.Query;
1513
import org.springframework.data.repository.query.Param;
1614

15+
import java.util.Optional;
16+
1717
public interface ApplicationRepository
1818
extends JpaRepository<Application, Long>, ApplicationRepositoryCustom {
1919
@Query("select distinct a from Application a" + " where a.applicantInfo.email = :email")
@@ -22,13 +22,23 @@ public interface ApplicationRepository
2222
@Query("select distinct a from Application a" + " where a.applicantInfo.uuid = :uuid")
2323
Optional<Application> findByUuid(@Param("uuid") String uuid);
2424

25+
2526
@Query(
2627
"select a from Application a"
2728
+ " where a.applicantInfo.uuid = :uuid"
2829
+ " and a.applicantInfo.email = :email")
2930
Optional<Application> findByUuidAndEmail(
3031
@Param("uuid") String uuid, @Param("email") String email);
3132

33+
@Lock(LockModeType.PESSIMISTIC_WRITE)
34+
@Query(
35+
"select a from Application a"
36+
+ " where a.applicantInfo.uuid = :uuid"
37+
+ " and a.applicantInfo.email = :email")
38+
Optional<Application> findByUuidAndEmailWithPessimisticLock(
39+
@Param("uuid") String uuid, @Param("email") String email);
40+
41+
3242
@Query("select count(a) > 0 from Application a" + " where a.applicantInfo.email = :email")
3343
boolean existsByEmail(@Param("email") String email);
3444

src/main/java/ceos/backend/domain/application/service/ApplicationService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,12 @@ public void updateInterviewAttendance(
158158
String uuid, String email, UpdateAttendanceRequest request) {
159159
recruitmentValidator.validateBetweenResultDateDocAndResultDateFinal(); // 서류 합격 기간 검증
160160
applicationValidator.validateApplicantAccessible(uuid, email); // 유저 검증
161-
final Application application = applicationHelper.getApplicationByUuidAndEmail(uuid, email);
161+
final Application application =
162+
applicationHelper.getApplicationByUuidAndEmailForUpdate(uuid, email);
162163
applicationValidator.validateApplicantInterviewCheckStatus(application); // 서류합격, 인터뷰 체크 검증
163164

164165
if (request.isAvailable()) {
165166
application.updateInterviewCheck(true);
166-
applicationRepository.save(application);
167167
} else {
168168
application.updateUnableReason(request.getReason());
169169
applicationHelper.sendSlackUnableReasonMessage(application, request, false);
@@ -187,12 +187,12 @@ public void updateParticipationAvailability(
187187
String uuid, String email, UpdateAttendanceRequest request) {
188188
recruitmentValidator.validateFinalResultAbleDuration(); // 최종 합격 기간 검증
189189
applicationValidator.validateApplicantAccessible(uuid, email); // 유저 검증
190-
final Application application = applicationHelper.getApplicationByUuidAndEmail(uuid, email);
190+
final Application application =
191+
applicationHelper.getApplicationByUuidAndEmailForUpdate(uuid, email);
191192
applicationValidator.validateApplicantActivityCheckStatus(application); // 유저 확인 여부 검증
192193

193194
if (request.isAvailable()) {
194195
application.updateFinalCheck(true);
195-
applicationRepository.save(application);
196196
} else {
197197
application.updateUnableReason(request.getReason());
198198
applicationHelper.sendSlackUnableReasonMessage(application, request, true);

0 commit comments

Comments
 (0)