필자는 어쩌다 보니 Openstack이라는 함정에 빠져있다. Openstack을 사용하다 보면 어쩔 수 없이 UUID를 마주칠 수밖에 없다. 대시보드를 통해 사용하면 UUID가 뭐든 간에 아무 상관 없이 쓸 수 있다. 하지만 CLI를 통해 사용하면, 욕부터 나온다. 일단 외울 수가 없으니, 조회를 하고 이를 복사해 붙여넣기를 통해서 다시 조회해야 한다. 이런 걸 왜 쓸까? 1
이 포스팅에서는 UUID가 무엇인지, 무슨 이유로 사용하는지, 어떻게 생성되는지에 관한 내용을 서술하겠다.
UUID
UUID는 Universally Unique Identifer의 약자로, 범용 고유 식별자이다.
또한, UUID는 RFC 4122 표준이다. 2
UUID의 주요 목적은 기존 중앙 집중식 고유 아이디 생성 방식에서의 탈피이다.
기존 시스템에서는 엔티티의 구분을 위해 대체 키를 사용할 때, 대체 키를 DB에서 할당받았다.
10억 명이 동시에 할당 요청하면, 10억 개의 대체 키 할당이 차례대로 처리된다는 말이다.
하지만, UUID를 사용하면 중앙 집중식으로 처리할 필요 없이 클라이언트 측에서 바로 생성할 수 있다.
사용자가 10억 명이던, 100억 명이던, 대체 키 할당 때문에 서버에서 들이는 노력이 사라지게 된다.
포맷
포맷은 다음과 같다.
- 16바이트
- 32개의 16진수
- 5개의 그룹, 그룹은 -(hyphen)을 구분된다.
- 8-4-4-4-12
예시는 다음과 같다.
- 1545c520-dc3e-4bd4-8c3c-93d20845a4a6
버전
UUID는 버전에 따라 UUID를 생성하는 방법이 달라진다.
- 1 버전: 시간 + mac 주소
- 2 버전: 시간 + mac 주소 + DCE security 버전
- 3 버전: hash(네임스페이스 이름) MD5
- 4 버전: 무작위(random)
- 5 버전: hash(네임스페이스 이름) SHA-1
필자는 개인적으로 4 버전을 선호한다. 다른 버전들은 컴퓨터의 정보를 이용해 생성하기 때문에, 컴퓨터의 정보가 외부로 유출되는 반면, 4 버전은 순수하게 무작위로 생성하기 때문이다.
변종(variant)
변종 필드는 UUID를 어떻게 해석할지에 대한 설정값이다. 네트워크 통신할 때 빅인디언, 리틀인디언을 사용해 직렬화(serialization)/역직렬화(deserialization)을 하는 것과 같다.
공식적으로는 4가지 변형이 존재한다. (x는 don't care)
- 0: 0xx, NCS backward compatibility
- 1: 10x, 기본
- 2: 110, Microsoft backward compatibility
- 3: 111, for the future
현재까지는 1, 2번 변형만 사용되고 있다. 각각이 무엇을 의미하는지는 몰라도 된다. 그저, UUID 중 1bit~3bit는 변형 필드를 위해 사용된다는 것만 인지하면 된다.
생성 방식
버전 4 UUID 생성 방식은 다음과 같다.
1. 무작위로 16바이트를 생성한다.
a. 12345678-1234-1234-1234-1234567890AB
2. 버전을 기재한다.
a. 12345678-1234-4234-1234-1234567890AB
3. 변형을 기재한다.
a. 12345678-1234-4234-9234-1234567890AB
장단점
장점
- 중앙집중 방식일 필요가 없다.
- 충돌 가능성이 있으나, 확률이 매우 낮다.
단점
- DB에서 일반적으로 사용하는 INT에 비해서 크다.
- 읽기 힘들다. 외우기 힘들다.
마치며...
지금까지 UUID에 대해 알아봤다. UUID는 만들어지고 표준이 된 것인지, 표준으로써 만들어진 건지는 모르겠지만, 국제 표준으로 지정이 된 것으로 보면 충돌 가능성이 얼마나 낮은지 감각적으로 알게 될 것이다. 읽기 어렵다는 치명적인 단점이 있긴 하지만, auto increment로 생성된 숫자도 읽기 어려운 것은 마찬가지이다. 그러니 기회가 된다면, UUID를 적극적으로 밀어보자. 3
'술(述) > 풀이' 카테고리의 다른 글
headless server(헤드리스 서버) (0) | 2021.11.22 |
---|---|
횡단 관심사(Cross-cutting concerns) (0) | 2021.11.18 |
사용자 스토리(User story) (0) | 2021.11.10 |
버전(Version) (0) | 2021.10.20 |
결합도와 응집도 (0) | 2021.10.12 |