File tree Expand file tree Collapse file tree
src/main/java/com/example/be Expand file tree Collapse file tree Original file line number Diff line number Diff line change 11package com .example .be .repository ;
22
33import com .example .be .domain .Room ;
4+ import jakarta .persistence .LockModeType ;
45import org .springframework .data .jpa .repository .JpaRepository ;
6+ import org .springframework .data .jpa .repository .Lock ;
7+ import org .springframework .data .jpa .repository .Query ;
8+ import org .springframework .data .repository .query .Param ;
59
610public interface RoomRepository extends JpaRepository <Room ,Long > {
711 Room findByTitle (String title );
12+
13+ /**
14+ * 비관적 락을 사용하여 Room 조회
15+ * 동시에 여러 사용자가 입장할 때 참여자 수 정합성 보장
16+ */
17+ @ Lock (LockModeType .PESSIMISTIC_WRITE )
18+ @ Query ("SELECT r FROM Room r WHERE r.title = :title" )
19+ Room findByTitleWithLock (@ Param ("title" ) String title );
820}
Original file line number Diff line number Diff line change @@ -79,15 +79,17 @@ public ResponseEntity<String> receiveWebhook(@RequestHeader("Authorization") Str
7979 }
8080 }
8181 case "participant_joined" -> {
82- Room room = roomRepository .findByTitle (roomName );
82+ // 비관적 락을 사용하여 동시성 제어
83+ Room room = roomRepository .findByTitleWithLock (roomName );
8384 if (room != null ) {
8485 room .setParticipantCount (room .getParticipantCount ()+1 );
8586 roomRepository .save (room );
8687 log .info ("Participant joined. Current count: {}" , room .getParticipantCount ());
8788 }
8889 }
8990 case "participant_left" -> {
90- Room room = roomRepository .findByTitle (roomName );
91+ // 비관적 락을 사용하여 동시성 제어
92+ Room room = roomRepository .findByTitleWithLock (roomName );
9193 if (room != null ) {
9294 if (room .getParticipantCount () <= 1 ) {
9395 roomRepository .delete (room );
You can’t perform that action at this time.
0 commit comments