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 |

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 μ΄ λμ§ μμ μ±λ₯μ μ΄μ μ΄ μλ€.

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
'π 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 |