Skip to content

Commit 232dd53

Browse files
committed
[FEAT] 스터디룸 입장 비관적 락 적용 및 동시성 테스트
1 parent c292c44 commit 232dd53

2 files changed

Lines changed: 16 additions & 2 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
11
package com.example.be.repository;
22

33
import com.example.be.domain.Room;
4+
import jakarta.persistence.LockModeType;
45
import 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

610
public 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
}

src/main/java/com/example/be/web/controller/OpenviduController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff 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);

0 commit comments

Comments
 (0)