PostgreSQL의 특성 및 MySQL과의 차이점, UUID를 기본키로 사용하는 방법

Skadi·2024년 8월 26일
0

1. PostgreSQL과 MySQL의 차이점


PostgreSQL과 MySQL은 둘 다 널리 사용되는 관계형 데이터베이스 관리 시스템(RDBMS)이지만, 몇 가지 중요한 차이점이 있다.

  • ACID 준수:

    • PostgreSQL은 완전한 ACID(Atomicity, Consistency, Isolation, Durability) 준수를 제공하여 트랜잭션의 안정성을 보장한다. PostgreSQL은 트랜잭션 관리, 동시성 제어, 복구 메커니즘을 제공하는데 매우 강력하다.
    • MySQL도 ACID를 준수하지만, 엔진에 따라 다를 수 있다. MySQL의 기본 스토리지 엔진은 InnoDB이며, 이는 ACID 준수를 지원한다. 그러나 MyISAM과 같은 다른 스토리지 엔진은 ACID를 완전히 준수하지 않는다.
  • 확장성 및 기능:

    • PostgreSQL은 고급 기능과 확장성을 제공한다. 예를 들어, 사용자 정의 함수, 저장 프로시저, 복합 데이터 타입, 배열, 지리 정보 시스템(GIS) 기능 등을 지원한다.
    • MySQL은 사용하기 쉽고 빠른 속도를 자랑하지만, PostgreSQL만큼의 고급 기능은 제공하지 않는다. 그러나 기본적인 CRUD 작업과 웹 애플리케이션에 충분한 성능을 제공한다.
  • 데이터 타입 지원:

    • PostgreSQL은 매우 다양한 데이터 타입을 지원한다. 예를 들어, JSON, XML, HSTORE(키-값 쌍 저장), 배열, 사용자 정의 타입 등을 지원하여 유연성을 제공한다.
    • MySQL도 JSON과 같은 일부 고급 데이터 타입을 지원하지만, PostgreSQL만큼 광범위한 타입은 제공하지 않는다.
  • 인덱스와 쿼리 최적화:

    • PostgreSQL은 B-Tree, Hash, GIN(Generalized Inverted Index), GiST(Generalized Search Tree) 등 다양한 인덱스를 지원하여 쿼리 성능 최적화에 강점이 있다.
    • MySQL은 B-Tree 인덱스를 주로 사용하며, 인덱스 기능이 상대적으로 단순하다.
  • 복제 및 고가용성:

    • PostgreSQL은 스트리밍 복제, 로지컬 복제, 동기 및 비동기 복제 등을 지원하여 고가용성과 확장성을 제공한다.
    • MySQL은 마스터-슬레이브 복제 및 그룹 복제를 제공한다. MySQL은 Galera Cluster와 함께 멀티 마스터 복제도 지원한다.

2. UUID를 기본키로 사용하는 방법


PostgreSQL에서 UUID(Universally Unique Identifier)는 고유한 값 생성에 매우 유용한 데이터 타입이다. 특히 분산 시스템에서 고유 식별자로 사용하기 적합하다. UUID는 문자열 형태로 표현되며, 전 세계적으로 고유한 값이다.

  • UUID 생성 방식:

    • PostgreSQL에서 UUID는 uuid-ossp 확장을 통해 생성할 수 있다. 이 확장은 다양한 버전의 UUID를 생성하는 함수를 제공한다.
    • 가장 흔히 사용되는 UUID 버전은 UUID v4로, 랜덤 값을 기반으로 생성된다.
  • UUID와 IDENTITY의 차이점:

    • IDENTITY(MySQL의 AUTO_INCREMENT와 유사)는 순차적으로 증가하는 정수 값이다. 이는 단일 서버 환경에서는 성능이 좋고 사용하기 쉬우며, 값이 순서대로 정렬된다.
    • UUID는 전 세계적으로 고유한 식별자를 보장하며, 여러 서버에서 동시에 생성되어도 중복되지 않는다. 따라서 분산 시스템에서 데이터 충돌을 방지하는 데 유용하다. 그러나 UUID는 비교적 크고 랜덤하므로, 인덱싱 및 검색 성능이 저하될 수 있다.
PostgreSQL에서 UUID를 기본키로 사용하기 위한 설정 과정 및 코드 예제
  1. PostgreSQL에 uuid-ossp 확장 설치:

    PostgreSQL에서 UUID를 생성하려면 uuid-ossp 확장을 설치해야 한다.

    CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

    이 명령은 PostgreSQL 데이터베이스에서 UUID를 생성할 수 있는 함수를 활성화한다.

  2. 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를 자동으로 생성하도록 설정되어 있다.

  3. 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 어노테이션의 strategyGenerationType.AUTO로 설정하여 UUID가 자동으로 생성되도록 한다.
    • columnDefinitionUUID로 설정하여 PostgreSQL에서 UUID 타입을 명시적으로 지정한다.

3. UUID를 기본키로 사용함으로써 얻는 장점과 단점


  • 장점:

    • 전 세계 고유성: 여러 서버 간 또는 여러 인스턴스 간의 고유성 보장. 특히 분산 시스템에서 유용하다.
    • 보안성: 순차적인 ID 값은 데이터베이스의 내부 구조를 추측할 수 있는 위험이 있지만, UUID는 난수 기반이므로 추측이 어렵다.
    • 병렬 처리의 효율성: 여러 서버에서 동시에 레코드를 생성해도 충돌 없이 고유한 ID를 생성할 수 있다.
  • 단점:

    • 성능 저하: UUID는 정수형 ID보다 크기 때문에 인덱싱 및 검색 성능이 상대적으로 떨어질 수 있다.
    • 메모리 사용량 증가: UUID는 정수형 ID보다 크기 때문에 저장 공간과 메모리 사용량이 증가할 수 있다.

4. UUID 사용 시 고려할 점


  • 인덱싱 전략:

    • UUID를 기본키로 사용할 때 인덱싱을 최적화해야 한다. PostgreSQL에서는 btree 인덱스가 기본이지만, UUID에 적합하지 않을 수 있다. hash 또는 pg_trgm과 같은 다른 인덱스를 고려할 수 있다.
  • UUID 버전 선택:

    • UUID는 여러 버전이 있으며, 각각 생성 방식이 다르다. v1은 시간과 MAC 주소를 사용하여 생성하고, v4는 랜덤한 값을 사용하여 생성한다. 보안과 성능 요구 사항에 따라 적절한 버전을 선택해야 한다.
  • 애플리케이션 레벨에서의 유효성 검증:

    • UUID의 유효성 검증을 애플리케이션 코드에서 처리할 수 있다. 예를 들어, 잘못된 형식의 UUID가 입력되지 않도록 한다.

이 TIL을 통해 PostgreSQL의 특징, MySQL과의 차이점, UUID를 기본키로 사용하여 설계하고 구현하는 방법에 대해 학습했다. UUID를 기본키로 사용함으로써 분산 시스템에서의 고유성 보장과 보안성을 확보할 수 있으나, 성능에 미치는 영향도 고려해야 한다.

0개의 댓글