DB

DB

[DB] Redis란?

여러 프로젝트를 살펴보니, 인메모리 저장소로 Redis를 사용하는 것을 많이 볼 수 있었습니다. Redis가 무엇이고, 어떤 장점이 있길래 많이 사용하는 걸까요? 프로젝트에 적용하기 전에 간략하게 Redis를 살펴보도록 합시다. 1. Redis란? Redis는 Remote Dictionary Server의 약자로, Key-Value 형태로 데이터를 저장하는 원격 서버를 의미합니다. Redis 공식 홈페이지(https://redis.io/)에서는 Redis를 다음과 같이 간략하게 소개하고 있습니다. ‘Redis는 데이터베이스, 캐시, 메시지 브로커, 스트리밍 엔진으로 사용되는 오픈 소스의 인메모리 데이터 구조 저장소’ 여기서, Redis는 디스크나 SSD가 아닌 메모리에 데이터를 저장하는 인메모리 NoSQ..

DB

[DB] MySQL 및 InnoDB의 DB Lock 알아보기

MySQL에서 사용되는 락은 다음과 같은 2가지 종류로 나뉩니다. MySQL 엔진의 락 스토리지 엔진(InnoDB)의 락 MySQL 엔진의 락, 스토리지 엔진 중 현재 MySQL의 기본 스토리지 엔진인 InnoDB의 락을 알아보도록 하겠습니다. 0. 테스트 환경 구성 도커에서 MySQL 사용 다음과 같은 coupon 테이블, member 테이블에서 진행 1. MySQL 엔진의 락 MySQL 엔진은 MySQL 아키텍쳐에서 스토리지 엔진 위의 계층에 속하기 때문에 MySQL 엔진의 락은 모든 스토리지 엔진에 영향을 미치게 됩니다. MySQL 엔진의 락은 다음과 같은 3종류를 제공합니다. 글로벌 락 (Global Lock) 메타데이터 락 (Metadata Lock) 네임드 락 (Named Lock) 1-1. ..

DB

[DB] MySQL InnoDB의 인덱스(feat. 클러스터링 인덱스, 세컨더리 인덱스, 인덱스 스캔 종류, 다중 컬럼 인덱스)

이전에 전반적인 DB 인덱스에 대해 살펴봤었습니다. https://ksh-coding.tistory.com/122 [DB] DB 인덱스(Index)란? 0. 인덱스란? 인덱스는 ‘색인’이라는 뜻입니다. 색인은 책의 맨 앞 또는 맨 끝에 있는 ‘찾아보기’로 비유되곤 합니다. 요리 레시피 책을 볼 때 제가 관심있는 요리는 오직 ‘김치볶음밥’이 ksh-coding.tistory.com 이번에는 MySQL의 InnoDB에서는 인덱스를 어떻게 구현했는지 살펴보도록 하겠습니다. 1. B-Tree 인덱스를 사용하여 구현 B-Tree는 DB 인덱싱 알고리즘 중 가장 일반적으로 사용되고, 가장 먼저 도입된 알고리즘입니다. MySQL의 InnoDB는 B-Tree 알고리즘을 사용하여 인덱스를 구현하고 있습니다. 그렇다면 B..

DB

[DB] DB 인덱스(Index)란?

0. 인덱스란? 인덱스는 ‘색인’이라는 뜻입니다. 색인은 책의 맨 앞 또는 맨 끝에 있는 ‘찾아보기’로 비유되곤 합니다. 요리 레시피 책을 볼 때 제가 관심있는 요리는 오직 ‘김치볶음밥’이라고 해봅시다. 이때 책의 색인(index)이 존재하지 않는다면 저는 김치볶음밥이 몇 페이지에 존재하는지 모르므로 하나 하나 책의 페이지를 넘기며 김치볶음밥 페이지를 찾아야 할 것입니다. 만약 저자가 이를 배려하여 색인(index)을 ‘김치볶음밥’ - 64p 이런 식으로 기록해놨다면 저는 1p 부터 하나씩 넘기면서 김치볶음밥을 찾지 않고 64p로 바로 찾아갈 것입니다. DB의 인덱스의 목적도 원하는 데이터를 찾아가는 검색 속도를 향상시키기 위함입니다. DB의 인덱스는 다음과 같이 정의할 수 있습니다. DB 데이터의 검색..

DB

[DB] DB Lock이란? (feat. Lock 종류, 블로킹, 데드락)

0. 락(Lock)이란? 여러 커넥션에서 동시에 동일한 자원을 요청할 경우 순서대로 하나의 커넥션만 변경할 수 있게 해주는 기능 동시성을 제어하기 위한 기능 저는 처음에 DB 락을 접했을 때, 락을 이해할 때 ‘락을 획득한다’라는 의미를 ‘외부에서 잠금을 건다.’ 라는 의미로 이해해서 조금 힘들었습니다. 외부에서 잠금을 거는 것이 아니라, ‘내가 화장실 칸을 사용하기 위해 화장실 칸을 직접 들어가서 내가 잠그는 것’의 관점으로 이해하니 더 쉽게 이해할 수 있었습니다. 1. 락의 종류 락의 종류는 크게 다음과 같은 2가지 종류로 나뉩니다. 공유 Lock (Shared Lock, Read Lock, S-Lock) 배타 Lock (Exclusive Lock, Write Lock, X-Lock) 1-1. 공유 ..

DB

[DB] 트랜잭션 격리 수준 알아보기

1. Transaction 격리 수준 (isolation level) 트랜잭션의 격리 수준이란, 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다. - Real MySql 8.0 트랜잭션 격리 수준의 정의는 위와 같습니다. 그렇다면 해당 트랜잭션 격리 수준을 어떠한 기준으로, 무엇을 설정해야 할까요? 결론부터 말하면, 트랜잭션 격리 수준과 관련된 키워드는 '동시성'과 '데이터 정합성'입니다. 따라서 격리 수준을 어떻게 설정하는지에 따라서 동시성과 데이터 정합성이 달라지기 때문에 DB의 트랜잭션 격리 수준을 설정할 때 서비스의 동시성과 데이터 정합성 중 무엇이 중요한지, 얼마나 중요한지를 판단해보고 설정하는 것이 중..

DB

[DB] 트랜잭션이란? (feat. ACID 특성)

🎯 1. 트랜잭션이란? 💡 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위이다. 👉DB의 상태를 변경시킨다는 것은 INSERT, UPDATE, DELETE, SELECT SQL문을 실행하는 것이다! 이때, 작업 단위는 하나의 SQL문이 아닐 수 있다. ⚙️ 작업 단위 예시 사용자가 계좌에 입금을 진행한 후에 입금 후 금액을 보는 예시를 생각해보자. 설계 시 사용자가 금액을 입금하는 UPDATE -> 금액 조회 SELECT 문으로 설계할 것이다. 이때, 작업 단위는 금액을 입금하는 UPDATE -> 금액 조회 SELECT 문이다. 따라서 2개의 SQL문이 하나의 트랜잭션으로 구성되는 것이다. 이처럼 하나의 SQL이 아닌 여러 SQL문이 하나의 트랜잭션으로 구성될 수 있다. 🎯 2. 트랜잭션의 성질..

DB

[DB] 친구 테이블 ERD 설계, 친구 목록 조회 기능 구현(Querydsl 셀프 조인)

처음 프로젝트 진행 시에 친구 테이블을 어떻게 설계해야 할지 감이 안 잡혔었다. 생각해보고, 구글링으로 여러 사례를 참고해서 아래와 같이 친구 테이블 ERD를 설계하였다. 🎯 Friend 테이블 중심 Column friend 테이블에서 중요하게 봐야할 Column은 'from_user_id'와 'to_user_id', 'are_we_friend' 이다. 나머지 컬럼들은 friend User의 정보들이라서 크게 고민해야 할 것은 없다. 1. from_user_id : 친구 요청을 보낸 User의 id 2. to_user_id : 친구 요청을 받은 User의 id (FK로, User 테이블의 PK) 3. are_we_friend : 서로 친구인지 판단하는 Column 따라서 앞으로 설명 시에 위의 3가지 컬..

BE_성하
'DB' 카테고리의 글 목록