본문 바로가기
전공공부

DB PK(유일값) 일련번호 채번방식에 대하여

by 시아나 2026. 7. 5.

이번 프로젝트에서는 데이터 보관을 위해
DELETE 사용을 금지하고 삭제여부 컬럼을 추가하여 삭제 데이터를 관리하고 있다.

그래서 중복 방지를 위해 SEQ
일련번호 컬럼을 추가할 필요가 있었다.

때문에 오늘은 일련번호를 채번하는
다양한 방법에 대해 알아보고 비교해보려고 한다.

 

일련번호 채번방법 4가지

일련번호 채번방법으로는 크게 4가지가 있다.

1️⃣ Max + 1
2️⃣ DB Sequence (시퀀스 객체)
3️⃣ 채번 테이블 방식
4️⃣ 프레임워크 UUID (Universally Unique Identifier)

하나씩 예시를 들어서 확인해보겠다.

 

1️⃣ Max + 1

가장 간단한 채번방법은 Max + 1이다.

현재 테이블에 저장된 ID 값 중 가장 큰 값을 조회하여
거기에 + 1을 더해 새 번호를 부여한다.

Max + 1 방법은 별도 객체나 테이블이 필요없어 가장 간단한 방법이다.

결번 가능성이 낮고 연속된 숫자를 보장한다.

하지만 동시에 요청이 발생할 경우 중복발생 가능성이 있다.


만약 상품번호, 상품명, 가격이 있는
상품 테이블이 있다고 한다면.


MAX + 1은 아래 쿼리 처럼 사용할 수 있다.

INSERT INTO PRODUCT (PROD_NO, PROD_NAME, PRICE)
VALUES (
    -- 가장 큰 상품번호를 숫자로 바꿔 +1 한 뒤, 빈 곳을 '0'으로 채워 10자리를 만듦
    (SELECT LPAD(NVL(TO_NUMBER(MAX(PROD_NO)), 0) + 1, 10, '0') FROM PRODUCT),
    '자',
    28000
);

 

Max+1로 쿼리를 실행시키면 
아래처럼 자동으로 +1된 상품번호가 들어가는 걸 볼 수 있다.

 

2️⃣ DB Sequence (시퀀스 객체)

DB Sequence 방식은 Sequence라는
번호 생성용 객체를 생성하여 번호를 발급하는 방식이다.

더보기

✔ DB Sequence란?
자동으로 순차적으로 증가하는 순번을 반환하는 데이터베이스 객체
자동으로 순번을 증가 또는 감소시키기는 역할을 한다.

▪ 생성된 Sequence의 값은 변경할 수 없다.

 

DB Sequence 방식은 데이터베이스 자체 Cache를 사용하기 때문에
속도가 매우 빠르고 동시성 제어가 가능하다.

즉 중복 발생 가능성이 없다는 것이다.

하지만 트랜잭션이 롤백될 경우 중간에 받았던 번호가 버려져
결번이 생길 가능성이 있다.

아래는 시퀀스 생성부터 INSERT 까지의 예시 코드이다.

-- [준비 작업] 시퀀스 객체 생성 (기존 상품 데이터가 4번까지 있으므로 5부터 시작)
CREATE SEQUENCE PROD_SEQ START WITH 5 INCREMENT BY 1;

-- [실제 채번 및 등록 쿼리]
INSERT INTO PRODUCT (PROD_NO, PROD_NAME, PRICE)
VALUES (
    -- 시퀀스 다음 번호를 가져와 즉시 10자리 문자열로 포맷팅
    LPAD(PROD_SEQ.NEXTVAL, 10, '0'),
    '무선 프리젠터',
    35000
);

 

3️⃣ 채번 테이블 방식

채번 테이블은 별도의 테이블을 만들고
UPDATE를 통해 새 번호를 가져오는 방식이다.

 

채번 테이블을 사용하면 '2026-가-01' 처럼 커스텀 채번이 가능하고
DB 종류에 상관없이 사용가능하다는 장점이 있다.
하지만 테이블을 별도로 관리해야 하고
번호 조회시 매번 채번 테이블을 UPDATE를 하고 조회해야 하기 때문에 느리다는 단점이 있다.

아래는 테이블 생성부터 INSERT까지의 쿼리 예시이다.

-- [준비 작업] 채번 마스터 테이블 생성 및 상품용 카운터 초기화 (현재 값 5)
CREATE TABLE ID_SEQUENCES (
    TABLE_NAME  VARCHAR2(50) PRIMARY KEY,
    CURRENT_VAL NUMBER NOT NULL
);
INSERT INTO ID_SEQUENCES VALUES ('PRODUCT', 5);
COMMIT;

-- [실제 채번 및 등록 작업]
-- Step 1. 채번 테이블의 상품 카운터를 1 증가시킴 (동시성 제어 락 발생)
UPDATE ID_SEQUENCES SET CURRENT_VAL = CURRENT_VAL + 1 WHERE TABLE_NAME = 'PRODUCT';

-- Step 2. 증가된 값을 서브쿼리로 읽어와 10자리 숫자로 상품 등록
INSERT INTO PRODUCT (PROD_NO, PROD_NAME, PRICE)
VALUES (
    (SELECT LPAD(CURRENT_VAL, 10, '0') FROM ID_SEQUENCES WHERE TABLE_NAME = 'PRODUCT'),
    '스테이플러 및 침 세트',
    3800
);

 

4️⃣ 프레임워크 UUID (Universally Unique Identifier)

프레임워크 UUID 방식은 데이터베이스에 의존하지 않고
Spring Boot와 같은 애플리케이션 단에서 알고리즘(시간+무작위수 등)을 통해
128 bit의 유일 식별자를 만들어 지정하는 방식이다.

9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d

uuid는 위와 같이 32개의 16진수 숫자가 4개의 -로 나눠진 8-4-4-4-12 형태이다.

https://docs.tosspayments.com/resources/glossary/uuid

Java의 경우 java.util에서 UUID 생성을 지원한다.

import java.util.UUID;
UUID.randomUUID().toString() // '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'

 

UUID를 사용하면 MSA 환경에서도 DB락 없이 독자적으로 번호를 생성할 수 있다.
때문에 매우 빠르고 중복 가능성이 낮다는 장점이 있다.

하지만 36자리이므로 숫자에 비해 용량차지가 크고
정렬이 되지 않아 DB 인덱스의 성능을 저하시키고 가독성도 떨어진다.

 

✅ 최종 정리

비교 요소 Max + 1 DB Sequence 채번 테이블  프레임워크 UUID
속도/성능 보통 (데이터 증가 시 느려짐) 매우 빠름 (최상) 느림 (디스크 I/O 유발) 매우 빠름 (상)
순서 보장 보장함 보장함 보장함 보장 안 됨 (무작위)
결번 발생 발생 안 함 발생함 (롤백 시) 발생 가능 (트랜잭션 분리 시) 해당 없음
중복 위험 매우 높음 (동시성 취약) 없음 없음 (락 제어) 없음
Lock Term 커밋 시점까지 유지 즉시 해제 (원자적) 커밋 시점까지 유지 (병목 원인) 락 없음

 

 

참고자료 

 

UUID(Universally Unique Identifier) | 토스페이먼츠 개발자센터

UUID는 128-bit의 고유 식별자에요. UUID는 중앙 시스템에 등록하고 발급하는 과정이 없어서 상대적으로 빠르고 간단하게 만들 수 있어요.

docs.tosspayments.com