장점:
속도와 성능: 읽기 중심의 웹 애플리케이션에 적합
사용 용이성: 설치와 설정이 간단하여 초보자에게 친숙
광범위한 지원: 다양한 호스팅 서비스와 도구에서 지원
단점:
기능 제한: 고급 기능이나 복잡한 쿼리 처리에 한계가 있을 수 있음
ACID 준수: InnoDB 스토리지 엔진 사용 시 ACID를 지원하지만, 다른 엔진에서는 제한적일 수 있음
장점:
표준 준수: SQL 표준을 엄격히 준수하며, 복잡한 쿼리와 트랜잭션 처리에 강점
확장성: 사용자 정의 함수, 데이터 타입, 인덱스 등을 지원하여 유연한 확장이 가능
ACID 완전 지원: 데이터 무결성과 일관성을 보장
단점:
학습 곡선: 다양한 기능으로 인해 초기 학습이 필요할 수 있음
설정 복잡성: 고급 기능을 활용하려면 세부적인 설정이 필요할 수 있음
장점:
유연한 스키마: 구조화되지 않은 데이터나 빈번한 스키마 변경에 적합
수평 확장: 서버를 추가하여 쉽게 확장 가능, 빅데이터 처리에 유리
다양한 데이터 모델: 문서형, 키-값, 그래프, 컬럼 패밀리 등 다양한 모델 지원
단점:
일관성 모델: 대부분의 NoSQL DB는 eventual consistency를 채택하여 즉각적인 일관성이 보장되지 않을 수 있음.
제한된 표준화: SQL과 같은 표준 쿼리 언어 부재로 인해 학습이 필요할 수 있음.
ACID는 다음 네 가지 속성의 약어:
Atomicity (원자성)
트랜잭션 내의 모든 작업이 전부 성공하거나, 전혀 실행되지 않아야 함을 의미
즉, 트랜잭션 중 일부 작업만 수행되는 상황은 허용되지 않음
예를 들어, 은행 계좌 이체 시 송금과 수금이 모두 완료되어야 하며, 하나라도 실패하면 전체 트랜잭션이 취소되어야 함
Consistency (일관성)
트랜잭션이 실행되기 전과 후에 데이터베이스가 일관된 상태를 유지해야 함을 보장
즉, 데이터베이스의 모든 무결성 제약 조건이 항상 만족되어야 함
예를 들어, 계좌 잔액이 음수가 되지 않도록 하는 제약 조건이 있다면, 트랜잭션 실행 후에도 이 조건이 유지되어야 함
Isolation (격리성)
동시에 실행되는 트랜잭션들이 서로의 작업에 영향을 미치지 않도록 보장
즉, 각 트랜잭션은 독립적으로 실행되어야 하며, 다른 트랜잭션의 중간 상태를 볼 수 없어야 함
이를 통해 동시성 문제를 방지할 수 있음
Durability (지속성)
트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 데이터베이스에 저장되어야 하며, 시스템 장애가 발생하더라도 손실되지 않아야 함
예를 들어, 전원 장애 후에도 이전에 완료된 트랜잭션의 결과는 데이터베이스에 남아 있어야 함
ACID 속성은 데이터베이스의 신뢰성과 일관성을 유지하는 데 필수적
특히 금융, 의료, 전자상거래 등 정확한 데이터 처리가 중요한 분야에서 ACID는 다음과 같은 이유로 중요함:
데이터 무결성 보장: 트랜잭션이 부분적으로만 실행되는 것을 방지하여 데이터의 일관성을 유지
동시성 제어: 여러 사용자가 동시에 데이터에 접근하더라도 충돌이나 데이터 손상이 발생하지 않도록 함
장애 복구: 시스템 장애 발생 시에도 트랜잭션의 결과를 보존하여 데이터 손실을 방지
사용자 A가 사용자 B에게 100,000원을 이체하는 트랜잭션을 고려
Atomicity: A의 계좌에서 100,000원을 인출하고 B의 계좌에 입금하는 두 작업이 모두 성공해야 합니다. 하나라도 실패하면 전체 트랜잭션이 취소되어야 합니다.
Consistency: 이체 전후에 두 계좌의 총 합계는 변하지 않아야 하며, 계좌 잔액이 음수가 되는 등의 무결성 제약 조건이 유지되어야 합니다.
Isolation: 다른 사용자가 동시에 A 또는 B의 계좌에 접근하더라도 이 트랜잭션의 중간 상태를 볼 수 없어야 하며, 트랜잭션 완료 후에만 변경된 데이터를 볼 수 있어야 합니다.
Durability: 이체가 완료된 후 시스템에 장애가 발생하더라도 이체 결과는 데이터베이스에 영구적으로 저장되어야 합니다.
| 특성 | MySQL | PostgreSQL | NoSQL |
|---|---|---|---|
| 데이터 모델 | 관계형 | 관계형 | 비관계형 |
| 스키마 | 고정 | 고정 | 유연 |
| 확장성 | 수직 확장 | 수직 확장 | 수평 확장 |
| ACID 지원 | 부분 지원 (엔진에 따라 다름) | 완전 지원 | 제한적 지원 |
| 복잡한 쿼리 | 제한적 | 강력한 지원 | 제한적 또는 미지원 |
| 사용 사례 | 웹 애플리케이션, CMS 등 | 금융, 분석, 복잡한 시스템 등 | 빅데이터, 실시간 분석, IoT 등 |
MySQL을 선택해야 할 때:
빠른 개발과 배포가 필요한 웹 애플리케이션
복잡한 쿼리나 고급 기능이 필요하지 않은 경우
PostgreSQL을 선택해야 할 때:
데이터 무결성과 복잡한 트랜잭션이 중요한 시스템
사용자 정의 기능이나 고급 쿼리 처리가 필요한 경우
NoSQL을 선택해야 할 때:
구조화되지 않은 데이터나 빈번한 스키마 변경이 예상되는 경우
대규모 데이터 처리와 수평 확장이 필요한 시스템
각 데이터베이스는 고유한 강점과 약점을 가지고 있으며, 프로젝트의 요구사항에 따라 적합한 선택이 달라진다. 예를 들어, 빠른 개발과 배포가 중요한 웹 애플리케이션에는 MySQL이, 복잡한 트랜잭션과 데이터 무결성이 중요한 시스템에는 PostgreSQL이, 대규모 데이터 처리와 유연한 스키마가 필요한 경우에는 NoSQL이 적합할 수 있다.
프로젝트의 특성과 요구사항을 면밀히 분석하여 가장 적합한 데이터베이스를 선택하여야 한다.