0Pricing
SQL Interview Prep · 강의

ACID 속성 설명

구체적인 예시로 원자성, 일관성, 격리성, 지속성을 알아봅니다.

ACID 속성 설명은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

면접관이 ACID를 묻는 이유

시니어 면접관이 “ACID를 설명해 보세요”라고 말할 때, 네 단어를 암기했는지 확인하려는 것이 아닙니다. 동시에 많은 사용자가 데이터베이스에 접근할 때 데이터베이스가 무엇을 보장하는지 이해하고 있는지 알고 싶은 것입니다.

ACID는 원자성, 일관성, 격리성 및 지속성을 의미합니다. 모든 트랜잭션 데이터베이스(PostgreSQL, MySQL/InnoDB, SQL 서버, 오라클)는 트랜잭션으로 묶인 작업에 대해 이 네 가지 속성을 보장합니다.

가장 좋은 답변은 각 글자를 해당 속성이 방지하는 구체적인 장애와 연결합니다. 다음 장면부터 바로 그렇게 살펴보겠습니다.

트랜잭션이란 무엇인가요?

트랜잭션은 데이터베이스가 하나의 분리할 수 없는 단계로 처리하는 작업 단위입니다. BEGIN으로 시작하고 하나 이상의 문을 실행한 다음, 영구적으로 반영하려면 COMMIT하고 모든 내용을 폐기하려면 ROLLBACK합니다.

전형적인 예는 은행 송금입니다. 한 계좌에서 인출하고 다른 계좌에 입금합니다. 두 작업 모두 수행되거나 어느 것도 수행되지 않아야 합니다. 트랜잭션은 이러한 약속을 지킬 수 있게 해 주는 묶음입니다.

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

A = 원자성

원자성은 트랜잭션이 전부 수행되거나 전혀 수행되지 않아야 한다는 뜻입니다. 어떤 문이든 실패하거나 서버가 중간에 중단되면 해당 트랜잭션의 모든 변경 사항이 처음부터 시작되지 않았던 것처럼 롤백됩니다.

송금 예에서 입금이 성공한 뒤 인출이 실패하더라도 원자성은 인출 작업도 되돌려지도록 보장합니다. 반쯤 끝난 작업 때문에 돈을 잃는 일은 없습니다.

면접에서의 표현: "원자성은 트랜잭션이 전체로 커밋되거나 전혀 커밋되지 않도록 하여 부분적인 상태를 남기지 않습니다."

원자성이 실제로 작동하는 모습

여기서는 두 번째 업데이트가 검사 제약 조건을 위반합니다(잔액은 음수가 될 수 없습니다). 데이터베이스는 트랜잭션을 중단하고 ROLLBACK은 첫 번째 업데이트도 되돌립니다.

면접에서 핵심적으로 짚어야 할 점은 롤백 이후에도 계좌 1의 잔액이 원래 값으로 유지된다는 것입니다. 테이블에 부분 기록이 남아 있지 않습니다.

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- next line fails: balance would go below 0
UPDATE accounts SET balance = balance - 999999 WHERE id = 2;
ROLLBACK;  -- account 1 is restored to its original balance

C = 일관성

일관성은 트랜잭션이 데이터베이스를 하나의 유효한 상태에서 다른 유효한 상태로 옮긴다는 뜻입니다. 커밋된 모든 트랜잭션은 정의된 모든 규칙인 제약 조건, 외래 키, 트리거, 캐스케이드를 준수해야 합니다.

트랜잭션으로 인해 제약 조건이 위반된 상태가 남게 된다면(고아 외래 키, 중복된 기본 키, 실패한 CHECK 등) 데이터베이스는 해당 트랜잭션의 커밋을 거부합니다.

언급할 세부 사항: 데이터베이스는 선언된 규칙을 적용하지만, 애플리케이션 수준의 불변 조건("사용자는 활성 세션을 최대 3개까지 가질 수 있다")은 제약 조건으로 모델링하지 않는 한 개발자의 책임입니다.

제약 조건으로 보장되는 일관성

일관성은 대부분 스키마 규칙을 합한 결과입니다. 아래에서는 외래 키가 존재하지 않는 고객의 주문을 삽입할 수 없도록 보장합니다.

삽입 작업이 존재하지 않는 고객을 참조하면 트랜잭션이 실패하고, 원자성이 해당 트랜잭션을 롤백하여 일관성이 유지됩니다. 이것이 면접에서 원자성과 일관성이 함께 작동한다고 말하는 이유입니다.

CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT NOT NULL REFERENCES customers(id),
  amount NUMERIC(10,2) CHECK (amount > 0)
);

-- This fails if customer 999 does not exist, keeping data consistent
INSERT INTO orders (id, customer_id, amount) VALUES (1, 999, 50.00);

I = 격리성

격리성은 동시에 실행되는 트랜잭션들이 서로 방해하지 않는다는 뜻입니다. 수십 개의 트랜잭션이 동시에 실행되더라도 이상적으로는 각 트랜잭션이 혼자 실행된 것처럼 동작합니다.

