본문 바로가기

Development/Diary

[개발 일기] Primary key 타입은 숫자랑 GUID(UUID)중에 어떤 걸 쓸까요?

설문조사 엔티티의 ID 타입은 숫자 Or GUID(UUID)?

졸업 프로젝트 진행중에 나왔던 대화 주제입니다.설문조사 게시글의 Id 타입을 무엇으로 할지...
사실 그 당시에는 GUID 타입에 대해서도 처음 접해봐서 잘 몰랐는데 지금 다시 떠올라서 GUID에 견해에 대해 써보려합니다.

GUID(UUID)?

GUID는 'Globally Unique Identifier'의 약자로, '전역적으로 고유한 식별자'라는 뜻입니다.

GUID는 128비트의 크기를 가지며, 이는 전 세계 어디에서든 고유하게 생성될 수 있는 값을 의미합니다. GUID는 주로 여러 데이터베이스나 서버 간에 데이터를 고유하게 식별하거나 병합할 필요가 있을 때 사용됩니다. 예를 들어, 여러 서버에 분산되어 있는 데이터베이스에서 각 레코드를 고유하게 식별할 수 있어야 하는 경우에 GUID를 사용할 수 있습니다. 그러나 GUID는 저장 공간이 더 많이 필요하고, 가독성이 떨어지며, 인덱싱 시 성능 문제를 일으킬 수도 있습니다.

 

장점
- 전세계적으로 고유하므로, 분산된 시스템에서도 식별자의 충돌 없이 사용할 수 있습니다. 이는 복제나 데이터베이스 병합 등의 작업을 수행할 때 유용합니다.
- 식별자를 미리 생성할 수 있으므로, 트랜잭션을 거치지 않고도 엔티티를 생성하고 식별할 수 있습니다.
- 예측하기 어려운 URL로 보안이 강화됩니다.

단점
- GUID는 128비트로 구성되어 있으므로, Integer(32비트)에 비해 4배 더 많은 공간을 차지합니다.
- 랜덤한 nature 때문에 인덱스 성능이 저하될 수 있습니다. 새로운 GUID가 랜덤한 위치에 삽입되므로, 데이터베이스는 계속해서 인덱스를 재조정해야 합니다.

Integer (Numeric)

장점
- 공간 효율적입니다. 일반적으로 32비트를 사용하므로, GUID에 비해 저장 공간이 적게 필요합니다.
- 순차적으로 증가하는 특성 때문에, 인덱스 성능이 좋습니다. 새로운 값이 항상 인덱스의 끝에 추가되므로, 데이터베이스가 인덱스를 재조정할 필요가 없습니다.
단점
- 분산 시스템에서는 고유성을 보장하기 어렵습니다. 여러 데이터베이스에서 동일한 ID를 생성하는 문제가 발생할 수 있습니다.
- 트랜잭션 내에서만 식별자를 생성할 수 있으므로, 트랜잭션 외부에서 식별자를 사용하려면 추가적인 로직이 필요합니다.
- 게시글 URL 예측이 가능하여 보안에 취약합니다.

설문조사 게시글엔 무엇을?

저는 설문조사는 함부로 공개되어서는 안되므로 예측이 불가능한 URL을 위해 GUID를 선택할 것 같습니다.
GUID의 공간이 큰 만큼 분산 DB를 운영해야 할 것 같습니다.

참고 자료