SnowFlake를 이용한 대용량 데이터 생성 (1)

haru·2025년 1월 31일

스프링 프로젝트

목록 보기
2/3
post-thumbnail

🔥SnowFlake 알고리즘은 무엇일까?

Snowflake 알고리즘은 분산 시스템에서 고유한 ID를 생성하기 위해 설계된 방법입니다. 여러 서버에서 동시에 ID를 생성할 때 발생할 수 있는 충돌을 방지하고 시간에 따라서 정렬가능한 ID를 만드는 알고리즘입니다.

1️⃣ SnowFlake의 장점

  • 분산 시스템에 적합
  • 시간 기반 정렬 가능
  • 높은 생성 속도

2️⃣ SnowFlake의 단점

  • 구현이 복잡
  • 시스템 시간에 의존적

🔥AutoIncrement VS SnowFlake 무엇을 사용해야 할까?

Auto_increment를 사용하지 않고 snowflake를 제가 도입한 이유는 Auto_increment 전략을 사용하였을 경우 다양한 문제가 발생할 수 있다는 점인데요, 그렇다면 어떤 점이 문제인지 보겠습니다.

CASE 1 - 다른 데이터들을 쉽게 추적할 수 있다.

우리가 처음 할 때는 주로 AutoIncrement 전략을 사용하게 될 것입니다.

다음과 같이 빨간 박스를 친 부분을 보면 쉽게 추적을 하여 확인을 할 수 있습니다.
이러한 추적은 정보가 민감하지 않은 데이터에는 괜찮지만 정보가 민감한 도메인일경우에는 굉장히 문제가 될 수 있습니다.

CASE 2 - 정렬 컬럼에 INDEX를 생성해야 하는 경우, 혼란을 야기할 수 있다.

📌 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의 예시를 작성하여 보겠습니다.

0개의 댓글