실제로 데이터베이스는 엄격함과 성능을 서로 맞바꾸는 여러 격리 수준을 제공합니다. 더 약한 수준은 동시성을 높이는 대신 특정 이상 현상(더티 리드, 팬텀 읽기)을 허용합니다.

이 부분은 ACID 면접에서 가장 폭넓게 다루어지는 내용이므로 다음 두 수업에서 격리 수준과 읽기 이상 현상을 자세히 살펴봅니다.

격리 수준이 여러 단계인 이유

완벽한 격리(SERIALIZABLE)는 가능한 모든 실행 순서 교차 충돌을 막아야 하므로 비용이 많이 듭니다. 이를 위해 트랜잭션을 잠그거나 중단하는 경우가 많습니다.

그래서 에스큐엘 표준은 네 가지 수준을 정의합니다. 면접에서 흔히 나오는 함정은 지원자가 격리성을 이분법적으로 생각하는 것입니다. 격리성은 그렇지 않습니다. 원하는 엄격함의 정도를 직접 선택합니다.

  • READ UNCOMMITTED 가장 약함
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE 가장 강함
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT SUM(balance) FROM accounts;
-- ... business logic ...
COMMIT;

D = 지속성

지속성은 트랜잭션이 커밋된 후 그 변경 사항이 장애, 정전, 재시작을 견딘다는 뜻입니다. 커밋된 트랜잭션은 안정적인 저장 장치에 기록됩니다.

데이터베이스는 미리 쓰기 로그(WAL)를 사용하여 이를 달성합니다. 데이터 파일을 업데이트하기 전에 변경 사항을 내구성 있는 로그에 기록합니다. 재시작할 때 엔진은 로그를 다시 재생하여 아직 기본 파일에 반영되지 않은 커밋된 작업을 복구합니다.

면접에서의 표현: "지속성은 WAL로 보장되며, 로그 기록이 디스크에 플러시된 후에만 커밋이 반환됩니다."

은행 송금에 네 가지 속성 적용하기

한 번의 송금으로 네 가지 속성을 모두 확인할 수 있습니다.

  • 원자성: 두 업데이트가 모두 적용되거나 어느 것도 적용되지 않습니다.
  • 일관성: CHECK가 잔액을 음수가 되지 않도록 유지합니다.
  • 격리성: 동시에 실행되는 읽기 작업이 아직 완료되지 않은 송금을 보지 못합니다.
  • 지속성: COMMIT 이후 새 잔액이 장애가 발생해도 유지됩니다.

하나의 구체적인 예를 네 글자 모두에 연결해서 설명할 수 있어야 면접에서 정확히 좋은 점수를 얻을 수 있습니다.

BEGIN;
UPDATE accounts SET balance = balance - 100
  WHERE id = 1 AND balance >= 100;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

자주 나오는 후속 질문

면접관은 자주 경계 사례를 깊이 파고듭니다. 다음 질문에 대비하십시오.

  • "외래 키는 어떤 속성을 적용하나요?" 일관성입니다.
  • "트랜잭션 중간에 서버가 중단되는 상황을 무엇이 보호하나요?" 원자성(커밋되지 않은 변경 사항의 롤백)과 지속성(커밋된 변경 사항의 재생)입니다.
  • "격리성에는 비용이 없나요?" 아닙니다. 더 강한 격리성에는 동시성 저하라는 비용이 따릅니다.
  • "NoSQL 저장소도 ACID를 제공하나요?" 많은 저장소가 가용성을 위해 ACID를 포기합니다(BASE). 엔진에 따라 다르다고 답하십시오.

빠른 확인

각 ACID 속성이 어떤 역할을 하는지 확인해 보십시오.

복습: 한 호흡으로 설명하는 ACID

이제 다음 질문에 명확하게 답할 수 있습니다.

  • 원자성 - 전부 수행되거나 전혀 수행되지 않으며, 부분 작업은 롤백됩니다.
  • 일관성 - 모든 커밋이 제약 조건을 준수하고 유효한 상태를 남깁니다.
  • 격리성 - 동시에 실행되는 트랜잭션들이 서로를 손상시키지 않으며, 엄격함의 정도를 조정할 수 있습니다.
  • 지속성 - 커밋된 데이터가 장애가 발생해도 유지되며, 미리 쓰기 로그가 이를 뒷받침합니다.

각 글자를 그것이 방지하는 구체적인 실패 상황에 연결해 두면 어떤 동시성 면접의 첫 질문도 자신 있게 통과할 수 있습니다.

자주 묻는 질문

“ACID 속성 설명” 강의는 무료인가요?

네 — “ACID 속성 설명” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“ACID 속성 설명”에서 뭘 배우나요?

구체적인 예시로 원자성, 일관성, 격리성, 지속성을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“ACID 속성 설명” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. ACID 속성 설명
  2. 네 가지 격리 수준
  3. 더티 리드, 반복 불가능 읽기, 팬텀 리드
  4. 교착 상태, 잠금, MVCC
← SQL Interview Prep(으)로 돌아가기