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

중요한 자료형

~14 min · schema, types

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

값에 맞는 그릇을 골라

자료형은 저장 공간만 정하지 않아. 허용되는 값과 비교 방식, 쓸 수 있는 연산과 색인까지 결정해. 숫자를 문자열에 넣거나 시각을 시간대 없는 값으로 저장하면 편해 보이는 오늘 대신 오래 이어질 모호함을 사는 셈이야. 처음부터 맞는 자료형을 고르면 미래의 버그 100개를 입구에서 없앨 수 있어.

90%를 맡는 자료형

  • INTEGER·BIGINT는 개수와 식별자에 써. 약 21억을 넘을 수 있는 큰 테이블의 키나 바이트 수에는 BIGINT가 안전해.
  • NUMERIC은 돈처럼 정확한 십진수에 써.
  • TEXT는 길이를 임의로 자를 이유가 없는 문자열에 알맞아. VARCHAR(n)은 실제 업무 규칙으로 길이를 제한할 때만 골라.
  • BOOLEAN은 두 상태를 표현해. 불리언을 0/1 정수로 흉내 내지 마.
  • DATE는 날짜를, TIMESTAMPTZ는 세계의 한 시점을 나타내.
  • UUID는 공개 식별자에 알맞고, PG 18부터의 uuidv7()은 시간 순서와 색인 지역성을 함께 얻어.
  • JSONB, 배열, 범위, BYTEA는 가변 구조와 복합 값을 PostgreSQL 안에서 직접 표현하게 해.

자주 만드는 실수

돈을 FLOAT에 넣으면 0.1 + 0.2가 0.3과 정확히 같지 않을 수 있어. 계산 결과가 정확해야 할 때는 NUMERIC을 써. 시간은 가능한 한 TIMESTAMPTZ로 저장해 UTC 기준 시점을 잃지 마. VARCHAR(255)를 습관처럼 고르거나 불리언을 문자열로 흉내 내는 선택도 피해야 해. 날짜라면 TEXT가 아니라 DATE가 맞아.

Code

일반 상품 테이블에 쓸 만한 기본 구성·sql
CREATE TABLE products (
    id          INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    public_id   UUID NOT NULL DEFAULT gen_random_uuid(),
    sku         TEXT UNIQUE NOT NULL,
    name        TEXT NOT NULL,
    description TEXT,
    price       NUMERIC(10,2) NOT NULL CHECK (price >= 0),
    weight_kg   NUMERIC(8,3),
    in_stock    BOOLEAN NOT NULL DEFAULT TRUE,
    tags        TEXT[] NOT NULL DEFAULT '{}',
    metadata    JSONB NOT NULL DEFAULT '{}'::jsonb,
    launched_at TIMESTAMPTZ,
    created_at  TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at  TIMESTAMPTZ NOT NULL DEFAULT now()
);
돈: FLOAT가 어떻게 거짓말하나·sql
SELECT 0.1::float8 + 0.2::float8;
--      ?column?
-- ----------------------
--   0.30000000000000004

SELECT 0.1::numeric + 0.2::numeric;
--  ?column?
-- ----------
--      0.3

External links

Exercise

접근할 수 있는 기존 스키마를 점검해. 돈을 담은 FLOAT·REAL, 근거 없는 VARCHAR(n), 시간대 없는 TIMESTAMP, 불리언·JSON·날짜를 대신하는 TEXT 열을 모두 찾아서 각각 더 알맞은 자료형을 제안해.

Progress

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

댓글 0

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

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