본문 바로가기
Database/PostgreSQL

PostgreSQL 트랜잭션 완전 정복: ACID, 격리 수준, WAL 쉽게 이해하기

by daddydontsleep 2025. 4. 8.
728x90
728x90

사진: UnsplashVicko Mozara

안녕하세요! 이번 포스팅에서는 PostgreSQL을 사용하는 분들이 꼭 알아야 할 핵심 개념인 트랜잭션(Transaction)과 관련된 ACID, 그리고 그 핵심 기능인 격리 수준(Isolation Level)WAL(Write-Ahead Logging)까지 초보자도 쉽게 이해할 수 있도록 정리해봤어요!

🚀 먼저, 트랜잭션이란?

트랜잭션은 데이터베이스에서 여러 작업을 하나의 묶음으로 처리하는 단위입니다. 은행에서 돈을 이체할 때, "보내는 사람의 계좌에서 출금" + "받는 사람의 계좌에 입금"이 동시에 이뤄져야 하죠? 이처럼 하나의 작업처럼 보장되어야 하는 연산들을 트랜잭션이라 부릅니다.

✅ ACID란?

ACID는 데이터베이스 트랜잭션이 안정적이고 일관되게 동작하도록 보장하는 4가지 성질을 말합니다. PostgreSQL은 이 ACID를 충실히 지키는 대표적인 DB입니다!

속성 설명 PostgreSQL 예시
A - Atomicity (원자성) 트랜잭션 내 작업은 전부 성공하거나 전부 실패 BEGIN ~ COMMIT 중 오류 발생 시 ROLLBACK
C - Consistency (일관성) 트랜잭션 전후 데이터는 항상 유효한 상태여야 함 CHECK, NOT NULL, FOREIGN KEY
I - Isolation (격리성) 여러 트랜잭션이 동시에 실행돼도 서로 간섭 없이 동작 격리 수준 사용 → 아래에서 자세히 설명
D - Durability (지속성) 트랜잭션이 완료되면 시스템 장애가 나도 데이터는 보존 WAL(Write-Ahead Logging) 기능 사용

🔍 각 속성을 PostgreSQL 예제로 쉽게 이해해봐요!

1. 🔹 Atomicity (원자성)

BEGIN;

UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;

COMMIT;

➡️ 만약 중간에 오류가 나면 ROLLBACK으로 전체 취소됩니다.
💬 쉽게 말하면: "하나라도 실패하면 전부 되돌려!"

2. 🔹 Consistency (일관성)

CREATE TABLE accounts (
  id SERIAL PRIMARY KEY,
  balance INT CHECK (balance >= 0)  -- 잔고는 0 이상
);

-- 잘못된 값 입력 시
UPDATE accounts SET balance = -500 WHERE id = 1;
-- ▶ 오류 발생

💬 쉽게 말하면: "규칙 어긴 데이터는 안 받아요!"

3. 🔹 Isolation (격리성)

트랜잭션이 겹쳐도 서로 방해되지 않도록 하는 기능이에요. PostgreSQL은 격리 수준을 설정하여 이 동작을 제어할 수 있어요 👇

PostgreSQL 격리 수준 4단계

수준 설명 초보자 해석
Read Uncommitted 다른 트랜잭션이 커밋하지 않은 데이터도 볼 수 있음 (PostgreSQL에서는 Read Committed로 동작) "아직 저장 안 된 것도 볼 수 있어요"
Read Committed (기본값) 다른 트랜잭션이 COMMIT한 데이터만 읽기 가능 "저장된 것만 볼게요"
Repeatable Read 트랜잭션 내에서는 같은 SELECT는 항상 같은 결과 "보는 데이터가 항상 같아야 해!"
Serializable 완전히 순차적으로 실행한 것처럼 보장 "줄 서서 한 명씩만 일해!"

참고: PostgreSQL에서는 특이하게도 Read Uncommitted 격리 수준을 설정하더라도 내부적으로는 Read Committed와 동일하게 동작합니다. PostgreSQL은 디자인 결정으로 "Dirty Read"(커밋되지 않은 데이터 읽기)를 허용하지 않기 때문입니다.

BEGIN ISOLATION LEVEL REPEATABLE READ;
-- 트랜잭션 내 동일한 SELECT는 동일한 결과를 반환
COMMIT;

💬 쉽게 말하면: "동시에 일해도 서로 눈치 안 보게 처리해줘!"

