JPA 에 UUID version 7 μ μš©ν•˜κΈ°

2024. 3. 4. 22:25Β·πŸ“‚ backend/spring

1. UUID (Universally Unique IDentifier) ??

λ²”μš© 고유 μ‹λ³„μžλŠ” λ„€νŠΈμ›Œν¬ μƒμ—μ„œ μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μ‹λ³„μžλ₯Ό λ§Œλ“€κΈ° μœ„ν•œ ν‘œμ€€ κ·œμ•½μ΄λ‹€. GUID(μ „μ—­μ μœΌλ‘œ
고유 μ‹λ³„μž)라고도 λΆ€λ₯΄λ©° RFC4122 둜 μ§€μ •λ˜μ–΄ μžˆλ‹€. UUIDλŠ” μ•„λž˜μ™€ 같은 κ·œμΉ™μ„ 기반으둜 μƒμ„±λœλ‹€.

  • UUID λŠ” 128bit(16 octec) μˆ˜μ΄λ‹€. 32개의 16μ§„μˆ˜λ‘œ ν‘œν˜„λ˜λ©°, ν•˜μ΄ν”ˆ(-)을 포함해 총 36개 문자둜 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.
  • UUID λŠ” 8-4-4-4-12 ν˜•νƒœλ‘œ 총 5개의 그룹이며 ν•˜μ΄ν”ˆ(-) 을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ μžˆλ‹€.
이름 길이(byte) 길이(hex) 길이(bits) λ‚΄μš©
time_low 4 8 32 μ‹œκ°„μ˜ low 32bit λ₯Ό λΆ€μ—¬ν•˜λŠ” μ •μˆ˜
time_mid 2 4 16 μ‹œκ°„μ˜ middle 16bit λ₯Ό λΆ€μ—¬ν•˜λŠ” μ •μˆ˜
time_hi_and_version 2 4 16 μ΅œμƒμœ„ λΉ„νŠΈμ—μ„œ 4bit λŠ” version, 12 bitλŠ” μ‹œκ°„μ˜ high
clock_seq_hi_and_res_clock_seq_low 2 4 16 μ΅œμƒμœ„ λΉ„νŠΈμ—μ„œ 1-3 bit λŠ” UUID λ ˆμ΄μ•„μ›ƒ ν˜•μ‹
13-15 bitλŠ” clock sequcne
node 6 12 48 48bit λŠ” node_id

 

source : https://www.techtarget.com/searchapparchitecture/definition/UUID-Universal-Unique-Identifier

 

2. Time based UUID

[1] Time Based UUID version

  • UUID version 1 : gregorian epoch 기반의 time-based version (ordered X)
  • UUID version 6 : gregorian epoch 기반의 time-ordered version
  • UUID version 7 : Unix Epoch timestamp 기반의 time-ordered version 
Time-based UUID structure
00000000-0000-v000-m000-000000000000
|1-----------------------|2-----|3--------------|

1: timestamp
2: clock-sequence
3: node identifier

 

[2] Time Based UUID 의 μž₯점

RDB clustered index rebalancing : MySQL 은 PK λ₯Ό 기반으둜 clustered index λ₯Ό μƒμ„±ν•œλ‹€. clustered index λŠ” PK λ₯Ό 기반으둜 μ •λ ¬λœλ‹€. λ§Œμ•½ μ •λ ¬λ˜μ§€ μ•Šμ€ 값이 μ‚½μž…λ  경우, 이후 인덱슀의 데이터 νŽ˜μ΄μ§€λ₯Ό λ‹€μ‹œ μž¬μ •λ ¬ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ λ°œμƒν•œλ‹€. 이λ₯Ό index rebalancing 이라 λΆ€λ₯΄λ©°, 운영 ν™˜κ²½μ—μ„œ index rebalaning 이 μ΄λ£¨μ–΄μ§€λŠ” 경우 였히렀 μ„±λŠ₯이 λ–¨μ–΄μ§ˆ 수 μžˆλŠ” μœ„ν—˜μ΄ μžˆλ‹€.

 

 ν”νžˆ μ‚¬μš©ν•˜λŠ” UUID version4 λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 데이터λ₯Ό μ‚½μž…ν•˜λŠ” 경우, 데이터 νŽ˜μ΄μ§€λ₯Ό λ‹€μ‹œ μ •λ ¬ν•΄μ•Ό ν•˜λ―€λ‘œ index rebalancing 을 ν•΄μ•Ό λ˜μ–΄ μ„±λŠ₯상이 μ΄μŠˆκ°€ λ°œμƒν•  수 μžˆλ‹€. 반면 time-based ordered uuid λŠ” 데이터λ₯Ό μΆ”κ°€ν•˜λ”λΌλ„ λ§ˆμ§€λ§‰ 데이터 νŽ˜μ΄μ§€μ— μΆ”κ°€λ˜λ―€λ‘œ index rebalancing 이 λ˜μ§€ μ•Šμ•„ μ„±λŠ₯상 이점이 μžˆλ‹€.

 

