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', '매니저');테스트 데이터는 마이그레이션에 포함하지 않습니다. 테스트용 데이터는 테스트 코드에서 직접 생성합니다.