실시간 좌석 예약이라는 가상의 상황에서, 락을 활용하여 동시성을 제어하는 서비스를 구현해보았다.

아래 5가지의 상황에 따라 서로 다른 결과가 도출되는 지 통합 테스트를 통해 확인해보도록 할 것이다.

  1. 락을 사용하지 않는 방식
  2. 비관적 락(Pessimistic Lock)을 사용한 방식
  3. 낙관적 락(Optimistic Lock)을 사용한 방식
  4. 네임드 락(Named Lock)을 사용한 방식
  5. 분산 락(Distributed Lock)을 사용한 방식

이론에 관한 내용들은 아래 페이지를 참고하자.

☑️요구 사항

☑️Test 세팅

Test에 필요한 최소한의 기능들을 구현 해보았다.

1. Seat

public class Seat {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private Long quantity;

    public void decreaseReserve() {
        this.quantity--;
    }
    
    @OneToMany(mappedBy = "seat", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<User> userList = new ArrayList<>();

    
    public void addUser(User user){
        userList.add(user);
        user.setSeat(this);
    }
}