Skip to content

Commit c8145bf

Browse files
authored
Merge pull request #216 from prgrms-web-devcourse-final-project/ajh/event/concurrent_test
이벤트 참여 시 비관적 락으로 로직 수행
2 parents 6718c39 + 5a544e4 commit c8145bf

File tree

6 files changed

+796
-3
lines changed

6 files changed

+796
-3
lines changed

src/main/java/com/grepp/spring/app/model/event/repository/EventMemberRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import com.grepp.spring.app.model.event.entity.Event;
44
import com.grepp.spring.app.model.event.entity.EventMember;
5+
import jakarta.persistence.LockModeType;
56
import java.util.ArrayList;
67
import org.springframework.data.jpa.repository.JpaRepository;
78

89
import java.util.List;
910
import java.util.Optional;
11+
import org.springframework.data.jpa.repository.Lock;
1012

1113
public interface EventMemberRepository extends JpaRepository<EventMember, Long> {
1214

@@ -21,4 +23,6 @@ public interface EventMemberRepository extends JpaRepository<EventMember, Long>
2123
ArrayList<EventMember> findByEvent(Event event);
2224

2325
void deleteByEventAndMemberId(Event event, String id);
26+
27+
List<EventMember> findByEventId(Long eventId);
2428
}

src/main/java/com/grepp/spring/app/model/event/repository/EventRepository.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package com.grepp.spring.app.model.event.repository;
22

33
import com.grepp.spring.app.model.event.entity.Event;
4+
import jakarta.persistence.LockModeType;
45
import java.util.ArrayList;
6+
import java.util.Optional;
57
import org.springframework.data.jpa.repository.JpaRepository;
8+
import org.springframework.data.jpa.repository.Lock;
9+
import org.springframework.data.jpa.repository.Query;
10+
import org.springframework.data.repository.query.Param;
611
import org.springframework.stereotype.Repository;
712

813

@@ -11,4 +16,8 @@ public interface EventRepository extends JpaRepository<Event, Long> {
1116

1217

1318
ArrayList<Event> findByGroupId(Long groupId);
19+
20+
@Lock(LockModeType.PESSIMISTIC_WRITE)
21+
@Query("SELECT e FROM Event e WHERE e.id = :eventId")
22+
Optional<Event> findEventForUpdate(@Param("eventId") Long eventId);
1423
}

src/main/java/com/grepp/spring/app/model/event/service/EventCommandService.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,10 @@ public CreateEventResponse createEvent(CreateEventRequest webRequest, String cur
6565
public void joinEvent(Long eventId, Long groupId, String currentMemberId) {
6666
JoinEventDto dto = JoinEventDto.toDto(eventId, currentMemberId);
6767

68-
Event event = findEventOrThrow(dto.getEventId());
68+
//Event event = findEventOrThrow(dto.getEventId());
69+
70+
// 비관적락
71+
Event event = findEventWithLockOrThrow(dto.getEventId());
6972
Member member = findMemberOrThrow(dto.getMemberId());
7073

7174
validateEventMemberIsAlreadyJoined(dto.getEventId(), dto.getMemberId());
@@ -175,6 +178,11 @@ private Event findEventOrThrow(Long eventId) {
175178
.orElseThrow(() -> new EventNotFoundException(EventErrorCode.EVENT_NOT_FOUND));
176179
}
177180

181+
private Event findEventWithLockOrThrow(Long eventId) {
182+
return eventRepository.findEventForUpdate(eventId)
183+
.orElseThrow(() -> new EventNotFoundException(EventErrorCode.EVENT_NOT_FOUND));
184+
}
185+
178186
private Member findMemberOrThrow(String memberId) {
179187
return memberRepository.findById(memberId)
180188
.orElseThrow(() -> new EventNotFoundException(EventErrorCode.MEMBER_NOT_FOUND));

0 commit comments

Comments
 (0)