문제상황 1000명의 사용자가 동시에 하나의 게시물에 좋아요를 누르는 상황을 만들고, 동시성 이슈를 방지하기 위해 서비스 레이어의 addLike() 메서드에 synchronized를 적용했지만, 결과는 예상과 달랐다. 예상 결과 → 좋아요 개수 1000개 실제 결과 → 좋아요 개수 170개 830개의 요청 누락이 발생. 원인 분석 결론부터 말하면, s...
낙관적 락이란? 트랜잭션 간 충돌이 거의 발생하지 않는다고 “낙관적으로” 가정하고, 별도의 락을 걸지 않은 채 커밋 시점에 충돌 여부를 검증하는 방식이다. 낙관적 락은 데이터베이스의 락 기능을 사용하는 것이 아니라 Entity에 구분 컬럼(Version, Timestamp, Hashcode)을 두고, 커밋 시점에 해당 값이 변경되었는지, 비교 후, 충돌...
비관적 락이란? 낙관적 락과는 반대로 트랜잭션 간의 충돌이 발생할 가능성이 높다고 가정하고 트랜잭션이 데이터를 읽기/수정하기 전에 미리 락을 걸어 다른 트랜잭션의 접근을 락을 통해 제한하는 방식이다. 동작 과정 아래는 두 개의 트랜잭션이 동시에 같은 데이터를 수정하려고 할 때의 흐름이다. Transaction 1: 게시글 1번의 좋아요 정보를 ...
비관적 락 — DB에 집중되는 부하 비관적 락은 하나의 트랜잭션이 특정 레코드에 접근할 때 X-Lock(배타 락, Exclusive Lock)을 걸어, 조회 시점부터 커밋 시점까지 다른 트랜잭션이 해당 레코드에 접근하지 못하도록 막는 방식이다. 이 방식은 데이터 무결성을 보장하는 데 효과적이지만, 요청이 몰리는 환경에서는 문제가 발생한다. 여러 트랜...
Redisson 이란? Redisson은 Redis를 이용한 분산 환경에서의 락 관리, 캐시, 이벤트 시스템 등을 편리하게 제공하는 Java Redis 클라이언트이다. 이때, 락을 획득하지 못한 스레드를 대기시키고 다시 깨우는 과정을 pub/sub 방식으로 처리한다. pub/sub 방식 이란? Thread 1 : 락 획득 Thread 2 : 락 획득 ...
락 성능 비교 및 분석 결과 낙관적 락 평균 API 응답 시간이 733ms로 세 가지 락 방식 중 가장 빠른 성능 기록 DB 커넥션 점유 시간 23ms, CPU 사용량 0.2core로 모두 중간 수준 기록 응답 속도와 자원(DB, CPU) 사용 측면에서 가장 균형 잡힌 결과를 보임 비관적 락 평균 API 응답 시간은 1449ms로 낙관적 낙 대비 느린 ...
설정 전, 프로젝트 세팅 (@Retryable 사용을 위한 사전 세팅) spring-retry 의존성 추가 Spring Boot EntryPoint에 @EnableRetry 어노테이션 추가 재시도 설정 @Retryable 어노테이션을 사용하여 재시도 설정이 가능 retryFor : 예외 발생 시에만 재시도를 수행하도록 제한하는 옵션 maxAttem...