성능 개선 - AIN-T/tiggle-backend GitHub Wiki

예약 가능 좌석 조회 N+1 문제

🔹 JPA로 작성한 코드의 쿼리문 출력 결과

query1 ✔ 조회하고자 하는 공연의 좌석 갯수만큼 조회가 이뤄지기 때문에 총 20개의 조회 쿼리가 추가적으로 발생하게 된다.

🔹 조인을 사용하여 하나의 쿼리문으로 조회한 결과

query2 ✔ 한 개의 쿼리문으로 결과를 응답받을 수 있음

페이징 처리로 N+1 문제 해결

🔹 페이징 처리 하기 전

query3 ✔ 조회하고자 하는 개수만큼 이뤄지기 조회가 이뤄지기 때문에 조회 쿼리를 추가적으로 발생하게 된다.

🔹 페이징 처리 후

query4 ✔ Count를 통해 한 개의 쿼리문으로 결과를 응답 받을 수 있다.

동시성 제어 개선

🔹 Redis를 이용한 분산 락과 원자적 연산 적용 ✔ 기존 데이터베이스 기반의 저장 및 조회를 Redis로 변경하여 성능을 최적화했습니다. ✔ Redis의 **분산 락(distributed lock)**을 활용해 여러 클라이언트가 동시에 동일한 좌석에 접근하는 상황에서도 데이터 충돌을 방지했습니다. ✔ 또한, Redis의 **atomic operation(원자적 연산)**을 통해 데이터를 동기적으로 처리하여 예약 상태의 정확성을 보장했습니다.

🔹 테스트 결과

1) 동시성 제어 전

image image ✔ 동시 요청 10건 모두 성공하며 동시성 문제가 발생함.

2) 동시성 제어 후

image ✔ 동시 요청 10건 중 하나만 성공하도록 개선되어 정상적으로 동시성 문제가 해결됨.