CS/💾 DB

· CS/💾 DB
프로젝트에서 쿼리를 튜닝하면서 한가지 궁금증이 생겼다 🎋 쿼리 튜닝을 통한 응답 속도 개선 ( feat. QueryDSL, JPQL )현재 구현된 서비스의 검색 기능들 중 대부분은 조건이 한 개이다. 물론 다양한 테이블을 join하는 것은 있을수 있지만 검색의 조건이 다양한 것은 조금 다르다고 생각했다기존의 특정 단어로만latewalk.tistory.com ❓ 궁금증우리는 서브쿼리를 종종 사용하다보면 그리고 많은 쿼리문을 작성하다보면 언뜻이라도 그런 생각이 든다어? 이거 조인으로 할 수 있는거 아냐? 혹은 어? 이거 서브쿼리문 작성하면 되겠는데?그런 쿼리문 중 대부분은 두 개를 같이 써도 같은 결과를 도출해내고는 한다하지만 튜닝을 좋게 하기 위한 방법으로 서브쿼리는 지양해야 한다고 말한다. 그 이유가 ..
· CS/💾 DB
🥝 데이터베이스의 분할서비스를 운영하면 할수록 데이터의 양이 점점 커지고 그 모든 데이터를 한 테이블에서 나아가 DB에서 감당하기 쉽지 않아진다. 즉, 데이터의 볼륨이 커지면 커질수록 DB의 read/write성능이 감소하고 DB의 병목 현상을 유발한다 그래서 DB를 분할하기 위해 사용할 방법인 파티셔닝과 샤딩을 알아보고자 한다 🥝 파티셔닝파티셔닝은 매우 큰 테이블을 여러개의 테이블로 분할하는 작업이다. 큰 데이터를 여러 테이블로 나눠 저장하기 때문에 쿼리 성능이 개선된다. 이때, 데이터는 물리적으로 여러 테이블로 분산하여 저장되지만, 사용자는 마치 하나의 테이블에 접근하는 것과 같이 사용할 수 있다는 점이 특징이다.  ♬ 파티셔닝의 종류1. List Partitioning지정된 값은 컬럼값을 기반으..
· CS/💾 DB
🧊 JOIN이란?RDBMS는 데이터의 중복을 피하기 위해 데이터를 여러 단위로 쪼개서 여러 테이블로 나눠서 저장한다. 이렇게 분리되어 저장된 데이터에서 원하는 결과를 다시 도출하기 위해 여러 테이블을 조합할 필요가 있다.  서로 관계있는 데이터가 여러 테이블로 나뉘어 저장되므로 각 테이블에 저장된 데이터를 효과적으로 검색하기 위해 조인이 필요하게 된다. 🧊 JOIN의 종류Join을 공부하기 전에 먼저 예시 테이블을 하나 만들어야 한다1. Inner Join여러 어플리케이션에서 사용되는 가장 흔한 결합 방식이며 기본 조인 형식으로 간주되었다.내부 조인은 조인 구문에 기반한 2개의 테이블의 컬럼 값을 결합함으로써 새로운 결과 테이블을 생성한다.JOIN SQL은 명시적 표현과 암묵적 표현법 2가지 구문으로..
· CS/💾 DB
🧊 재고 처리에 대한 동시성 문제동시성 문제는 동일한 데이터에 2개 이상의 스레드, 혹은 세션에서 가변 데이터를 동시에 제어하게 될 때 나타나는 문제이다 만약 하나의 작업이 진행하는 중인데 다른 작업이 끼어들어 데이터를 또 다시 처리하면 데이터가 부숴지게 되는 것이다 이때 나오는 문제가 Concurrency 문제가 발생하는 것이다 간단한 로직우선 재고가 감소하는 로직을 만든다.StockEntity@Entity@Getter@NoArgsConstructor@AllArgsConstructorpublic class Stock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long..
· CS/💾 DB
🌱 데이터 충돌서버에서 트랜잭션을 진행하면 우연이든 필연이든 데이터의 충돌이 일어날 수 있다. 이런 문제를 해결하는 것은 개발자로써 꼭 경험하고 알고 있어야 하는 내용이 아닌가 싶다. 어쨌든 데이터의 일관성이 깨질 수 있기때문에 DB에서 lock을 걸고 관리하는 것을 Locking 이라고 한다해당 Locking의 방식은 두가지의 방식이 있다. 🌱 낙관적 락(Optimistic) 자원에 락을 걸지 않고 데이터 업데이트를 할 때 동시성에 문제가 발생하면 그때 처리하는 것이다.데이터를 수정할때 수정했다고 명시해서 다른 트랜잭션이 동일한 조건으로 값을 수정할 수 없게 하는 것이다.낙관적 락은 동시성이 높은 환경에서 성능을 향상 시킬 수 있지만, 충돌이 발생할 가능성이 높은 경우 롤백이나 재시도가 필요하다충돌..
· CS/💾 DB
해당 내용은 쉬운코드님의 영상을 기반으로 작성되었습니다🔌 들어가기 앞서전 트랜잭션(4)의 마지막 내용에서 read-read 의 상황에서만 데이터가 교류되는 것을 확인하고 그 이외의 상황은 모두 lock으로 인해 접근 할 수 없다는 것을 알았다. 이는 좋지 않은 성능을 나타내기 때문에 해결할 방법으로 MVCC가 있다고 했다.그에 대해 알아보자 🔌 MVCC (Multi Version Concurrency Control)지금까지 봐왔던것과 달리 훨씬 더 개방적인 모습을 볼 수 있다. 근데 이렇게 그림만 보면 그냥 좀 포용력이 좋아졌다 생각될 뿐 어떻게 작동할지 정확히 어떤 이점이 존재할지 바로 떠오르지 않는다 예시로 가보자 ♬ 예시이번예시는 이해하기 힘들겠지만 말로 설명해보고자 한다 ( 나의 이해도 같이 ..
· CS/💾 DB
해당 내용은 쉬운코드님의 영상을 기반으로 제작되었습니다 🔌 LOCK우리는 트랜잭션 (3) 에서 다양한 트랜잭션에 대한 문제를 만나보았다. 거기서 계속해서 진행하던 write는 과연 단순한 값 바꾸기일까? 그것보다 더욱 복잡한 과정이 생길 수 있다. 만약 다른 트랜잭션에서 같은 값을 똑같이 write하려고 한다면 어떻게 되는 걸까? 이때 예상치 못한 문제가 발생할 수 있다 이때 사용하는 것이 바로 lock이라는 것이다. 이때 lock은 운영체제의 lock과 굉장히 비슷하다. 데이터마다 lock 이 있어서 데이터를 변경하거나 읽으려면 lock을 취득해야한다 만약 취득하지 못한다면 얻을 때까지 기다려야한다♬ Lock 을 이해하기 위한 예시1. 트랜잭션 1 : x를 20으로 바꾼다트랜잭션 2 : x를 90으로..
· CS/💾 DB
해당 내용은 쉬운코드님의 영상을 기반으로 제작되었습니다😓 다양한 트랜잭션 문제 예시와 해당 문제의 이름♪ Dirty read트랜잭션 1 : x에 y의 값을 더한다트랜잭션 2 : y 의 값을 70으로 바꾼다 이전 데이터 ▶ x = 10, y = 20상황1번이 실행이 되면 처음에 x의 10을 읽었는데 2번이 실행되었다. 2번은 y를 70으로 바꾸었다. 그리고 1번이 쭈욱 실행이 되고 y가 70이 되었기 때문에 x에 80이라는 숫자로 commit 을 해주고 종료되었다. 하지만 2번이 문제가 발생하면서 y의 데이터가 rollback이 되었다. 이후 데이터 ▶ x = 80, y = 20 정의commit 되지 않은 변화를 읽은 것처럼 나타나는 것이 Dirty Read 이다  ♪ Dir..
· CS/💾 DB
해당 내용은 쉬운코드님의 영상을 기반으로 제작되었습니다 이전 블로그에서 트랜잭션의 4개 특성 중 Isolation 이 굉장히 중요하다는 것과 까다로운 것을 알 수 있었다. https://latewalk.tistory.com/230 💾 Transaction, 트랜잭션이란? 해당 내용은 쉬운코드님의 영상을 기반으로 제작되었습니다 🔌 트랜잭션이란? 단일한 논리적인 작업의 단위 여러개의 SQL문들을 단일 작업으로 묶어 나눠질 수 없게 만든 것 transaction의 SQL문들 latewalk.tistory.com 정말 간단히 알아본 Isolation에서 좀 더 깊게 알아보는 시간을 가져보자 🔌 예시 상세 설명 이전 시간에 간단하게 작성한 예시를 상세하게 설명해보자 상황1. J가 H에게 20만원을 이체하려고 한다..
· CS/💾 DB
해당 내용은 쉬운코드님의 영상을 기반으로 제작되었습니다 🔌 트랜잭션이란? 단일한 논리적인 작업의 단위 여러개의 SQL문들을 단일 작업으로 묶어 나눠질 수 없게 만든 것 transaction의 SQL문들은 일부만 성공될 수 없다. 🔌 Commit & Rollback Commit 현재까지 작업한 내용을 DB에 영구적으로 저장한다 그리고 transaction은 종료한다. rollback 지금까지 작업들은 모두 취소하고 transaction 이전 상태로 되돌린다 그리고 transaction은 종료한다. AutoCommit ● 각각의 SQL문을 자동으로 transaction 처리 해주는 개념이다 ● SQL문이 성공적으로 실행하면 자동으로 commit 한다 ● 실행 중 문제가 발생하면 자동으로 rollback 된다..