Spring 11

ReentrantLock의 이해와 활용

ReentrantLock 한 줄 정의ReentrantLock은 synchronized처럼 “한 번에 한 스레드만 임계 구역을 통과하게 하는 락”이지만,락 자체를 객체로 다루면서 훨씬 많은 기능을 제공하는 고급 락이다.private final ReentrantLock lock = new ReentrantLock();여기서 lock은 JVM 모니터락이 아니다. synchronized가 사용하는 “모니터(monitor)”와는 완전히 별개의 락 객체다. 이 차이에서부터 ReentrantLock의 모든 추가 기능들이 나온다고 보면 된다. 1. Reentrant(재진입 가능)이라는 이름의 진짜 의미1.1 그냥 “또 들어올 수 있다”가 아님“현재 락을 가지고 있는 스레드가 다시 같은 락을 요청해도 DeadLock 없..

CAS(Compare-And-Swap) 이해하기

1. 동시성의 출발점: synchronized를 이해하기자바에서 여러 스레드가 동시에 같은 데이터를 수정하면, 서로의 연산이 덮어써지거나 순서가 꼬이는 데이터 불일치(Data Race) 가 발생할 수 있습니다. 이 문제를 막기 위한 가장 기본적인 방법이 바로 synchronized 키워드입니다. 이 키워드는 한 번에 오직 하나의 스레드만 특정 코드 블록에 접근할 수 있도록 하는 락(lock) 역할을 합니다. 내부 동작 원리자바의 락은 내부적으로 모니터(Monitor) 라는 메커니즘을 사용합니다. 즉, synchronized 블록에 진입하는 순간, 해당 객체의 모니터 락을 획득(monitorenter) 하고, 블록을 빠져나올 때 락을 해제(monitorexit) 합니다. 이 과정은 바이트코드 수준에서 mo..

Lettuce를 활용한 Redis 분산 락 구현하기

분산 락이란 무엇인가?서버 한 대만 돌리는 환경이라면 synchronized, ReentrantLock, DB 트랜잭션 등으로도 충분히 동시성 제어가 가능합니다.하지만 대부분의 서비스는 트래픽 처리량과 가용성을 위해 여러 대의 서버(프로세스)로 구성된 분산 환경을 운영합니다.문제는 여기서부터 시작됩니다.서버 A, B가 동시에 같은 데이터를 수정한다면, 서버 간 메모리나 JVM이 독립되어 있기 때문에 기존의 synchronized 락은 전혀 통하지 않습니다.이런 상황에서 자원의 일관성을 보장하기 위해 등장한 것이 바로 분산 락(Distributed Lock) 입니다.분산 락의 핵심 개념 : “여러 서버(혹은 프로세스)가 하나의 자원에 동시에 접근할 때, 중앙화된 스토리지(예: Redis) 를 통해 락 상태..

MySQL Named 락과 분산 락 이해하기

서비스를 만들다 보면 이런 고민을 하게 됩니다.👉 “이 작업은 동시에 딱 한 명만 할 수 있어야 하는데… 어떻게 막지?”같은 상품의 정산 처리특정 주문의 마감 처리좌석/일정 중복 예약 방지이럴 때 필요한 게 락(Lock) 입니다. 이번 글은 왜 분산 락이 필요한지와, 가장 가볍게 시작할 수 있는 방법인 MySQL Named Lock을 설명합니다. 서버 내부에서의 동시성 제어1) synchronized (JVM 안에서만)같은 JVM 안에서 동시에 한 스레드만 코드 블록 진입.간단·빠름 / ❌ 멀티 서버에서는 소용 없음.2) 비관적 락 (DB가 먼저 막음)읽을 때부터 DB 락을 잡아 다른 트랜잭션 접근 차단.정합성 강함 / ❌ 대기·데드락 비용 큼, 트랜잭션이 끝나면 락 해제.3) 낙관적 락 (충돌 시점..

Spring 전파 레벨 (Propagation Level)

Spring 전파 레벨, 잘 알고 써야 사고 안 납니다서비스를 개발하다 보면 트랜잭션 관리는 정말 중요한 이슈입니다.한 번의 실수로 데이터 불일치가 발생하면 큰 문제가 될 수 있거든요.특히 Spring의 트랜잭션 전파 레벨(Propagation)을 제대로 이해하지 못하고 사용하면 예상치 못한 사고가 발생할 수 있습니다.이번 글에서는 전파 레벨의 개념부터 실제 서비스에서 자주 사용하는 방식, 그리고 개발 시 주의할 점까지 Spring AOP 구조와 함께 정리해보려 합니다.트랜잭션 전파 레벨이란?트랜잭션 전파 레벨이란, 이미 트랜잭션이 진행 중인 상태에서 다른 메서드가 호출될 때, 해당 메서드가 기존 트랜잭션에 참여할지, 아니면 새로운 트랜잭션을 시작할지를 결정하는 설정값입니다.Spring에서는 @Trans..

Spring 2025.09.08

Spring 낙관적 락 (Optimistic Lock)

웹 서비스를 만들 때 “재고가 마이너스로 떨어졌네?”, “좋아요 숫자가 이상해!” 같은 경험 해보셨나요?이건 여러 사람이 동시에 같은 데이터를 수정하려고 해서 발생하는 동시성 문제입니다.이 문제를 해결하는 방법 중 하나가 바로 낙관적 락(Optimistic Lock)이에요.동시성 문제가 뭔가요?쇼핑몰에서 마지막 1개 남은 상품을 두 명이 동시에 주문하는 상황을 예로 들면,철수: 상품 재고 확인 → “1개 있네!”영희: 상품 재고 확인 → “1개 있네!”철수: 재고를 1 빼고 저장 → “0개”영희: 재고를 1 빼고 저장 → “-1개” 😱이렇게 데이터가 꼬이는 게 바로 동시성 문제입니다.낙관적 락이란?낙관적 락은 말 그대로 “동시에 수정될 일이 많진 않겠지”라고 낙관하는 방식입니다.데이터를 읽을 때는 자유..