Snowflake 알고리즘은 분산 시스템에서 고유한 ID를 생성하기 위해 설계된 방법입니다. 여러 서버에서 동시에 ID를 생성할 때 발생할 수 있는 충돌을 방지하고 시간에 따라서 정렬가능한 ID를 만드는 알고리즘입니다.
Auto_increment를 사용하지 않고 snowflake를 제가 도입한 이유는 Auto_increment 전략을 사용하였을 경우 다양한 문제가 발생할 수 있다는 점인데요, 그렇다면 어떤 점이 문제인지 보겠습니다.
우리가 처음 할 때는 주로 AutoIncrement 전략을 사용하게 될 것입니다.

다음과 같이 빨간 박스를 친 부분을 보면 쉽게 추적을 하여 확인을 할 수 있습니다.
이러한 추적은 정보가 민감하지 않은 데이터에는 괜찮지만 정보가 민감한 도메인일경우에는 굉장히 문제가 될 수 있습니다.
📌 AutoIncrement로 인해 발생하는 정렬 문제
AutoIncrement를 사용하면 ID 값이 순차적으로 증가하므로, 기본적으로 생성 순서대로 정렬이 되게 됩니다.
하지만 특정 컬럼(예: created_at)을 기준으로 정렬해야 할 경우, 인덱스 충돌과 성능 저하가 발생할 수 있습니다.
🛑 예제 1 - 생성 시점과 정렬이 맞지 않는 경우
id name created_at
1 A 2024-01-01 10:00:00
2 B 2024-01-01 11:00:00
3 C 2024-01-01 12:00:00
위 테이블은 ID가 AutoIncrement로 증가하므로 created_at 순서와 동일해 보입니다. 하지만 병렬로 여러 개의 데이터를 삽입하는 경우, 삽입 순서와 정렬 순서가 달라질 수 있습니다.
병렬 삽입 시 정렬이 꼬이는 경우
만약 B, C, D 데이터를 동시에 여러 트랜잭션에서 삽입하는 예시를 들어보겠습니다.
id name created_at
1 A 2024-01-01 10:00:00
4 D 2024-01-01 10:30:00
2 B 2024-01-01 11:00:00
3 C 2024-01-01 12:00:00
D가 먼저 created_at 10:30에 생성되었지만,
ID는 4가 배정됨 → ID 정렬과 created_at 정렬이 다릅니다.
ORDER BY id를 사용하면 시간순 정렬이 깨질 가능성이 있습니다.
✅ 해결 방법
1️⃣ ORDER BY created_at DESC 로 정렬
2️⃣ created_at 컬럼에 INDEX 추가
하지만 created_at을 인덱스로 설정하면 INSERT 속도가 느려질 수 있습니다. (인덱스 재정렬이 필요하기 때문입니다.)
🛑 예제 2 - 샤딩(Sharding) 환경에서 ID 충돌
AutoIncrement는 데이터베이스를 샤딩할 경우 충돌이 발생할 가능성이 높습니다.
즉, 각 노드에서 동일한 ID가 생성될 위험이 있습니다. 다음 예시를 보겠습니다.
1️⃣ 샤딩 없이 AutoIncrement 사용
id name 서버
1 A Server 1
2 B Server 1
3 C Server 1
2️⃣ 샤딩 적용 후 AutoIncrement 문제
id name 서버
1 A Server 1
1 X Server 2
2 B Server 1
2 Y Server 2
샤딩 환경에서는 각 서버가 독립적으로 ID를 생성하기 때문에 중복된 ID가 발생할 가능성이 있습니다.
이를 방지하려면 각 서버별로 AutoIncrement 증가 단계를 다르게 설정해야 하지만 관리가 매우 어려운 점이 있습니다 .
위와 같은 문제들은 SnowFlake를 이용하여 해결이 가능할 수 있는데요,
다음은 SnowFlake의 예시를 작성하여 보겠습니다.