• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

UUID 사용 이유

21.04.17 01:12 작성 조회수 3.54k

2

안녕하세요! 아직 학생이라 모르는 부분이 많아 자주 질문을 드리네요 ㅎㅎ.. 항상 감사하게 생각하고 있습니다.

다름이 아니라 email 이 아니라 UUID를 이용해서 토큰을 만드는 이유에 대해서 궁금합니다.

검색을 해보니 UUID는 를 사용하는 이유는 중복되지 않게 하기 위함 이라고 이해하였습니다.

하지만 사용자 관련 서비스에서 회원가입 시에 email이 동일한 사용자는 회원가입이 안되게 한다면 중복성에 대한 문제는 해결할 수 있지 않을까? 그럼 users 테이블에 있는 id 컬럼과 userId 컬럼 중 하나는 사라져도 되겠다. 그럼 DB에 저장해야할 칼럼도 줄어들고, 더 좋지 않을까? 라고 생각을 하게 되었습니다. 

하지만 강사님이 users 테이블에 id 컬럼과 userId 컬럼을 두면서 까지 UUID 를 쓰는 이유는 분명히 존재할 것 같아서 이렇게 질문 올려봅니다..!

답변 1

답변을 작성해보세요.

15

안녕하세요, 이도원입니다. 

UUID의 일반적인 목적은 고유한 식별자를 갖기 위함니다. UUID가 고유한 키를 생성하기 위한 유일한 방법이라기 보다는 고유한 키를 간단하게 생성해서 사용할 수 있기 떄문에 사용합니다. 물론 UUID 값 자체를 저장하기 위해 일밙거인 키보다 많은 용량의 스토리지 필요하기도 합니다. 

그러나, 분산 환경이나 동시성이 중요시 되는 작업에서 다음과 같은 상황이 발생한다고 가정해 봅시다.

- DB에서 각 레코드들의 ID를 한곳에서 관리하려고 하지 않을 때

- 여러 구성 요소 및 서비스들이 고유하지 않은 식벽자를 독립적으로 생성할 가능성이 있을 때

위와 같은 상황에서 고유한 키를 어떻게 처리해야 할지 결정해야 합니다. 물론, 하나의 데이터베이스만을 사용하는 경우라면 굳이 유니크한 키를 사용할 필요는 없습니다. 또는, 어떤 키가 레코드를 고유하게 만드는 속성(Email, 주민등록번호 등)이라고 하면 역시 UUID가 필요하지 않을 수 있습니다. 

그러나, 여러 데이터베이스를 사용하는 경우나 분산된 환경에서 애플리케이션을 운영하는 경우에, 자동 증가된(또는 시퀀스 넘버) 컬럼으로 레코드를 구분하는 경우라면, 서로 다른 레코드에 대해서 같은 ID가 사용될 확률이 높습니다. 이럴 경우에는 자동 증가 컬럼 이외에 ID를 생성해 주는 로직이 필요하게 됩니다(예, USR-0001, USR-0001, ITEM-0002 ...). 이럴 결우 UUID가 조금은 쉽게 처리할 수 있는 방법이라고 생각됩니다. 모든 레코드이 고유한 ID를 위해서 Email와 같은 고유 컬럼을 가지고 있지 않기 때문에, 고유키 생성 로직을 사용하는 것과 UUID 사용하는 것 등을 고려해야 할 것 같습이다. 

강의에서 사용된 예제에서는 데이터 레코드의 크기나 데이터의 구조를 보았을 때, UUID를 사용하지 않고도 충분히 설명할 수 있기는 하지만, 일반적인 상황을 고려하여 UUID를 사용하는 쪽으로 설명하였습니다. 참고하시기 바랍니다. 

감사합니다.