정규화(Normalization)란?
·
Database
정규화(Normalization)정규화: 데이터의 중복과 삽입, 갱신, 삭제 시 발생할 수 있는 이상 현상(insert, update, deletion anomaly)을 최소화하기 위해 일련의 정규화(Normal Forms, NF)에 따라 관계형 데이터베이스를 구성하는 과정이다.NF: 정규화되기 위해 준수해야 하는 몇 가지 rule 정규화 과정 : 1NF -> 2NF -> 3NF -> BCNF보통 실무에서는 3NF 혹은 BCNF 까지 만족하면 정규화되었다고 말한다. (최소 정규화 단계) 왜 정규화를 해야 할까?정규화를 하는 궁극적인 목표는 데이터의 중복을 줄이고 데이터의 무결성과 일관성을 유지하기 위해서이다. 비정규화된 데이터베이스 테이블 (고객 정보와 주문 정보를 하나의 테이블에 저장)    ID   ..
MVCC(Multi-Version Concurrency Control) 개념
·
Database
MVCC(Multi Version Concurrency Cotnrol)란?개념MVCC(Multi-Version Concurrency Control)은 데이터베이스에서 동시성을 제어하는 방법 중 하나로, 다수의 사용자가 동시에 데이터베이스를 사용할 때 트랜잭션 간의 격리 수준을 유지하여 동시성을 제어한다. MVCC의 가장 큰 목적은 Lock을 사용하지 않고 일관된 읽기를 제공하는 것이다. 동작 원리MVCC는 데이터의 버전(snapshot)을 관리함으로써 동시성을 관리한다.-> MVCC에서 Multi version인 이유가 하나의 데이터에 대해 여러 개의 버전이 동시에 관리된다는 의미이다.예를 들어, 두  트랜잭션의 read-write 간 데이터를 읽는(read) 시점에 해당 데이터의 스냅샷을 유지하고 다른..
Connection을 미리 생성하는 이유
·
Database
Spring Boot을 사용하면 Connection pool에 미리 Connection을 생성하는데, 미리 생성하는 이유로 DB와 connection을 맺는 비용이 크기 때문에 애플리케이션 시작 시 미리  pool에 생성해 두어 필요할 때마다 꺼내 사용한다고 알고 있다. DB와 애플리케이션이 Connection을 맺는데 비용이 큰 이유가 뭘까?우리는 애플리케이션과 DB가 통신하는 방법을 알아야 한다.기본적으로 애플리케이션과 DB 서버와 통신을 하는 방법은 TCP/IP를 통해 통신을 하게 된다.TCP/IP는 신뢰성이 높은 통신 방법으로 신뢰성을 보장하기 위해 3-way handshake 과정을 통해 연결을 하고 연결을 종료할 때는 4-way handshake 과정을 통해 연결을 종료하게 된다. https:..
[E-commerce] 캐시를 통한 애플리케이션 성능 개선
·
Database
Redis 캐시 읽기 전략Look Aside (Cache Aside)데이터를 조회할 때, 캐시에 저장된 데이터가 읽는지 확인하고 없으면 DB에서 조회하는 전략캐시에 장애가 생겨도 DB에서 조회하면 되기 때문에 캐시 장애가 애플리케이션에 영향을 미치지 않는다.동일 조회 쿼리가 반복적으로 발생하는 상황에서 적합한 전략Read ThroughLook Aside 전략과 다르게 데이터를 캐시에서만 조회하는 전략조회하려는 데이터가 캐시에 없으면 캐시에서 DB에 접근하여 조회 후 캐시에 저장DB에 접근하는 횟수를 줄여 성능을 높일 수 있지만 캐시에 장애가 발생할 경우 애플리케이션에 영향을 미친다.Redis 캐시 쓰기 전략Write Back비동기로 캐시와 DB를 동기화 한다.DB에 저장할 데이터를 캐시에 저장해두었다가..
[E-commerce] 쿼리 분석 및 인덱스 설계를 통한 성능 개선
·
Database
인덱스(Index)인덱스는 책의 목차와 비슷하다고 생각하면 편하다.책의 목차를 보고 어디에 무엇이 있는지 바로 확인할 수 있는 것 처럼 인덱스도 바로 찾고자 하는 데이터를 찾을 수 있다. 목차도 "ㄱ", "ㄴ" 순으로 정렬되어 있는 것 처럼 인덱스도 정렬되어 보관이 된다.그래서 미리 정렬된 상태에서 새로운 인덱스를 추가,삭제, 변경하는 작업은 느리지만 조회(SELECT)하는 작업은 빠르게 처리 가능하다. 즉, 인덱스는 데이터 저장 성능을 희생하고 데이터의 읽기 속도를 높이는 기능이다.B-TreeB-Tree는 칼럼의 원래 값을 변형시키지 않고 인덱스 구조체 내에서는 항상 정렬된 상태로 유지한다.B-Tree는 트리 구조이며, 최상상위에 "루트 노드(Root node)"하나가 존재하며, 하위에 자식 노드가 붙..
[E-commerce] 동시성 문제 해결하기 (비관적 락, 네임드 락, 분산 락)
·
Database
이커머스 서비스에서 발생할 수 있는 동시성 문제들을 정리하고, 다양한 방법으로 동시성 문제를 해결해 보며 겪은 경험들을 공유해 보자 합니다. 동시성 문제가 발생할 수 있는 유즈케이스Case 1 (조회한 상품 재고 수량이 맞지 않는 경우)1. 사용자 A가 재고가 5개인 상품을 조회하고 재고 1개 차감 요청, 트랜잭션 시작2. 사용자 B가 동시에 동일 상품의 상품을 조회, A의 트랜잭션이 아직 커밋되지 않았기 때문에 재고가 5개인 것으로 확인3. 사용자 A의 트랜잭션이 커밋되어 실제 재고는 4개로 업데이트4. 실제 상품의 재고는 4개이지만 사용자 B가 조회한 상품의 재고는 5개로 재고 정합성 불일치 문제 발생 Case 2 (동시에 상품을 주문할 때, 상품의 재고가 부족한 경우)1. 사용자 A가 재고 3개 차..