DB 설계 가이드
1. 테이블 네이밍 규칙
| 항목 | 규칙 | 예시 |
| 접두사 | T_ 필수 | T_USER, T_ORDER |
| 표기법 | UPPER_SNAKE_CASE | T_ORDER_DETAIL |
| 언어 | 영문 약어 사용 | T_RESVE (예약), T_NTCE (공지) |
| 연결 테이블 | 두 테이블명 조합 | T_USER_ROLE |
2. 컬럼 네이밍 규칙
| 항목 | 규칙 | 예시 |
| 표기법 | UPPER_SNAKE_CASE | USER_NM, ORDER_DT |
| PK 컬럼 | 테이블명_SN | USER_SN, ORDER_SN |
| 이름 | _NM 접미사 | USER_NM, ITEM_NM |
| 코드 | _CD 접미사 | STATUS_CD, TYPE_CD |
| 여부 | _YN 접미사 (CHAR 1, Y/N) | USE_YN, DEL_YN |
| 일시 | _DT 접미사 | REGIST_DT, UPDT_DT |
| 내용 | _CN 접미사 | BOARD_CN, MEMO_CN |
| 순번 | _SN 접미사 | ATTACH_SN, LOG_SN |
| 금액 | _AMT 접미사 | PRICE_AMT, TAX_AMT |
| 수량 | _CNT 접미사 | ORDER_CNT, STOCK_CNT |
3. 공통 컬럼 (모든 테이블 필수)
GeneralVO 필드에 대응하는 공통 컬럼으로, 모든 테이블에 반드시 포함한다.
FRST_REGIST_ID VARCHAR2(100) -- 최초 등록자 ID
FRST_REGIST_IP VARCHAR2(50) -- 최초 등록 IP
FRST_REGIST_DT TIMESTAMP WITH TIME ZONE -- 최초 등록 일시
LAST_UPDT_ID VARCHAR2(100) -- 최종 수정자 ID
LAST_UPDT_IP VARCHAR2(50) -- 최종 수정 IP
LAST_UPDT_DT TIMESTAMP WITH TIME ZONE -- 최종 수정 일시
시간 컬럼은 반드시 TIMESTAMP WITH TIME ZONE 사용. DATE 타입 및 SYSDATE 금지.
4. 데이터 타입 기준
| 용도 | 타입 | 비고 |
| 일련번호 (PK) | NUMBER | 시퀀스 또는 자동증가 |
| 짧은 문자열 | VARCHAR2(n) | 길이 명시 필수 |
| 긴 텍스트 | CLOB | 본문, JSON 저장 등 |
| 날짜+시간 | TIMESTAMP WITH TIME ZONE | DATE 사용 금지 |
| 여부 플래그 | CHAR(1) | Y / N |
| 정수 | NUMBER(n) | 자릿수 명시 |
| 금액/소수 | NUMBER(15, 2) | 소수점 자릿수 명시 |
5. PK 설계
- PK는 단일 컬럼
_SN (NUMBER) 으로 통일
- 복합 PK 지양 — 필요 시 유니크 인덱스로 대체
- 시퀀스 네이밍:
SEQ_테이블명 (예: SEQ_T_USER)
CREATE SEQUENCE SEQ_T_USER
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
6. 인덱스 전략
| 상황 | 적용 |
| PK | 자동 생성 (PRIMARY KEY 선언) |
| 자주 조회하는 단일 컬럼 | 단일 인덱스 |
| 복합 조건 조회 | 복합 인덱스 (선택도 높은 컬럼 앞에) |
| 외래키 컬럼 | 인덱스 필수 |
LIKE '%keyword' | 인덱스 효과 없음 — 전문 검색 고려 |
인덱스 네이밍: IDX_테이블명_컬럼명
CREATE INDEX IDX_T_ORDER_USER_SN ON T_ORDER (USER_SN);
CREATE INDEX IDX_T_ORDER_STATUS ON T_ORDER (STATUS_CD, FRST_REGIST_DT);
7. DDL 예시
CREATE TABLE T_ORDER (
ORDER_SN NUMBER NOT NULL, -- 주문 일련번호 (PK)
USER_SN NUMBER NOT NULL, -- 사용자 일련번호 (FK)
PRODUCT_NM VARCHAR2(200) NOT NULL, -- 상품명
ORDER_CNT NUMBER(5) NOT NULL, -- 주문 수량
PRICE_AMT NUMBER(15, 2) NOT NULL, -- 주문 금액
STATUS_CD VARCHAR2(20) NOT NULL, -- 주문 상태 코드
MEMO_CN VARCHAR2(1000), -- 메모
USE_YN CHAR(1) DEFAULT 'Y' NOT NULL, -- 사용 여부
FRST_REGIST_ID VARCHAR2(100) NOT NULL,
FRST_REGIST_IP VARCHAR2(50) NOT NULL,
FRST_REGIST_DT TIMESTAMP WITH TIME ZONE NOT NULL,
LAST_UPDT_ID VARCHAR2(100) NOT NULL,
LAST_UPDT_IP VARCHAR2(50) NOT NULL,
LAST_UPDT_DT TIMESTAMP WITH TIME ZONE NOT NULL,
CONSTRAINT PK_T_ORDER PRIMARY KEY (ORDER_SN)
);
CREATE INDEX IDX_T_ORDER_USER_SN ON T_ORDER (USER_SN);
CREATE INDEX IDX_T_ORDER_STATUS ON T_ORDER (STATUS_CD, FRST_REGIST_DT);
8. 체크리스트
- [ ] 테이블명
T_ 접두사 및 UPPER_SNAKE_CASE
- [ ] PK 컬럼명
_SN, NUMBER 타입
- [ ] 시간 컬럼
TIMESTAMP WITH TIME ZONE 사용 (DATE 금지)
- [ ] 공통 컬럼 6개 포함 (등록자/IP/일시, 수정자/IP/일시)
- [ ]
_YN 컬럼 DEFAULT 값 설정
- [ ] 자주 조회되는 컬럼 인덱스 생성
- [ ] 시퀀스 생성 및 네이밍 규칙 준수