개요
개발 프로젝트에서 데이터베이스의 각 레코드를 고유하게 식별해야 하는 경우가 많다. 일반적으로는 자동 증가하는 숫자형 ID를 사용하는 경우가 많지만, 분산 시스템이나 여러 서비스가 동시에 데이터베이스에 접근하는 환경에서는 고유성이 보장되는 UUID(Universally Unique Identifier)가 더 적합한 경우가 많다. 이번 프로젝트에서도 여러 서버에서 고유한 식별자를 생성해야 했기에, UUID를 사용하는 방법을 찾아보게 되었다.
UUID란 무엇인가?
UUID는 Universally Unique Identifier의 약자로, 전 세계적으로 고유한 식별자를 생성하는 데 사용된다. UUID는 128비트 길이의 숫자로 이루어져 있으며, 36자리의 문자열로 표현된다. 아래는 UUID의 일반적인 형식이다.
550e8400-e29b-41d4-a716-446655440000
UUID는 매우 큰 값의 범위를 갖기 때문에 중복될 확률이 거의 없다. 이 때문에 분산 시스템이나 여러 서비스가 동시에 데이터를 생성할 때, 고유 식별자를 보장하기 위해 많이 사용된다.
자바에서 UUID 생성하기
자바에서 UUID를 생성하는 것은 매우 간단하다. java.util.UUID 클래스를 사용하면 쉽게 UUID를 생성할 수 있다. 기본적으로는 UUID version 4를 많이 사용하는데, 이는 난수를 기반으로 UUID를 생성하는 방식이다.
import java.util.UUID;
public class UUIDExample {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println("생성된 UUID: " + uuid.toString());
}
}
이 코드를 실행하면 randomUUID() 메서드를 통해 고유한 UUID가 생성된다. 이를 문자열 형태로 변환해 데이터베이스나 파일에 저장할 수 있다.
UUID의 사용 예시
UUID는 데이터베이스의 기본 키로 사용할 수 있을 뿐만 아니라, 파일 이름을 고유하게 생성하거나, 트랜잭션 ID, 주문 번호, 사용자 세션 식별자 등 여러 용도로 활용할 수 있다.
import java.util.UUID;
public class OrderService {
public static void main(String[] args) {
String orderId = UUID.randomUUID().toString();
System.out.println("주문 번호: " + orderId);
}
}
이처럼 UUID를 사용하면, 별도의 추가 설정 없이 고유한 주문 번호를 생성할 수 있다. 이를 통해 여러 서버에서 동시에 주문이 들어오는 환경에서도 주문 번호의 충돌을 피할 수 있다.
UUID와 다른 고유 식별자 방식 비교
UUID 외에도 고유 식별자를 생성하는 여러 방식이 있다. 그중 하나가 데이터베이스에서 자동 증가(AUTO_INCREMENT)를 사용하는 방법이다. 그러나 이 방식은 분산 환경에서는 한계가 있다. 다른 방식으로는 Timestamp + Random 값을 조합하는 방식이 있는데, 이 역시 간단하고 유용하지만 UUID만큼의 범위와 고유성을 제공하지 못한다.
방식 | 고유성 보장 | 분산 시스템 적합성 | 길이 |
UUID | 매우 높음 | 매우 적합 | 128비트 |
AUTO_INCREMENT | 낮음 | 적합하지 않음 | 4~8바이트 |
Timestamp + Random | 중간 | 부분적으로 적합 | 가변적 |
정리
UUID는 자바에서 간편하게 고유한 식별자를 생성할 수 있는 강력한 도구이다. 특히 분산 시스템이나 여러 서비스가 동시에 데이터를 처리하는 환경에서 중복을 피하기 위한 최고의 방법 중 하나이다. 위에서 설명한 것처럼 UUID를 생성하고 사용하는 방법은 간단하며, 다양한 상황에서 고유성을 보장할 수 있다는 점에서 큰 장점이 있다. 필요에 따라 UUID를 활용하여 더욱 안전하고 유연한 시스템을 설계할 수 있을 것 같다.
'Java' 카테고리의 다른 글
[Java] 자바에서 Optional의 올바른 사용법 (0) | 2024.09.24 |
---|---|
[Java] 공통 적용 JsonDeserializer 만들어 보기 (4) | 2024.09.23 |
자바 StringBuilder와 StringBuffer는 뭐가 다를까? (0) | 2024.09.20 |
Cursor<T> (0) | 2023.03.09 |
[Java] Spring Boot Actuator (0) | 2023.02.14 |
댓글