PostgreSQL과 MySQL은 둘 다 널리 사용되는 관계형 데이터베이스 관리 시스템(RDBMS)이지만, 몇 가지 중요한 차이점이 있다.
ACID 준수:
확장성 및 기능:
데이터 타입 지원:
인덱스와 쿼리 최적화:
복제 및 고가용성:
PostgreSQL에서 UUID(Universally Unique Identifier)는 고유한 값 생성에 매우 유용한 데이터 타입이다. 특히 분산 시스템에서 고유 식별자로 사용하기 적합하다. UUID는 문자열 형태로 표현되며, 전 세계적으로 고유한 값이다.
UUID 생성 방식:
uuid-ossp 확장을 통해 생성할 수 있다. 이 확장은 다양한 버전의 UUID를 생성하는 함수를 제공한다.UUID와 IDENTITY의 차이점:
PostgreSQL에 uuid-ossp 확장 설치:
PostgreSQL에서 UUID를 생성하려면 uuid-ossp 확장을 설치해야 한다.
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
이 명령은 PostgreSQL 데이터베이스에서 UUID를 생성할 수 있는 함수를 활성화한다.
UUID를 기본키로 사용하는 테이블 생성:
다음은 UUID를 기본키로 사용하는 테이블을 생성하는 SQL 명령이다.
CREATE TABLE orders (
order_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
user_id INT NOT NULL,
store_id UUID NOT NULL,
total_price NUMERIC(10, 2),
total_quantity INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
여기서 order_id 필드는 UUID 타입이며, 기본값으로 uuid_generate_v4() 함수를 사용하여 UUID를 자동으로 생성하도록 설정되어 있다.
Spring Boot와 JPA에서 UUID 기본키 사용하기:
Spring Boot 애플리케이션에서 JPA를 사용하여 UUID를 기본키로 사용하는 엔티티를 정의하는 방법은 다음과 같다.
package com.baedalping.delivery.order.entity;
import jakarta.persistence.*;
import java.util.UUID;
import lombok.*;
@Entity
@Table(name = "orders")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "order_id", updatable = false, nullable = false, columnDefinition = "UUID")
private UUID orderId;
@Column(name = "user_id", nullable = false)
private Long userId;
@Column(name = "store_id", columnDefinition = "UUID", nullable = false)
private UUID storeId;
@Column(name = "total_price", precision = 10, scale = 2)
private Double totalPrice;
@Column(name = "total_quantity")
private Integer totalQuantity;
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
@Column(name = "updated_at")
private LocalDateTime updatedAt;
}
orderId 필드는 UUID 타입으로 지정되며, @GeneratedValue 어노테이션의 strategy를 GenerationType.AUTO로 설정하여 UUID가 자동으로 생성되도록 한다.columnDefinition을 UUID로 설정하여 PostgreSQL에서 UUID 타입을 명시적으로 지정한다.장점:
단점:
인덱싱 전략:
btree 인덱스가 기본이지만, UUID에 적합하지 않을 수 있다. hash 또는 pg_trgm과 같은 다른 인덱스를 고려할 수 있다.UUID 버전 선택:
애플리케이션 레벨에서의 유효성 검증:
이 TIL을 통해 PostgreSQL의 특징, MySQL과의 차이점, UUID를 기본키로 사용하여 설계하고 구현하는 방법에 대해 학습했다. UUID를 기본키로 사용함으로써 분산 시스템에서의 고유성 보장과 보안성을 확보할 수 있으나, 성능에 미치는 영향도 고려해야 한다.