모든 포스트

PostgreSQL 기초 강좌 #8 뷰·CTE·윈도 함수: 복잡한 쿼리를 읽기 쉽게
4 분 소요

PostgreSQL 기초 강좌 #8 뷰·CTE·윈도 함수: 복잡한 쿼리를 읽기 쉽게

커진 쿼리를 구조화하는 세 가지 도구를 다룹니다. 반복되는 쿼리에 이름을 붙이는 뷰와 물리 사본인 구체화 뷰의 구분, WITH 절(CTE)로 쿼리를 단계별로 서술하는 법, 윈도 함수의 기본 구조(OVER, PARTITION BY)와 ROW_NUMBER로 그룹별 상위 N건을 뽑는 대표 패턴, 집계 함수와 윈도 함수의 차이(행이 줄지 않음), LAG로 전월 대비를 구하는 예까지 다루겠습니다.

Rust 기초 강좌 #8 트레이트와 제네릭: 상속 없이 공통 동작을 정의하는 법
4 분 소요

Rust 기초 강좌 #8 트레이트와 제네릭: 상속 없이 공통 동작을 정의하는 법

지금까지 미뤄 온 개념을 회수하는 편입니다. 공통 동작을 정의하는 트레이트(trait)와 기본 구현, 타입을 일반화하는 제네릭과 트레이트 바운드, derive가 자동 생성하는 표준 트레이트(Debug·Clone·Copy·PartialEq), 제네릭이 런타임 비용 없이 컴파일되는 단형화, 그리고 Box<dyn Error>의 dyn이 뜻하는 동적 디스패치까지 다루겠습니다.

SQLAlchemy 2.0 #7 Alembic과 실전 구성: 마이그레이션, 비동기, 팀 규약
6 분 소요

SQLAlchemy 2.0 #7 Alembic과 실전 구성: 마이그레이션, 비동기, 팀 규약

시리즈 마지막 편으로 운영 단계의 주제를 정리합니다. create_all이 스키마 변경을 해결하지 못하는 이유와 Alembic 도입, autogenerate가 감지하는 것과 놓치는 것, 마이그레이션 파일 리뷰 원칙, create_async_engine과 AsyncSession으로 넘어가는 비동기 구성과 지연 로딩 제약, 모델·세션·설정을 배치하는 프로젝트 구조, 팀에서 지킬 규약까지 다룹니다.

PostgreSQL 기초 강좌 #7 JSONB: 관계형 데이터베이스에 유연함 더하기
4 분 소요

PostgreSQL 기초 강좌 #7 JSONB: 관계형 데이터베이스에 유연함 더하기

