테이블을 설계하는 과정에서 PK에 대한 고민을 많이 갖게 되었다. PK를 부여하는 방식에 여러 방식이 있지만, 대표적인 두가지는 UUID와 AI(Auto Increment)를 대표적으로 사용한다.
나는 현재 AI(Auto Increment)를 사용 중이다. AI를 선택하게 된 이유는 현재 서비스는 하나의 데이터베이스에서 서비스를 운영중이기에 PK생성을 DBMS에 이관하여도 괜찮다고 판단하였다. 하지만, 여러개의 DBMS에서 사용할 경우 한 row의 고유한 값을 보장할 수 없다.
해당 고민을 하면서 AI와 UUID에 대한 어떠한 트레이드 오프가 있는지 정리해보고자 한다.
Auto Increment
데이터베이스에서 사용되는 속성으로, 특정 필드의 값이 자동으로 증가하는 기능이며 해당 기능은 테이블에 새로운 레코드를 추가할 때마다 해당 필드의 값이 자동으로 증가하게 된다. 예를들어, 사용자 정보를 저장하는 테이블에서 각 사용자에게 고유한 ID를 부여하고 싶을 때 'autoincrement' 속성을 사용할 수 있다. 처음 사용자가 추가되면 ID는 1로 설정되며, 다음 사용자가 추가될 때 ID는 자동으로 2가 된다.
Auto Increment를 PK로 설정할 경우 이점
- 성능 최적화 : 많은 데이터베이스 시스템에서, 연속된 정수 값으로 구성된 기본 키는 인덱싱 및 조회 성능에 이점을 제공할 수 있다. 인덱스의 이점을 가지고 있다.
- MySQL의 기본 엔진인 InnoDB는 B+tree 구조로 이루어져 있는데 해당 구조는 UUID에 비해 Auto Increment가 성능의 이점을 가진다.
- UUID는 16Byte의 길이를 가진 문자열은 대표적인 Int(4Byte) or Long(8Byte)에 비해 속도가 느려 Auto Increment가 성능의 이점을 가진다.
- 고유성 보장 : 자동으로 값을 증가시켜 중복 없이 고유한 값을 생성하므로, 이를 기본 키로 사용할 경우 중복된 값을 걱정할 필요가 없다.
UUID(Universally Unique Identifier)
네트워크상에서 고유성을 보장하는 ID 표준 규약으로 UUID는 여러 시스템에서 객체나 정보를 고유하게 식별하는 데 사용될 수 있는 고유한 ID를 제공하기 위해 설계되었다.
UUID의 버전별 특징
버전 1: 현재의 타임스탬프와 MAC 주소를 기반으로 생성
버전 2: DCE 보안의 특정 값과, 타임스탬프 및 MAC 주소를 기반으로 생성
버전 3: 이름 기반 UUID로, MD5 해시를 사용
버전 4: 무작위 생성
버전 5: 이름 기반 UUID로, SHA-1 해시를 사용
UUID를 PK로 설정할 경우 이점
- 전역적 고유성(Global Uniqueness) : UUID는 전 세계적으로 고유한 값을 가지기에 여러 데이터베이스나 시스템 간의 데이터를 병합하거나 이동할 때 기본 키 충돌의 위험이 매우 적다.
- 중앙 관리 불필요 : UUID는 중앙에서의 관리나 생성 없이도 고유한 값을 생성할 수 있다. 따라서, 분산된 시스템에 유용하며, 클라이언트에서 직접 레코드의 키를 생성할 수 있다.
- 비 예측 값 : UUID는 무작위 생성으로 Auto Incremet와 달리 이전과 이후 레코드의 고유 값을 알 수 없기에 보안성을 상승시킨다.
- 데이터베이스 독립적, 복제 및 백업 용이성....
- 단점: 크기, 성능, 가독성
결론
나는 데이터베이스를 설계할 기회가 있어 한다면, 요구사항에 MSA가 없고 한 테이블에 40억 row가 생길 일이 없다면 Auto Increment로 설정한다. 그 이유는 UUID는 16Byte로 인덱스 성능 저하를 초래하며 가독성이 안좋다는 것은 개발자 입장에서 매우 큰 단점을 가진다.
예를들어 A라는 개발자가 B라는 개발자에게 132번 Row를 확인하라고 하는 것과 550e8400-e29b-41d4-a716-446655440000의 Row를 확인하라는 것은 생각보다 많은 리소스가 소모된다.
그럼 무조건 적으로 PK에는 Auto Increment가 옳은 것인가? 그렇지는 않다. 요구사항에 MSA가 있어 다양한 데이터베이스를 사용하며 UUID를 사용한다면 시스템의 전체 데이터베이스의 각각의 Row의 고유성을 가지기에 서버간 통신에도 많은 안전성을 가져다준다. 또한, 개발 도중에 데이터베이스를 변경해야하는 경우가 있다면 UUID가 Auto Increment에 비해 종속성이 매우 낮다.
해당 케이스도 Trade-Off 관계로 모든 개발은 Trade-Off 관계에서 적절한 관계를 찾아야한다.
상황에 맞게 사용하는 것이 무엇보다 중요하다.