← 목록으로
DB 네이밍 규칙 2026.02.16 ✍️ 허영현

DB 네이밍 및 Flyway 마이그레이션 컨벤션

프론트엔드와 백엔드 간의 명확한 데이터 소통, 그리고 운영 DB의 안정적인 관리를 위해 데이터베이스 명명 규칙과 마이그레이션 스크립트 작성 기준을 엄격하게 통제합니다.

DB 네이밍 및 Flyway 마이그레이션 컨벤션

프론트엔드와 백엔드 간의 명확한 데이터 소통, 그리고 운영 DB의 안정적인 관리를 위해 데이터베이스 명명 규칙과 마이그레이션 스크립트 작성 기준을 엄격하게 통제합니다.

1. 기본 네이밍 규칙 (General Naming Rules)

2. 제약조건 및 인덱스 명명 규칙 (Constraints & Index)

JPA(Hibernate)가 무작위로 생성하는 해시값 이름(예: FK_a1b2c3...)을 방지하고, 에러 로그 발생 시 어떤 제약조건에서 터졌는지 즉각적으로 파악하기 위해 아래의 접두사 규칙을 무조건 준수합니다.

종류 Prefix 네이밍 규칙 (Format) 적용 예시
Primary Key pk_ pk_{테이블명} pk_member
Unique Key uk_ uk_{테이블명}_{컬럼명} uk_member_email
Foreign Key fk_ fk_{현재테이블}_to_{대상테이블} fk_subscription_to_member
Index idx_ idx_{테이블명}_{주요컬럼명} idx_subscription_member_id
Check ck_ ck_{테이블명}_{목적} ck_auth_method

3. Flyway 마이그레이션 스크립트 작성 가이드

DB 형상 관리는 Flyway를 통해 수행합니다. “JPA가 자동으로 생성해주는 DDL을 우리가 직접 통제하고 작성한다”는 마인드로 작업해 주세요.

📍 파일 생성 경로 및 포맷

📍 DDL 일괄 작성 순서 (Order of Execution)

스크립트 가독성과 참조 무결성 충돌(테이블이 없는데 FK를 맺으려는 현상)을 방지하기 위해 파일 내 쿼리 작성 순서를 통일합니다.

  1. ENUM 타입 정의 (CREATE TYPE ... AS ENUM)
  2. Table 본문 생성 (기본 컬럼 및 CONSTRAINT pk_... PRIMARY KEY 포함)
  3. Unique Key (UK) 제약조건 추가 (ALTER TABLE ... ADD CONSTRAINT uk_...)
  4. Foreign Key (FK) 제약조건 추가 (ALTER TABLE ... ADD CONSTRAINT fk_...)
  5. Index 생성 (CREATE INDEX ...) - 가장 마지막에 배치

⚠️ DDL 작성 시 주의사항 (Idempotency)

여러 환경(Local, Dev, Prod)에서 마이그레이션 스크립트가 여러 번 실행되거나 핫픽스와 겹치더라도 에러가 나지 않도록(멱등성 유지), 객체 생성 시 반드시 IF NOT EXISTS 구문을 포함해야 합니다. (단, PostgreSQL에서 테이블 생성 시 제외하고 제약조건이나 인덱스에 주로 활용)

작성 예시 (V1__init_member.sql):

SQL

-- 1. Table & PK
CREATE TABLE IF NOT EXISTS member (
    member_id       BIGINT GENERATED BY DEFAULT AS IDENTITY,
    email           VARCHAR(100) NOT NULL,
    created_at      TIMESTAMP NOT NULL DEFAULT NOW(),
    CONSTRAINT pk_member PRIMARY KEY (member_id)
);

-- 2. UK
ALTER TABLE member 
    ADD CONSTRAINT uk_member_email UNIQUE (email);

-- 3. FK (address 테이블이 먼저 생성되어 있어야 함)
ALTER TABLE member 
    ADD CONSTRAINT fk_member_to_address 
        FOREIGN KEY (address_id) REFERENCES address (address_id);

-- 4. Index (가장 마지막)
CREATE INDEX IF NOT EXISTS idx_member_email ON member (email);
#DB #Flyway