PostgreSQL이 NoSQL의 자리까지 넘보게 만든 JSONB를 다룹니다. json과 jsonb의 차이(jsonb가 기본값인 이유), 값 꺼내기 연산자(->, ->>, #>>)와 존재·포함 연산자(?, @>)의 사용법, JSONB 검색을 받치는 GIN 인덱스, 갱신(jsonb_set)의 특성, 그리고 가장 중요한 "어디까지 컬럼으로 두고 어디부터 JSONB에 넣는가"의 설계 경계까지 다루겠습니다.

Rust 기초 강좌 #7 컬렉션과 이터레이터: Vec·String·HashMap과 for문을 대체하는 체인
4 분 소요

Rust 기초 강좌 #7 컬렉션과 이터레이터: Vec·String·HashMap과 for문을 대체하는 체인

실무 코드의 몸통인 세 컬렉션을 다룹니다. 가변 길이 배열 Vec과 인덱스 대신 get을 쓰는 이유, 왜 String은 인덱스로 접근할 수 없는지(UTF-8과 바이트·문자의 차이), HashMap과 entry API, 그리고 for 반복문을 map·filter·collect 체인으로 바꾸는 이터레이터 스타일과 지연 평가까지 다루겠습니다.

SQLAlchemy 2.0 #6 쿼리 심화: 조인, 집계, 서브쿼리, 대량 처리
5 분 소요

SQLAlchemy 2.0 #6 쿼리 심화: 조인, 집계, 서브쿼리, 대량 처리

select() 하나로 실전 쿼리를 조립하는 법을 정리합니다. scalars와 execute의 반환 형태 차이, 여러 조건과 or_, 조인과 명시적 ON 절, group_by와 집계 함수에 라벨을 붙여 읽는 법, 서브쿼리와 EXISTS, LIMIT·OFFSET 페이지네이션과 그 한계, ORM 단위 작업을 우회하는 대량 INSERT·UPDATE까지, 2.0 스타일 쿼리의 실무 레퍼토리를 다룹니다.

PostgreSQL 기초 강좌 #6 트랜잭션과 MVCC: 동시성의 기본 원리
4 분 소요

PostgreSQL 기초 강좌 #6 트랜잭션과 MVCC: 동시성의 기본 원리

여러 접속이 같은 데이터를 동시에 만질 때 PostgreSQL이 일관성을 지키는 방식을 다룹니다. BEGIN·COMMIT·ROLLBACK의 기본과 원자성, MVCC(다중 버전 동시성 제어)의 핵심인 "읽기는 쓰기를 막지 않는다", UPDATE가 실제로는 새 버전 행을 만든다는 사실과 dead tuple의 예고, 기본 격리 수준 Read Committed의 의미와 함정, Repeatable Read·Serializable을 올려 쓰는 경우까지 다루겠습니다.

Rust 기초 강좌 #6 에러 처리: Result와 ? 연산자, panic·unwrap 사용 기준
5 분 소요

Rust 기초 강좌 #6 에러 처리: Result와 ? 연산자, panic·unwrap 사용 기준

예외(exception)가 없는 Rust의 에러 처리를 다룹니다. 실패 가능성을 반환 타입에 드러내는 Result, match 중첩을 한 글자로 줄이는 ? 연산자와 에러 전파, main이 Result를 반환하는 실용 형태, 그리고 unwrap·expect·panic을 언제 써도 되고 언제 쓰면 안 되는지의 판단 기준까지 다루겠습니다.

SQLAlchemy 2.0 #5 관계 매핑: 1:N, N:M, 그리고 N+1 문제
5 분 소요

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 읽는 법: 실행 계획으로 쿼리 진단하기
4 분 소요

PostgreSQL 기초 강좌 #5 EXPLAIN 읽는 법: 실행 계획으로 쿼리 진단하기

쿼리가 느린 이유를 추측이 아니라 실행 계획으로 확인하는 방법을 다룹니다. EXPLAIN과 EXPLAIN ANALYZE의 차이(후자는 실제 실행), 계획 트리를 안쪽부터 읽는 순서, Seq Scan·Index Scan·Index Only Scan·Bitmap Scan의 의미, cost와 actual time·rows의 추정치와 실측치 비교, 추정이 크게 어긋날 때의 처방(ANALYZE), 그리고 BUFFERS로 읽기량을 보는 습관까지 다루겠습니다.

Rust 기초 강좌 #5 구조체와 열거형: match와 Option, null이 없는 언어의 설계
4 분 소요

Rust 기초 강좌 #5 구조체와 열거형: match와 Option, null이 없는 언어의 설계

데이터를 구조화하는 두 축인 구조체(struct)와 열거형(enum)을 다룹니다. impl 블록으로 메서드를 붙이는 법, variant마다 다른 데이터를 담는 Rust 열거형의 표현력, 모든 경우를 검사했는지 컴파일러가 강제하는 match, 그리고 null 대신 "값이 없을 수 있음"을 타입으로 드러내는 Option까지, Rust 코드의 뼈대가 되는 도구들을 다루겠습니다.

SQLAlchemy 2.0 #4 세션: 변경 추적, flush와 commit, 객체의 네 가지 상태
5 분 소요

SQLAlchemy 2.0 #4 세션: 변경 추적, flush와 commit, 객체의 네 가지 상태

ORM의 심장인 Session을 정리합니다. 세션이 단위 작업(Unit of Work)으로 변경을 모았다가 한 번에 SQL로 내보내는 원리, flush와 commit의 차이, transient·pending·persistent·detached라는 객체의 네 가지 상태, 같은 행은 같은 객체로 돌려주는 identity map, commit 후 속성 접근이 다시 쿼리를 날리는 이유, 웹 애플리케이션에서 요청당 세션 하나라는 스코프 원칙까지 다룹니다.