Skip to content

7.3. DDL 작성 표준

7.3.1. CREATE TABLE

sql
-- V1__create_users_table.sql
CREATE TABLE users (
    id          BIGSERIAL PRIMARY KEY,
    name        VARCHAR(100) NOT NULL,
    email       VARCHAR(255) NOT NULL,
    password    VARCHAR(255) NOT NULL,
    is_active   BOOLEAN NOT NULL DEFAULT true,
    created_at  TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
    updated_at  TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now()
);

CREATE UNIQUE INDEX uniq_users_email ON users (email);

작성 규칙:

  • 컬럼 정의는 들여쓰기를 맞춥니다.
  • NOT NULL 제약조건을 명시적으로 선언합니다. nullable한 컬럼은 의도적인 경우에만 허용합니다.
  • 기본값이 있는 컬럼은 DEFAULT를 함께 선언합니다.
  • 인덱스는 같은 마이그레이션 파일에 포함합니다.

7.3.2. ALTER TABLE

sql
-- V3__add_phone_to_users.sql
ALTER TABLE users
    ADD COLUMN phone VARCHAR(20);
sql
-- V4__add_not_null_constraint_to_phone.sql
UPDATE users SET phone = '' WHERE phone IS NULL;

ALTER TABLE users
    ALTER COLUMN phone SET NOT NULL;

주의

NOT NULL 제약조건을 추가할 때는 기존 데이터의 NULL 값을 먼저 처리해야 합니다.

7.3.3. 인덱스 생성

sql
-- V5__create_idx_orders_user_id.sql
CREATE INDEX idx_orders_user_id ON orders (user_id);

CREATE INDEX CONCURRENTLY idx_orders_created_at
    ON orders (created_at);
  • 프로덕션 환경에서 대용량 테이블에 인덱스를 추가할 때는 CONCURRENTLY 옵션을 사용합니다.

주의

CREATE INDEX CONCURRENTLY는 트랜잭션 내부에서 실행할 수 없습니다. Flyway 마이그레이션에서 이 구문을 사용하려면 별도의 마이그레이션 파일로 분리해야 합니다.

7.3.4. 시드 데이터

초기 데이터(역할, 코드 등)는 마이그레이션 파일로 관리합니다.

sql
-- V6__insert_initial_roles.sql
INSERT INTO roles (name, description) VALUES
    ('ADMIN', '시스템 관리자'),
    ('USER', '일반 사용자'),
    ('MANAGER', '매니저');

테스트 데이터는 마이그레이션에 포함하지 않습니다. 테스트용 데이터는 테스트 코드에서 직접 생성합니다.

TIENIPIA QUALIFIED STANDARD