여러 서버 노드가 있을 때, 재고 감소같은 로직은 서버 노드 한대만 수행되도록 제한을 두고 싶습니다. 이럴 때 사용하는 것이 분산락입니다. 분산락을 처리하는 방법은 여러가지 있겠지만 레디스로 처리하는 방법을 알아보겠습니다. 스프링에서 사용되는 Redis 라이브러리는 여러가지가 있지만, Redisson 을 이용해서 구현을 해봤습니다. Redisson은 Redis를 분산 데이터 저장소로 사용할 때 유용합니다. Redisson은 Redis의 Pub/sub 기능을 사용해서 Lock 획득을 재시도합니다. 특정 채널을 구독하고 이벤트를 받기 때문에 이와 같은 처리가 가능합니다. [설정]build.gradle에 다음과 같이 라이브러리를 추가합니다.// file: build.gradle// redissonimpl..
Driving 테이블조인시 먼저 액세스되는 쪽을 드라이빙 테이블(DRIVING TABLE, OUTER TABLE)이라고 하며 나중에 액세스 되는 테이블을 드리븐 테이블(DRIVEN TABLE, INNER TABLE)이라고 합니다. 인덱스(INDEX)의 존재 및 우선순위 혹은 FROM 절에서의 TABLE 지정 순서에 영향을 받으며 어느 테이블이 먼저 액세스되느냐에 따라 속도의 차이가 크게 날 수 있으므로 대량의 데이터를 다룰 때 정말 중요합니다. 조건을 만족하는 테이블과 해당하는 로우 데이터 수가 다음과 같다고 가정합니다. A 테이블: 1억건B 테이블: 100건 이 때, 조인시 드라이빙 순서에 따라 속도의 확연한 차이가 발생할 수 있습니다. A 테이블을 드라이빙하게 되면 최대 1억 번을 반복하며 B 테이블..
트랜잭션은 ACID라는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability) 를 보장해야 합니다. 원자성: 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하든가 모두 실패해야 합니다.일관성: 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 합니다.격리성: 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리합니다.지속성: 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 합니다. 이번 포스팅에서는 격리성에 대해서 알아보겠습니다. 트랜잭션 간에 격리성을 완벽히 보장하려면 트랜잭션을 거의 차례대로 실행해야 하며, 이 경우 동시성 처리 성능이 매우 나빠집니다.격리 수준은 4단계가 있습니다. READ_..
원인SQL 쿼리에서 동일한 이름의 컬럼이 여러 테이블에 존재할 때 발생합니다.이 경우 MySQL이 어느 테이블의 컬럼을 사용할지 명확하지 않기 때문에 이 에러를 발생시킵니다.SELECT id, nameFROM users u INNER JOIN orders o ON u.id = o.user_id 해결 방법테이블 명시하기 (또는 별칭 사용하기)동일한 이름의 컬럼이 있을 경우, 어느 테이블의 컬럼을 사용할 것인지 명확하게 지정합니다.SELECT u.id, u.name, o.idFROM users u INNER JOIN orders o ON u.id = o.user_id