티스토리 뷰

 DB의 테이블을 설계하면서 ID를 생성할때 일반적으로 두 가지 선택권이 존재합니다. UUID를 이용하는 방법과 DB의 Increase Number를 활용하는 방법입니다. 

 

 우선 두 가지 방법에 대해 간단하게 소개해 드리겠습니다!

 UUID (= Universally Unique Identifier)는 여러 버전이 존재하는데요, 일반적으로 V4를 많이 사용합니다. 이유는 Random을 이용해 생성되기 때문입니다. 

 총 128bit로 구성되며 Dash를 포함하여 36자의 string으로 표현됩니다. V1과 V2는 Mac Address가 포함되어 있는데 이는 서버 자체 보안이 중요할 경우 서버의 Mac Address가 탈취될 위험이 있다고 합니다. 또한 Timestamp도 포함되어 있지만 비트단위로 쪼개져 정렬은 불가합니다. 

 이런 보안 문제로 난수로 표현되는 V4를 많이 사용하고 있습니다. 

 

핵심만 요약하면 장점으로 식별성이 없어 보안에 강합니다. 단점으로는 정렬이 불가능 하다는 점이 있습니다.

UUID V4 Example) 4546493c-9594-43a3-a99d-44bd5195b811

 

다음으로 Increase Number에 대해 설명드리면 말 그대로 1부터 시작해 차례로 증가하면서 ID를 부여하는 방식입니다. 해당 방식은 예측가능하다는 점과 size에 따라 overflow가 발생하기 쉽다는데 단점을 가지고 있습니다. 물론 1씩 증가하므로 쉽게 정렬이 가능하여 시계열 정렬이 필요한 경우에 큰 장점을 가지게 됩니다.

 

그럼 UUID의 장점을 챙기면서도 Increase Number처럼 정렬이 가능한 방법이 없을까요? 여러가지 대안들이 존재합니다.

 

 첫번째로 UUID의 새로운 버전들입니다. UUID v6, v7, v8은 각각 timestamp를 이용하여 정렬가능하게 표준이 정해졌습니다.

https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-04.html#name-new-formats

 

New UUID Formats

The authors gratefully acknowledge the contributions of Ben Campbell, Ben Ramsey, Fabio Lima, Gonzalo Salgueiro, Martin Thomson, Murray S. Kucherawy, Rick van Rein, Rob Wilton, Sean Leonard, Theodore Y. Ts'o., Robert Kieffer, sergeyprokhorenko, LiosK As we

www.ietf.org

 

 두번째는 ULID를 이용하는 방법입니다. ULID는 timestamp를 이용하여 정렬가능하며 1ms당 80bit의 난수를 생성하여 중복가능성을 매우 낮춘 방법입니다. 물론 UUID처럼 사람이 식별하기 어려워 보안적으로도 안전합니다.

 

https://github.com/ulid/spec

 

GitHub - ulid/spec: The canonical spec for ulid

The canonical spec for ulid. Contribute to ulid/spec development by creating an account on GitHub.

github.com

해당 ULID 스펙을 실제 Spring Entity에 적용하는 예시코드는 아래와 같습니다.

public class User {
  @Id
  @GeneratedValue(generator = "ulid")
  @GenericGenerator(name = "ulid", type = ULIDGenerator.class)
  private String id;
}

---

import io.azam.ulidj.ULID;

public class ULIDGenerator implements IdentifierGenerator, Configurable {

  @Override
  public String generate(SharedSessionContractImplementor implementor, Object entity) {
    return ULID.random();
  }

  @Override
  public void configure(Type type, Properties parameters, ServiceRegistry serviceRegistry) {
    IdentifierGenerator.super.configure(type, parameters, serviceRegistry);
  }
}

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함