본문 바로가기

🔍 CS/데이터베이스31

12/18 - TIL : Driving, Driven Driving과 Driven은 일반적으로 주도하는 역할과 주도 당하는 역할을 의미한다. 기술적인 맥락에서 보면 다음과 같다. Driving : 시스템 또는 구조에서 주요 동작을 결정하거나 제어하는 주체를 의미한다. ex. 절차적 프로그래밍이나 명령형 프로그래밍에서 개발자가 프로그램의 흐름을 직접 제어(if - else 문 등을 사용하여 프로그램의 흐름을 직접 설계)하며 드라이빙 역할을 수행Driven : 시스템에서 외부 입력이나 특정 조건에 의해 동작하는 대상을 의미한다. ex. Event-Driven Architecture : 특정 이벤트가 발생하면 동작을 수행하는 시스템, 외부 요청에 의해 실행되는 구조로 드리븐 상태이다.  Database의 드라이빙과 드리븐은 무엇일까?  | Join 에서의 Dri.. 2024. 12. 18.
11/30 - TIL : MongoDB 지난 번에, NoSQL 중 하나인 Redis에 대해 알아보았다.  이번에는 NoSQL 중 가장 많이 사용되는 데이터베이스인 MongoDB에 대해 알아보고자 한다.   NoSQL에 대해서 간단하게 설명을 해보자면, NoSQL은 Not Only SQL로 관계형 데이터베이스와는 달리 스키마(데이터 구조, 제약 조건을 정의한 설계도) 없이 사용 가능하거나, 느슨한 스키마를 제공하는 저장소이다.  NoSQL은 저장 방식에 따라 나뉘는데, MongoDB는 Document 모델의 데이터베이스이다. Document : Key-Value 모델을 개념적으로 확장한 구조, 하나의 키(문서에 대한 ID로 표현)에 하나의 구조화된 문서를 저장하고 조회, 저장된 문서를 컬렉션으로 관리하며, 문서 저장과 동시에 문서 ID에 대한 .. 2024. 11. 30.
11/27 - TIL : JDBC, MyBatis, Hibernate Application 개발에 있어서 가장 대표적인 아키텍처는 Layered Architecture이다. 애플리케이션을 논리적으로 분리된 계층(layers)으로 나누어 설계하는 방법이다. 각 계층은 특정 역할과 책임을 가지며, 계층 간 상호작용은 명확히 정의된 인터페이스를 통해 이루어진다.  Layered Architecture로 개발을 하다 보면, n-tier(application을 물리적 또는 논리적 계층으로 나누기)로 구성을 하게 되는데, 흔히 3-tier 혹은 4-tier로 구성을 한다. 3-tier : Presentation Tier (UI Layer) - Application Tier (Business Logic Layer) - Data Tier (Database Layer) 4-tier : P.. 2024. 11. 27.
11/24 - TIL : NoSQL과 Redis Redis는 NoSQL 데이터베이스 중 하나로, Key-Value Store로 작동하는 인메모리 데이터베이스이다.   NoSQL은 무엇일까? NoSQL에 대해 알아보자. NoSQL NoSQL은 Not Only SQL로 관계형 데이터베이스와는 달리 스키마(데이터 구조, 제약 조건을 정의한 설계도) 없이 사용 가능하거나 느슨한 스키마를 제공하는 저장소이다. 주로, 대량의 분산된 데이터를 저장하고 조회하는 데 많이 사용된다. NoSQL은 저장 방식에 따라 Key-Value, Document, Column 모델로 나뉜다. 간단하게 알아보면 다음과 같다. Key-Value : 가장 기본적인 형태의 NoSQL, 하나의 키로 하나의 데이터 저장 및 조회 (단일 키 - 값 구조), 고속 읽기와 쓰기에 최적화 Docum.. 2024. 11. 24.
동시성 제어하기 - 07. 읽기와 쓰기의 트레이드 오프 병목 해소하기 쓰기 지점의 병목은 하나의 레코드를 점유 → 락 대기가 발생 락 대기를 풀고자 테이블 형식으로 분리 → 조회 지점의 병목이 발생 조회 지점의 병목은 카운트로 처리 INSERT 했던 데이터들을 aggregation해서 sum 하기 위해서 매번 카운트 쿼리가 발생 데이터의 성질 확인하기 정합성을 요구하는 데이터인가? 예시) 좋아요수가 0.1초의 딜레이를 가진다고 해서 고객에게 엄청난 손해를 주는 데이터인가? 그렇지 않다. 좋아요 수는 어느 정도의 실시간성만 보장만 된다면 괜찮다. 클라이언트는 웹 서버에 좋아요 누름에 대한 요청을 한다. 웹 서버는 좋아요 테이블에 INSERT를 한다. 조회 시점은 게시물 테이블 컬럼에 캐싱을 해놓는다. 특정 주기를 가진 스케쥴러가 좋아요 테이블을 주기적으로 co.. 2023. 6. 7.
동시성 제어하기 - 04. 낙관적 락 동시성 제어를 위한 가장 보편적인 방법은 락을 통한 줄세우기 → 비관적 락 락을 통한 동시성 제어는 불필요한 대기 상태를 만듦 MySQL에서는 인덱스를 잠그기 때문에 WHERE문 조건에 따라서 불필요한 데이터들이 잠기기도 함 동시성이 빈번하지 않은 쿼리로 인해 다른 쿼리가 대기한다면? 동시성 이슈가 빈번하지 않길 기대하고, 어플리케이션에서 제어한다. → 낙관적 락의 기본 개념 CAS(compare and set) 낙관적 락에서 어떻게 어플리케이션에서 제어하는가? → CAS를 통해 제어한다. 예제를 통해 살펴보자. 예제) 지난 예제와 다른 점은 버전이 추가되었다는 것이다. 낙관적 락에서는 레코드 하나에 대해서 버전을 매긴다. (버전 관리를 통해 내가 조회했던 버전이 맞는지 확인을 하고 맞다면 업데이트를 하.. 2023. 6. 7.
동시성 제어하기 - 02. 쓰기락과 읽기락 - 이론 동시성 제어를 위한 가장 보편적인 방법은 락을 통한 줄세우기 쓰기락과 읽기락 락을 통해 동시성을 제어할 때는, 락의 범위를 최소화 하는 것이 중요 → 락을 잡는동안 수행하는 작업의 범위를 최소화 하는 것 락의 범위가 크면 클수록 락을 획득하기 위한 여러 트랜잭션들이 대기하는 시간이 길어짐 → 그만큼 성능도 내려간다. 락의 범위가 길어질수록 Connection Pool을 점유하는 시간이 길어짐 → 최악의 경우에는 Connection Pool 고갈로 이어질 수 있음 MySQL에서는 트랜잭션의 커밋 혹은 롤백시점에 잠금이 풀림 → 트랜잭션이 곧 락의 범위 따라서 여기서는 락의 범위를 최소화 한다는 것은 하나의 트랜잭션을 최소화 한다는 것임 예시) 만약 S3이미지를 업로드 한다고 했을 때 이것이 트랜잭션 범위안.. 2023. 6. 7.
동시성 제어하기 - 01. 멀티 스레드 환경에 대한 이해 대부분 하나의 웹 서버는 여러 개의 요청을 동시에 수행할 수 있다. → 작성한 코드 한 줄은 동시에 수행 될 수 있다. → 하나의 자원을 두고 여러 개의 연산들이 경합을 하기 때문에 데이터 정합성을 깨뜨릴 수 있다. 예제를 통해 위의 상황을 이해해보자. 예제) 상황 : 100원을 출금하는 요청이 동시에 발생 첫번째 트랜잭션이 홍길동의 잔고를 읽고 출금 금액을 확인 → 잔고가 넉넉한지를 확인 → 출금금액 만큼 기존의 잔고에서 빼주어서 홍길동의 잔고를 UPDATE 첫번째 트랜잭션이 홍길동의 잔고를 읽고 출금 금액을 확인하는 과정 바로 후에 두번째 트랜잭션이 홍길동의 잔고를 읽는 상황이 발생했다고 가정 첫번째 트랜잭션은 그대로 100원을 빼고 900원을 업데이트함 두번째 트랜잭션은 잔고가 1000원으로 확인되.. 2023. 6. 7.
데이터 정합성 보장을 위한 트랜잭션 이해하기 - 04. 트랜잭션 격리레벨 Isolation - 트랜잭션은 서로 간섭하지 않고 독립적으로 동작한다. READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE READ 위의 4가지는 Dirty Read Non Repeatable Read Phantom READ 이 3가지 중 몇가지를 방지하는가 혹은 허용하는가로 격리레벨이 결정된다. Dirty Read 예제) 홍길동이 김국밥에게 900원을 송금하는 상황 트랜잭션 격리레벨은 여러 트랜잭션들이 존재할 때 서로 간섭하지 않는가이다. 트랜잭션 2개가 거의 비슷한 시간에 진입했다고 가정해보자. 첫번째 트랜잭션 : 900원을 출금시키기 위해 홍길동의 잔고(1000원)를 가져옴 그리고 곧바로 900원을 이체시키기 위해 김국밥 잔액에 900원을 .. 2023. 6. 7.
데이터 정합성 보장을 위한 트랜잭션 이해하기 - 02. 트랜잭션 A, C, I, D 트랜잭션 ACID ACID의 사전적 정의보다는 ACID가 어떤 이유에서 나왔고 어떤 기술들이 ACID를 가능하게 하는지가 중요 사전적 정의 : 데이터베이스 트랜잭션(데이터에 대한 하나의 논리적 실행단계)이 안전하게 수행된다는 것을 보장하기 위한 성질을 가지키는 약어 Atomicity(원자성) : 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력 원자적 연산을 보장해야 함 → All or Nothing (중간에 연산이 수행하다가 멈추지 않음) 어떻게 보장? MVCC를 통해 UPDATE가 일어나면 기존의 데이터에 900원을 더해주고 UPDATE 전의 데이터는 사라지는 것이 아닌 Undo Log에 저장 만약 트랜잭션이 실패하게 되면 Undo Log에 있는 데이터로 복원 Undo.. 2023. 6. 7.
데이터 정합성 보장을 위한 트랜잭션 이해하기 - 01. 트랜잭션이 없는 세상은 트랜잭션이 필요한 이유 상황 : 홍길동이 김국밥에게 900원을 송금 READ (홍길동 잔고) UPDATE (김국밥 잔액) = 김국밥 잔액 + 900 3. UPDATE(홍길동 잔액) = 홍길동 잔액 - 900 문제1. 만약 3번 과정(UPDATE(홍길동 잔액) = 홍길동 잔액 - 900)에서 실패를 한다면? 따라서 SQL문을 마치 하나의 오퍼레이션으로 묶을 수 있어야 함 : 트랜잭션 → 1~3번 과정을 하나의 오퍼레이션으로 묶을 수 있어야 함 문제2. 2번 과정후 3번 과정 전 사이에 김국밥이 1400원을 출금해버린다면? → 3번 과정은 실패를 할 것임 따라서, 처리 중인 데이터를 다른 곳에서 조회하게 되면 문제가 발생 → 트랜잭션 격리레벨을 따로 지정할 수 있어야 함 2023 KAKAO Tech Camp.. 2023. 6. 6.
타임라인 최적화 - 06. 타임라인에서 배우는 트레이드 오프 Push Model은 공간 복잡도를 희생, Pull Model은 시간 복잡도를 희생 정합성과 성능 Push Model vs Pull Model 중 어떤 것이 정합성을 보장하기 쉬울까? Pull Model : 원본 데이터를 직접 참조하므로, 정합성 보장에 유리 반면, Follow가 많은 회원일수록 처리 속도가 느리다. Pull Model의 예시) Facebook Push Model의 예시) Twitter Facebook : 5000명이 되었을 때는 내가 친구를 끊어야 다른 사람을 친구로 등록 가능 Twitter : 5000명이 최대여도 나를 팔로우한 사람이 더 늘어난다면, 다른 사람 팔로우 가능 Push Model에서는 게시물 작성과 타임라인 배달의 정합성 보장에 대한 고민이 필요하다. 모든 회원의 타임라.. 2023. 6. 6.