25000 개의 데이터λ₯Ό μ‚½μž… λ•Œμ˜ λ²€μΉ˜λ§ˆν‚Ή 데이터

 

3. JPA 에 UUID version7 을 적용.

implementation 'com.fasterxml.uuid:java-uuid-generator:4.3.0'
// UUID Version 7: 01870603-f211-7b9a-a7ea-4a98f5320ff8
System.out.println("UUID Version 7: " + UuidCreator.getTimeOrderedEpoch());

 

[1] Spring Boot 2.x

import java.io.Serializable;

import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;

import com.github.f4b6a3.uuid.UuidCreator;

public class UuidV7Generator implements IdentifierGenerator {

	@Override
	public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o)
		throws HibernateException {
		return UuidCreator.getTimeOrderedEpoch();
	}

}
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {

	@Id
	@GeneratedValue(generator = "uuidV7")
	@GenericGenerator(name = "uuidV7",
		strategy = "com.cooper.common.data.generator.UuidV7Generator")
	@Column(columnDefinition = "BINARY(16)")
	private UUID id;
    
    ...
}

 

[2] Spring Boot 3.x

import static org.hibernate.generator.EventTypeSets.INSERT_ONLY;

import java.util.EnumSet;

import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.generator.BeforeExecutionGenerator;
import org.hibernate.generator.EventType;

import com.github.f4b6a3.uuid.UuidCreator;

public class UnixEpochTimeOrderedIdGenerator implements BeforeExecutionGenerator {
	@Override
	public Object generate(SharedSessionContractImplementor session, Object owner, Object currentValue,
		EventType eventType) {
		return UuidCreator.getTimeOrderedEpoch();
	}

	@Override
	public EnumSet<EventType> getEventTypes() {
		return INSERT_ONLY;
	}
}
@IdGeneratorType(UnixEpochTimeOrderedIdGenerator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE } )
@Inherited
public @interface UnixTimeOrderedUuidGeneratedValue {
}
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Product {

	@Id
	@UnixTimeOrderedUuidGeneratedValue
	@Column(columnDefinition = "BINARY(16)")
	@Getter
	private UUID id;
...
}

 

Reference

  • https://www.percona.com/blog/store-uuid-optimized-way/
  • https://unicorn-utterances.com/posts/what-are-uuids
  • https://datatracker.ietf.org/doc/html/rfc4122
  • https://www.baeldung.com/java-generating-time-based-uuids

'πŸ“‚ backend > spring' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Spring Batch Architecture  (0) 2024.05.10
hibernate.query.in_clause_parameter_padding = true ?  (1) 2024.03.06
[Spring] Spring AOP λ™μž‘ μ•Œμ•„λ³΄κΈ°  (0) 2024.03.04
[JPA] μ½”λ“œλ‘œ λ³΄λŠ” OSIV 와 κ³ μ°°  (2) 2024.01.30
QueryDSL transform() μ—μ„œ κΌ­ @Transactional 을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 이유  (0) 2024.01.29
'πŸ“‚ backend/spring' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • Spring Batch Architecture
  • hibernate.query.in_clause_parameter_padding = true ?
  • [Spring] Spring AOP λ™μž‘ μ•Œμ•„λ³΄κΈ°
  • [JPA] μ½”λ“œλ‘œ λ³΄λŠ” OSIV 와 κ³ μ°°
cooper25
cooper25
  • cooper25
    dev cooper
    cooper25
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (84)
      • πŸ“‚ backend (34)
        • spring (19)
        • architecture (10)
        • test (5)
      • πŸ“‚ computer-science (5)
      • πŸ“‚ programming-language (12)
        • java (12)
      • πŸ“‚ infra (9)
        • mysql (4)
        • redis (2)
        • message-queue (3)
      • πŸ“‚ cloud (2)
        • aws (2)
      • πŸ“‚ frontend (1)
        • react (0)
      • πŸ“‚ education & lecture (16)
        • 인프라 곡방 (11)
        • ν•­ν”Œ λ°±μ—”λ“œ 7κΈ° (5)
      • πŸ“‚ ai (1)
        • claude (1)
      • πŸ“‚ etc (2)
        • 회고 (1)
        • 컨퍼런슀 (1)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    gof
    데이터 쀑심 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 섀계
    UUID
    spring AOP
    회고
    mysql
    kafka
    μŠ€ν”„λ§μΊ ν”„ ν›„κΈ°
    Redisson
    spring
    nGrinder
    react
    JPA
    ν•­ν•΄ν”ŒλŸ¬μŠ€
    λ™μ‹œμ„±
    인프라곡방
    spring-batch
    spring camp 2025
    AWS
    가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ 섀계
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.6
cooper25
JPA 에 UUID version 7 μ μš©ν•˜κΈ°
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”