4. 🔹 Durability (지속성)

PostgreSQL은 WAL(Write-Ahead Logging) 기능으로 지속성을 보장합니다.

WAL이란?

변경 내용이 실제로 데이터베이스에 적용되기 전에 먼저 로그로 남기는 방식입니다.

순서 흐름

  1. UPDATE, DELETE, INSERT 요청
  2. PostgreSQL이 변경 내용을 WAL에 기록
  3. 나중에 실제 테이블에 반영
  4. 장애 발생 시 WAL을 통해 복구 가능

💬 쉽게 말하면: "일단 메모장에 써놓고, 나중에 실제 적용해서 안심!"

📂 관련 경로

  • WAL 파일은 pg_wal/ 디렉토리에 저장됨

❓ 자주 묻는 질문 (FAQ)

"Serializable이 너무 느린가요?"

네, Serializable 격리 수준은 가장 안전하지만 성능이 가장 떨어집니다.

왜 느린가요?

  • 모든 트랜잭션이 마치 한 줄로 서서 차례대로 실행되는 것처럼 동작하기 때문
  • 동시성이 크게 떨어짐 (동시에 많은 일을 못함)
  • 특히 SELECT FOR UPDATE와 같은 명령어 사용 시 행 락(lock)이 많이 발생

해결 방법

  1. 필요한 곳에만 사용하기

    -- 전체 트랜잭션이 아닌 특정 테이블만 FOR SHARE나 FOR UPDATE로 잠금
    BEGIN;
    SELECT * FROM critical_table FOR UPDATE;
    -- 작업 수행
    COMMIT;
  2. Read Committed 격리 수준 활용

    • 대부분의 일반적인 상황에선 기본 격리 수준인 Read Committed로도 충분
    • 특별히 데이터 일관성이 중요한 부분만 Serializable 사용
  3. 적절한 인덱스 사용

    • 적절한 인덱스가 있으면 락 경합이 줄어들어 성능 개선

"WAL 용량 줄이는 방법은요?"

WAL은 데이터베이스의 안정성을 위한 핵심 기능이지만, 디스크 공간을 많이 차지할 수 있습니다.

WAL 관리 방법

  1. max_wal_size 파라미터 조정

    -- postgresql.conf 파일에서 설정 (기본값은 보통 1GB)
    max_wal_size = 1GB  -- 필요에 따라 조정
  2. 정기적인 CHECKPOINT 실행

    -- 수동으로 체크포인트 실행
    CHECKPOINT;

    체크포인트는 WAL의 변경사항을 실제 데이터 파일에 적용해서 WAL을 비워줍니다.

  3. WAL 아카이빙 설정 검토

    • 아카이빙 모드(archive_mode = on)가 활성화된 경우 불필요하다면 해제
    • 필요한 경우 아카이브 저장 위치와 보관 기간 최적화
  4. wal_level 설정 확인

    SHOW wal_level;
    • minimal: 충돌 복구만 지원 (WAL 크기 최소)
    • replica: 기본값, 복제 지원
    • logical: 논리적 복제 지원 (WAL 크기 최대)
  5. 주기적인 VACUUM 실행

    VACUUM;  -- 일반 청소
    VACUUM FULL;  -- 더 철저한 청소 (락이 걸림)

💡 : 운영 환경에서는 WAL 설정을 변경하기 전에 항상 백업을 먼저 만들고, 영향을 테스트해보세요!

🧠 마무리 정리

항목 PostgreSQL 기능 초보자 해석
A - Atomicity BEGIN, COMMIT, ROLLBACK "한 방에 다 처리돼야 해"
C - Consistency CHECK, 제약조건 "규칙 어기면 안 돼"
I - Isolation 트랜잭션 + 격리 수준 설정 "동시에 해도 방해 없이"
D - Durability WAL 로그 "장애 나도 안전하게 저장돼"

📌 마무리 한 줄 요약

PostgreSQL은 ACID를 기본적으로 충실히 따르는 데이터베이스입니다. 여러분이 트랜잭션을 작성할 때 이 네 가지 개념과 그 바탕이 되는 격리 수준과 WAL을 이해하면, 정말 탄탄하고 안정적인 시스템을 만들 수 있어요 💪 필요에 맞게 격리 수준을 선택하고 WAL을 최적화하면 성능과 안정성의 균형을 잡을 수 있습니다!

728x90
300x250