본문 바로가기
C.W.K.
Stream
Lesson 02 of 10 · published

파일과 스프레드시트는 어디서 무너질까

~14 min · foundations, comparison

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

금요일의 정리 회의

중요한 데이터를 Google Sheets로 함께 관리해 본 팀이라면 익숙한 풍경이야. 월요일에는 두 사람이 동시에 행을 붙여 넣다가 한쪽 변경이 사라져. 화요일에는 누군가 열 이름을 바꿔서 뒤따르던 스크립트가 조용히 멈추고, 목요일에는 숫자 칸에 "N/A"가 들어가 SUM이 문자열 오류를 내. 금요일 결론은 시트를 “정리하자”는 것, 곧 수백 행을 다시 손보자는 말이야.

스프레드시트와 CSV가 커질수록 무너지는 까닭은 도구가 나빠서가 아니야. 운영 데이터에 꼭 필요한 세 가지 약속을 강제하도록 설계되지 않았기 때문이야. 두 쓰기 작업이 부딪힐 때 순서를 정하는 동시성 제어, 스키마를 어긴 행을 막는 데이터 정합성, 5천만 행 중 하나를 50ms 안에 찾게 하는 효율적인 질의가 필요해.

데이터베이스가 대신 지키는 것

PostgreSQL은 잘못된 행을 INSERT하는 순간 거절해. 동시에 시작한 두 트랜잭션이 모순된 결과를 모두 확정하지 못하게 조율하고, 색인은 처음부터 끝까지 훑는 선형 탐색을 로그 시간 검색으로 바꿔. 이 퀘스트에서 배울 ACID는 학술용 약자가 아니라 금요일 회의를 없애는 실제 장치야.

파일이 더 알맞을 때도 있어

CSV 같은 파일은 데이터를 내보내거나 공유하고 보관할 때, 또는 설정을 함께 배포할 때 아주 좋아. 하지만 둘 이상의 프로세스가 같은 내용을 쓰기 시작하거나 행을 조건별로 자주 찾아야 한다면 역할이 달라져. 쓰기 주체가 둘 이상이거나 질문이 단순 조회를 넘어가는 순간이 데이터베이스를 검토할 신호야.

Code

스키마가 잘못된 값을 입구에서 막는다·sql
CREATE TABLE orders (
    id       INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    customer TEXT    NOT NULL,
    product  TEXT    NOT NULL,
    price    NUMERIC(10,2) NOT NULL CHECK (price > 0),
    placed_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- 셋 다 경계에서 거절. 하나도 안 들어옴.
INSERT INTO orders (customer, product, price) VALUES ('Alice', 'Widget', NULL);
-- ERROR: null value in column "price" violates not-null constraint

INSERT INTO orders (customer, product, price) VALUES ('Bob', 'Gadget', -5);
-- ERROR: new row for relation "orders" violates check constraint

INSERT INTO orders (customer, product, price) VALUES ('Carol', 'Bolt', 'free');
-- ERROR: invalid input syntax for type numeric: "free"
두 쓰기 작업이 하나의 결과를 공유한다·sql
-- Session A                         | -- Session B (동시)
BEGIN;                               | BEGIN;
UPDATE products SET stock = stock-1  | UPDATE products SET stock = stock-1
  WHERE id = 7;                      |   WHERE id = 7;
COMMIT;                              | COMMIT;
-- PostgreSQL 이 직렬화해서 stock 이 정확히 두 번 감소.
-- 스프레드시트는 한쪽 write 를 조용히 잃어버려.

External links

Exercise

가지고 있는 CSV 하나를 골라. 없다면 10행짜리를 만들어도 돼. 같은 내용을 담을 PostgreSQL CREATE TABLE을 설계하고 모든 열의 자료형, 필수 값의 NOT NULL, 적어도 하나의 CHECK를 정해. \copy로 불러오면서 어느 행이 왜 거절되는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.