#데이터베이스
28 편의 글
PostgreSQL 기초 강좌 #6 트랜잭션과 MVCC: 동시성의 기본 원리
여러 접속이 같은 데이터를 동시에 만질 때 PostgreSQL이 일관성을 지키는 방식을 다룹니다. BEGIN·COMMIT·ROLLBACK의 기본과 원자성, MVCC(다중 버전 동시성 제어)의 핵심인 "읽기는 쓰기를 막지 않는다", UPDATE가 실제로는 새 버전 행을 만든다는 사실과 dead tuple의 예고, 기본 격리 수준 Read Committed의 의미와 함정, Repeatable Read·Serializable을 올려 쓰는 경우까지 다루겠습니다.
SQLAlchemy 2.0 #5 관계 매핑: 1:N, N:M, 그리고 N+1 문제
ORM의 꽃이자 함정인 relationship을 정리합니다. 외래 키와 relationship의 역할 분담, back_populates로 양방향을 잇는 1:N 선언, secondary 테이블을 쓰는 N:M, 부모 삭제 시 자식 처리를 정하는 cascade와 delete-orphan, 지연 로딩이 만들어 내는 N+1 문제를 echo 로그로 확인하는 법, selectinload와 joinedload로 해결하는 기준까지 다룹니다.
PostgreSQL 기초 강좌 #5 EXPLAIN 읽는 법: 실행 계획으로 쿼리 진단하기
쿼리가 느린 이유를 추측이 아니라 실행 계획으로 확인하는 방법을 다룹니다. EXPLAIN과 EXPLAIN ANALYZE의 차이(후자는 실제 실행), 계획 트리를 안쪽부터 읽는 순서, Seq Scan·Index Scan·Index Only Scan·Bitmap Scan의 의미, cost와 actual time·rows의 추정치와 실측치 비교, 추정이 크게 어긋날 때의 처방(ANALYZE), 그리고 BUFFERS로 읽기량을 보는 습관까지 다루겠습니다.
SQLAlchemy 2.0 #4 세션: 변경 추적, flush와 commit, 객체의 네 가지 상태
ORM의 심장인 Session을 정리합니다. 세션이 단위 작업(Unit of Work)으로 변경을 모았다가 한 번에 SQL로 내보내는 원리, flush와 commit의 차이, transient·pending·persistent·detached라는 객체의 네 가지 상태, 같은 행은 같은 객체로 돌려주는 identity map, commit 후 속성 접근이 다시 쿼리를 날리는 이유, 웹 애플리케이션에서 요청당 세션 하나라는 스코프 원칙까지 다룹니다.
PostgreSQL 기초 강좌 #4 인덱스는 언제 사용되는가
조회를 빠르게 만드는 인덱스를 PostgreSQL 기준으로 다룹니다. B-tree 인덱스가 조회를 바꾸는 구조, 인덱스를 만들었는데도 사용되지 않는 대표 원인들(선행 컬럼 불일치, 컬럼에 함수 적용, 자료형 불일치, 낮은 선택도), 쓰기 성능과 저장 공간이라는 비용, 그리고 "느린 쿼리의 WHERE·JOIN·ORDER BY를 보고 만든다"는 실무 순서까지 다루겠습니다.
SQLAlchemy 2.0 #3 ORM 모델 정의: DeclarativeBase, Mapped, mapped_column
테이블을 파이썬 클래스로 선언하는 2.0 스타일 ORM 모델 정의를 정리합니다. DeclarativeBase를 상속하는 구조, Mapped 타입 힌트와 mapped_column의 역할 분담, 파이썬 타입이 DB 타입으로 매핑되는 규칙, Optional과 nullable의 연동, 기본값·유니크·인덱스 선언, 제약 조건 이름을 자동으로 붙이는 네이밍 컨벤션까지 다룹니다.
PostgreSQL 기초 강좌 #3 조인과 집계: 읽기 쿼리의 실무 감각
읽기 쿼리의 실무 8할을 차지하는 조인과 집계를 다룹니다. INNER와 LEFT 조인의 선택 기준과 LEFT 조인 결과를 WHERE로 걸러 INNER로 만들어 버리는 고전적 실수, GROUP BY와 HAVING의 역할 구분, 집계와 조인이 섞일 때의 중복 집계 함정, 서브쿼리와 조인의 갈림길, 그리고 그룹별 최신 1건을 뽑는 PostgreSQL다운 방법(DISTINCT ON)까지 다루겠습니다.
SQLAlchemy 2.0 #2 엔진과 트랜잭션: 커넥션 풀, commit의 두 가지 패턴
SQLAlchemy의 토대인 엔진과 트랜잭션을 정리합니다. 커넥션 풀이 왜 필요하고 어떻게 동작하는지, pool_size와 max_overflow가 실제로 제한하는 것, connect()와 begin()으로 갈리는 commit-as-you-go와 begin-once 패턴, 트랜잭션이 자동 커밋되지 않는 이유, MetaData와 Table로 테이블을 정의하고 Core 표현식으로 CRUD를 실행하는 것까지 다룹니다.
PostgreSQL 기초 강좌 #2 자료형과 테이블 설계: 무엇으로 저장할 것인가
PostgreSQL 설계의 절반은 자료형 선택입니다. 문자열은 text 하나로 충분한 이유, 돈 계산에서 numeric이 필수인 이유, 시각 저장의 표준인 timestamptz와 timestamp의 함정, 기본 키 전략(bigint IDENTITY vs UUID, 그리고 uuidv7), NOT NULL·CHECK·외래 키로 데이터 무결성을 DB 층에서 지키는 설계, enum과 배열을 쓸 곳까지 다루겠습니다.
SQLAlchemy 2.0 #1 전체 그림: Core와 ORM, 그리고 2.0 스타일
파이썬 DB 라이브러리의 사실상 표준인 SQLAlchemy를 바닥부터 정리하는 시리즈의 첫 편입니다. Core와 ORM이라는 두 층의 구조, 1.x 시절 코드와 2.0 스타일이 다른 이유, select() 중심으로 통일된 쿼리 방식과 타입 힌트 지원, 설치와 첫 연결, text()로 SQL을 직접 실행하는 것까지 다룹니다.
PostgreSQL 기초 강좌 #1 PostgreSQL이란: 널리 쓰이는 데이터베이스가 된 이유, 설치와 psql 첫 사용
PostgreSQL이 신규 프로젝트의 기본 데이터베이스가 된 배경부터 시작합니다. 표준 준수와 풍부한 자료형, 확장 생태계(pgvector·PostGIS), 관대한 라이선스라는 선택의 이유, 도커로 로컬에 띄우는 가장 빠른 설치, psql 접속과 메타 명령(\l, \dt, \d)의 기본기, 첫 테이블을 만들고 넣고 조회하는 한 사이클, 그리고 강좌 전체의 지도까지 다루겠습니다.
Redis가 빠른 이유: 메모리, 단일 스레드, 자료구조
Redis가 초당 수십만 요청을 처리하는 구조적 이유를 정리합니다. 디스크 없는 메모리 접근, 락이 필요 없는 단일 스레드 이벤트 루프, 목적에 맞게 구현된 자료구조라는 세 기둥과, 단일 스레드의 함정(느린 명령이 전체를 막는 구조), 그리고 Redis가 느려지는 경우까지 다룹니다.