-
PostgreSQL을 추천하는 이유배움/백엔드 2025. 5. 29. 12:00반응형
Nestjs 기반 서비스를 만들다가 Gemini에서 얻은 답변 공유.
- 데이터의 구조와 관계:
- 사용자 관리: 사용자 계정(ID, 비밀번호 해시, 역할)은 매우 구조화되어 있고 관계형입니다. 특정 사용자가 특정 이미지를 생성했다는 정보처럼, 사용자-이미지, 사용자-워크플로우 등 명확한 관계를 가질 가능성이 높습니다. PostgreSQL 같은 관계형 데이터베이스는 이러한 구조화된 데이터와 그 관계를 효율적으로 저장하고 관리하는 데 특화되어 있습니다.
- 워크플로우 및 생성 기록: ComfyUI 워크플로우의 파라미터, 생성된 이미지의 메타데이터(프롬프트, 설정값), 그리고 그 생성 기록들은 대부분 일관된 구조를 가질 것으로 예상됩니다. 이런 데이터를 저장하고 나중에 특정 조건으로 검색하며 집계하는 데는 관계형 데이터베이스가 매우 강력합니다.
- 데이터 무결성과 일관성 (ACID 준수):
- PostgreSQL은 **ACID 속성(원자성, 일관성, 고립성, 지속성)**을 완벽하게 준수합니다. 이는 특히 사용자 인증, 권한 부여와 같이 데이터의 정확성과 신뢰성이 매우 중요한 작업에서 필수적입니다. 예를 들어, 사용자가 비밀번호를 변경하거나, 역할이 변경될 때 데이터가 정확하게 업데이트되어야 합니다.
- MongoDB는 최근 버전에서 멀티-문서 트랜잭션을 지원하지만, 전통적으로 관계형 데이터베이스만큼 강력한 ACID 보장을 제공하지는 않았습니다.
- 강력한 쿼리 기능 (SQL):
- PostgreSQL의 SQL은 복잡한 데이터 조회, 여러 테이블 간의 조인(JOIN), 그리고 강력한 집계(Aggregation) 기능을 제공합니다. 나중에 "가장 많이 사용된 프롬프트", "특정 사용자가 생성한 모든 이미지", "특정 모델로 생성된 이미지 중 특정 조건에 맞는 것" 등을 찾아야 할 때 SQL의 유연하고 강력한 쿼리 기능이 큰 장점이 됩니다.
- MongoDB의 쿼리 언어(MQL)와 Aggregation Framework도 강력하지만, 관계형 데이터베이스의 SQL 조인만큼 직관적이고 유연하지 않은 경우가 많습니다.
- 확장성과 안정성:
- PostgreSQL은 오랫동안 사용되어 온 성숙한 기술이며, 대규모 트래픽과 데이터 볼륨을 처리할 수 있는 높은 안정성과 확장성을 갖추고 있습니다. 엔터프라이즈 환경에서도 널리 사용됩니다.
- NestJS와의 궁합:
- NestJS는 TypeORM, Prisma, MikroORM 등 다양한 ORM을 통해 관계형 데이터베이스와 매우 강력하게 통합됩니다. 타입스크립트의 타입 시스템을 활용하여 데이터베이스 스키마와 애플리케이션 코드를 일치시키는 데 유리합니다.
ACID 속성이란?
ACID 속성은 데이터베이스 트랜잭션(Transaction)이 안전하게 수행되었음을 보장하기 위한 4가지 중요한 특성을 의미합니다. 데이터베이스 시스템, 특히 관계형 데이터베이스(RDBMS)에서 데이터 무결성을 보장하는 핵심 개념입니다.
ACID는 다음 네 가지 단어의 앞 글자를 따온 것입니다.
- Atomicity (원자성)
- Consistency (일관성)
- Isolation (고립성)
- Durability (영속성)
이 네 가지 특성은 하나의 트랜잭션이 데이터베이스 상태를 한 일관된 상태에서 다른 일관된 상태로 안전하게 전환할 수 있도록 합니다.
하나씩 자세히 설명해 드릴게요.
1. Atomicity (원자성)
- 개념: 트랜잭션 내의 모든 작업은 전부 성공하거나, 아니면 전부 실패하여 아무 작업도 수행되지 않은 것과 같은 상태(원래 상태)로 되돌려져야 합니다. 즉, 트랜잭션은 더 이상 쪼갤 수 없는 하나의 원자적인 단위로 간주됩니다.
- 예시: 은행 계좌 이체
- A 계좌에서 1만원 인출
- B 계좌에 1만원 입금 이 두 작업은 하나의 트랜잭션입니다. 만약 A 계좌에서 돈이 인출되었는데 B 계좌에 입금되지 못하는 상황이 발생하면, 전체 트랜잭션은 롤백(Rollback)되어 A 계좌의 돈이 다시 원래대로 돌아와야 합니다. 중간에 실패한 상태로 남아서는 안 됩니다.
2. Consistency (일관성)
- 개념: 트랜잭션이 성공적으로 완료되면, 데이터베이스는 항상 일관된 상태를 유지해야 합니다. 즉, 데이터베이스의 규칙(무결성 제약 조건, 트리거 등)을 위반하는 트랜잭션은 허용되지 않아야 합니다. 트랜잭션 시작 전후의 데이터베이스는 항상 유효한 상태여야 합니다.
- 예시: 은행 계좌 이체
- 총 계좌 잔액의 합은 항상 일정해야 합니다. A에서 B로 1만원을 이체했을 때, A 계좌 잔액은 1만원 줄고 B 계좌 잔액은 1만원 늘어 총 합은 변함이 없어야 합니다. 만약 어떤 이유로든 이 합이 달라진다면 일관성이 깨진 것입니다.
- NOT NULL 제약 조건, UNIQUE 제약 조건, 외래 키(Foreign Key) 제약 조건 등을 위반하는 트랜잭션은 커밋(Commit)될 수 없습니다.
3. Isolation (고립성)
- 개념: 여러 트랜잭션이 동시에 실행될 때, 각 트랜잭션은 다른 트랜잭션의 영향을 받지 않고 독립적으로 실행되는 것처럼 보여야 합니다. 마치 시스템 내에서 단일 트랜잭션만 실행되는 것처럼 동작해야 합니다.
- 예시: 재고 관리 시스템
- 트랜잭션 1: 상품 X의 재고를 10개에서 5개로 줄입니다.
- 트랜잭션 2: 상품 X의 재고를 조회하여 10개라고 표시합니다. 만약 고립성이 없다면, 트랜잭션 2가 트랜잭션 1이 아직 완료되지 않은(커밋되지 않은) 중간 상태의 데이터를 읽어 5개로 잘못된 재고를 조회할 수도 있습니다. 고립성이 보장되면, 트랜잭션 2는 트랜잭션 1이 완전히 커밋된 후의 5개 또는 트랜잭션 1 시작 전의 10개 둘 중 하나만을 보게 됩니다.
- 문제점: 동시성 제어(Concurrency Control) 메커니즘이 필요하며, 이는 성능 저하를 야기할 수 있어 다양한 **고립 수준(Isolation Level)**이 존재합니다. (Read Uncommitted, Read Committed, Repeatable Read, Serializable)
4. Durability (영속성)
- 개념: 트랜잭션이 한 번 성공적으로 커밋(Commit)되면, 그 결과는 시스템 오류(전원 손실, 시스템 충돌 등)에도 불구하고 영구적으로 데이터베이스에 저장되어야 합니다.
- 예시: 데이터 저장
- 게시판에 새로운 글을 작성하고 '저장' 버튼을 눌러 트랜잭션이 커밋되었습니다. 이 직후 서버에 전원이 나가더라도, 서버가 다시 시작되었을 때 방금 저장한 글은 데이터베이스에 그대로 남아 있어야 합니다.
- 구현: 주로 디스크(비휘발성 저장 장치)에 데이터를 기록하거나, 로그 파일에 변경 사항을 기록하는 방식으로 구현됩니다.
정리
ACID 속성은 데이터베이스의 신뢰성을 보장하는 데 필수적인 개념이며, 특히 관계형 데이터베이스는 이러한 속성을 강력하게 지원합니다. 금융, 재고 관리, 사용자 인증과 같이 데이터의 정확성이 매우 중요한 시스템에서는 ACID 준수가 필수적입니다. NoSQL 데이터베이스들은 유연성과 확장성을 위해 때로는 ACID 속성 중 일부(주로 일관성, 고립성)를 완화하는 경우가 있습니다.
이 프로젝트에서 사용자 인증과 같은 핵심 기능에 PostgreSQL을 추천하는 이유 중 하나가 바로 이 ACID 속성의 강력한 보장 때문입니다.
반응형'배움 > 백엔드' 카테고리의 다른 글
세션 기반 인증의 이론 및 전체 과정 (0) 2025.05.31 MongoDB를 추천하는 이유 (1) 2025.05.30 Race condition (경쟁 상태) (2) 2025.01.28 MongoDB 데이터를 백업하거나 덮어씌우는 방법 (dump, restore) (1) 2024.01.24 Promise.race() (5) 2023.11.27 - 데이터의 구조와 관계: