본문 바로가기

Language/JAVA

[JAVA] UUID

프로젝트를 하다보면 UUID라는 값을 많이 보게 되더라고요.

처음에는 뭐를 의미하는지는 모르겠지만 어떤 ID값인가보다 생각했는데

이번에 UUID에 대해 작성하면서 제대로 공부해볼게요.

 

UUID라는게 뭘까요?

 

먼저 UUID는 Universal Unique Identifier의 줄임말이에요.

한국말로 하면 범용 고유 식별자 라고 하네요.

 

UUID는 네트워크 상의 개체들을 구분하기 위해 국제 표준(RFC 4122)으로 채택되어 사용하고 있는데요.

Java에서는 JDK 1.5부터 지원하고 있어요.

 

이 UUID를 이용하면 객체를 구분할 수 있는 거의 고유한 값을 생성해준다고 해요.

여기서 거의 고유하다고 말한 이유는 UUID를 생성하다 보면 아주 희박한 확률로

중복된 값이 나올 수도 있기 때문이에요.

 

저는 여기서 '그럼 그냥 ID 값이나 시퀀스 번호를 이용하지 왜 UUID를 사용하는거지?' 라고 생각이 들더라고요.

왜 UUID를 사용하는지는 조금 있다가 알아보고!

 

UUID는 128bit의 값으로 32개의 16진수로 표현된다고 해요.

자세히 알아보면 32개의 문자와 4개의 하이픈으로 구성되어 있는데요.

각 그룹의 문자는 8개-4개-4개-4개-12개로 구성되요.

 

그럼 각 자리의 문자는 무엇을 의미할까요?

이름 길이(바이트/비트) 내용
time_low 4/8 시간의 low 32비트를 부여하는 정수
time_mid 2/4 시간의 middle 16비트를 부여하는 정수
time_hi_and_version 2/4 최상위 비트에서 4비트 version, 그리고 시간의 High 12비트
clock_seq_hi_and_res_clock_seq_low 2/4 최상위 비트에서 1-3비트, 그리고 13-15비트 클럭 시퀀스
node 6/12 48비트 노드 ID

 

위키백과에서 참고하여 작성한 내용인데 정확한 의미는 다음에~

조금 더 공부해서 이 게시글에 작성해볼게요.

 

UUID는 버전에 따라 생성되는 방법이 다른데요.

  • 버전1 : 시간과 MAC 주소 결합하여 UUID를 생성해요.
  • 버전2 : 시간과 DCE(분산 컴퓨팅 환경) 보안을 결합하여 UUID를 생성해요.
  • 버전3 : 시간과 MD5 해시를 이용하여 UUID를 생성해요.
  • 버전4 : 시간과 난수 또는 의사난수(Random)를 결합하여 UUID를 생성해요.
  • 버전5 : 시간과 SHA-1 해시를 이용하여 UUID를 생성해요.

Java에서 UUID.randomeUUID()를 이용하여 UUID를 만들 경우에는

버전4 방법을 이용하여 생성해요.

 

그럼 이 UUID라는 것은 왜 사용할까요?

 

한 가지 예를 들어볼게요.

 

서울역에서 ‘김민수씨~’라고 외치면 몇 명의 사람들이 처다볼까요?

아마 많은 사람들이 보겠죠?

 

그럼 서울역에 있는 ‘김민수’라는 사람이 한명이라고 해봅시다!

이번에는 부산에서 ‘김민수씨~’라고 외쳤을 때 대답하는 사람은

우리가 서울에서 찾은 ‘김민수’라는 사람일까요?

맞을 수도 있지만 아닐 가능성이 더 높죠?

 

이처럼 서로 다른 네트워크(지역)에 있는 ‘김민수’라는 사람을 구분하기 위해

고유한 값이 필요한데요.

이 역할을 해주는 것이 바로 UUID에요.

 

그럼 앞에서 제가 생각했던 것처럼 ID나 시퀀스 번호를 이용하면 되지 않을까요?

이제 데이터베이스 측면으로 생각해봅시다!

 

물론 하나의 데이터베이스에서 모든 객체를 관리한다면 ID나 시퀀스 번호를 이용하면 되요!

그런데 요즘은 전세계에서 인터넷을 많이 이용하고 있으니

하나의 데이터베이스에서 이 모든 데이터를 관리하기는 힘들어요.

그래서 데이터를 분산해서 여러 데이터베이스들이 관리를 하는데요.

 

서울에 있는 데이터베이스kim001이라는 아이디로 서울에 있는 ‘김민수의 정보`를 저장했어요.

그럼 부산에 있는 데이터베이스에서 kim001이라는 아이디를 사용할 수 없을까요?

물론 데이터베이스끼리 통신해서 ID를 검증한다고면 사용할 수 없겠죠.

 

그런데 데이터베이스가 엄청 많아지면 검증을 위한 통신은 효율적이지 않아요.

이때 ID를 대신 할 고유한 값이 필요하게 되는거죠.

시퀀스 번호도 같은 이유로 고유한 값을 필요로 하겠죠.

 

이를 해결할 수 있는 것이 바로 UUID!

 

물론 100% 중복이 안된다고 보장할 수는 없어요.

하지만 중복된 값이 나올 확률이 거의 없다고 인정되어 많이 사용한다고 해요.

 

그럼 UUID의 장단점을 간략히 정리해볼까요?

 

  • 장점
    • 거의 중복되지 않는 고유한 값을 만들 수 있어요.
    • UUID 값만으로 데이터의 정보를 쉽게 추적할 수 없어요.
  • 단점
    • 16Byte(128bit) 이상의 값을 사용해서 값을 저장하는데 스토리지가 많이 필요해요.
      • 그래서 기본키로 사용하기에는 적합하지 않데요.
    • 값의 의미를 알 수 없어요.
      • 예를 들어 user_a_001이라고 하면 회원을 구분하기 위한 값이라고 유추할 수 있지만 UUID는 이런 의미들을 유추할 수 없어요.
      • 그리고 값의 연속성이 없어서 인덱스로 활용하기도 힘들어요.

'Language > JAVA' 카테고리의 다른 글

‘==’ vs equals() vs hashcode()  (0) 2022.05.27
Scanner vs BufferedReader  (0) 2022.05.11
0. JAVA란?  (0) 2020.01.08