파이썬 데이터베이스 프로그래밍 완전 입문
: NoSQL Cassandra와의 연동 방법
SQL만 알고 있다면 이제는 한 발 늦은 걸지도 몰라요. 초고속 분산형 NoSQL, Cassandra와 파이썬의 만남으로 새로운 데이터 처리의 지평을 열어보세요!
안녕하세요, 여러분!
오늘은 요즘 핫하게 떠오르는 NoSQL 데이터베이스 중 하나인 Apache Cassandra와 파이썬의 연동 방법에 대해 알아보려 해요.
대용량 데이터 처리에 특화된 이 데이터베이스는 대기업에서 실무에도 널리 사용되고 있을 정도로 강력한 성능을 자랑하죠.
SQL 기반 RDBMS에 익숙했던 분들이라면 처음에는 낯설 수 있지만, 이번 글을 통해 기초부터 천천히 배워보시면 분명 재미있고 유익할 거예요.
그럼 본격적으로 시작해볼까요?
목차
1. Cassandra란 무엇인가요? 🧠
처음 듣는 분들도 계실 거예요. Apache Cassandra는 대규모 데이터를 분산하여 저장하고 처리하는 데 최적화된 NoSQL 데이터베이스입니다.
Facebook에서 시작되어 Apache 프로젝트로 발전했죠.
특히 읽기/쓰기 성능이 뛰어나고, 장애가 발생해도 안정적으로 동작하는 특성 덕분에 많은 대형 서비스에서 사용되고 있어요.
🧩 Cassandra의 핵심 특징
- 분산형 구조: 모든 노드가 동등하게 작동하며, 특정 노드에 장애가 생겨도 데이터 손실 없이 운영 가능
- 높은 쓰기 성능: 대량의 데이터를 빠르게 저장할 수 있어 로그 저장, IoT 등에도 적합
- 무중단 확장: 데이터를 중단 없이 다른 서버로 확장 가능
📊 어떤 환경에서 Cassandra를 사용할까요?
대표적으로 실시간 분석, 추천 시스템, 이벤트 로그 저장, IoT 센서 데이터 저장 등에 자주 사용돼요.
Twitter, Netflix, Reddit, Spotify 같은 기업들도 Cassandra를 사용하고 있고요.
즉, 대용량의 데이터를 안정적이면서 빠르게 처리할 수 있어야 하는 서비스에 탁월하다는 이야기죠.
📝 관계형 데이터베이스와의 간단 비교
항목 | 관계형 DB | Cassandra |
---|---|---|
데이터 구조 | 고정된 스키마 | 유연한 스키마 (컬럼 가변) |
확장성 | 수직 확장 (성능 한계 존재) | 수평 확장 (노드 추가만으로 성능 증가) |
장애 허용 | Master-Replica 구조 | 모든 노드가 Master 역할 수행 |
정리하자면,
Cassandra는 대규모 데이터를 빠르게 처리하고 안정적으로 저장할 수 있는 NoSQL DB로, 데이터 중심의 현대 서비스에서 점점 더 많은 관심을 받고 있어요.
만약 여러분이 지금 수많은 데이터를 다뤄야 한다면?
한번쯤 진지하게 Cassandra를 고려해볼 만하죠!
2. 왜 Cassandra인가요? 다른 NoSQL과의 비교 🔍
NoSQL이라는 단어, 이제는 제법 익숙해졌죠?
MongoDB, Redis, Couchbase, DynamoDB 등 다양한 NoSQL 데이터베이스가 있지만,
그중에서 왜 Cassandra를 선택해야 할까요?
그 이유를 데이터베이스의 성격과 특성으로 나눠 살펴볼게요.
⚔️ NoSQL 대표 주자들과 비교해보기
항목 | MongoDB | Redis | Cassandra |
---|---|---|---|
데이터 구조 | JSON 기반의 문서형 | Key-Value 형식 | Wide-Column (열 기반) |
속도/성능 | 읽기 속도 우수 | 극단적 속도 (in-memory) | 쓰기 성능 탁월 |
확장성 | 수평/수직 모두 가능 | 수직 확장 중심 | 완전한 수평 확장 |
가용성 | Replica 기반 | 단일 노드 의존 | 모든 노드가 마스터 |
📍 Cassandra를 선택해야 할 상황은?
- 전 세계 유저에게 빠르게 데이터를 제공해야 할 때 (지리적으로 분산된 서비스)
- 계속해서 노드를 추가해야 할 때 (트래픽 증가, 서비스 확장 등)
- 데이터 손실 없이 무중단 서비스를 원할 때 (고가용성 요구 상황)
결국 Cassandra는 확장성, 안정성, 대량 쓰기 성능이 필요한 서비스를 만들고자 할 때 최고의 선택이 될 수 있어요.
물론 MongoDB나 Redis가 더 잘 맞는 상황도 있겠지만, 트래픽이 빠르게 늘어나는 환경에서는 Cassandra의 가치가 빛을 발하죠.
💡 참고로 Cassandra는 AWS에서도 "Keyspaces"라는 이름으로 매니지드 서비스 형태로 제공되고 있으니,
클라우드 기반 운영도 고려해볼 수 있어요.
3. Cassandra 개발환경과 파이썬 연동 준비하기 ⚙️
이번에는 본격적으로 개발 준비를 시작해볼게요.
Cassandra는 기본적으로 자바 기반의 서버로 동작하기 때문에,
Java와 Cassandra 설치, 그리고 파이썬에서 사용할 수 있는 드라이버를 함께 설치해야 해요.
🖥️ 1단계: Cassandra 설치하기 (로컬 or Docker)
- 공식 홈페이지 설치: https://cassandra.apache.org 에서 최신 버전을 다운로드 후 설치 가능
- Docker 이용: 아래 명령어로 빠르게 실행 가능
docker run --name cassandra -p 9042:9042 -d cassandra:latest
🐍 2단계: 파이썬 드라이버 설치 (cassandra-driver)
파이썬에서 Cassandra에 접근하려면 cassandra-driver
라는 전용 드라이버를 설치해야 해요.
pip로 간단히 설치할 수 있어요.
pip install cassandra-driver
❗ 설치 중 C++ 컴파일 환경이 없어서 오류가 날 수 있으니,
윈도우라면 Visual C++ Build Tools, 리눅스라면 build-essential 설치가 필요할 수도 있어요.
🔗 3단계: Cassandra 접속 테스트
설치가 끝났다면, 아래 코드를 통해 파이썬에서 Cassandra 서버가 정상적으로 연결되는지 테스트해보세요!
from cassandra.cluster import Cluster
cluster = Cluster(['127.0.0.1']) # 로컬 호스트 기준
session = cluster.connect()
print("Cassandra 연결 성공!")
이 메시지가 정상적으로 출력된다면 성공!
이제 Cassandra와 파이썬이 연결된 거예요.
다음 단계에서는 실제로 데이터를 저장하고 조회하는 CRUD 실습을 해볼 거예요. 👨💻
4. 파이썬으로 Cassandra 기본 연산(CRUD)하기 🛠️
이제 본격적으로 Cassandra에 데이터를 넣고, 수정하고, 조회하고, 삭제해보는 CRUD 실습을 해볼 시간입니다!
관계형 데이터베이스와 비슷한 듯하면서도 살짝 다른 Cassandra의 데이터 조작 방법을 익혀봅시다.
아래 예제들은 cassandra-driver
를 통해 실행됩니다.
🔧 1. Keyspace와 테이블 생성
from cassandra.cluster import Cluster
cluster = Cluster(['127.0.0.1'])
session = cluster.connect()
# Keyspace 생성 (DB 역할)
session.execute("""
CREATE KEYSPACE IF NOT EXISTS test_keyspace
WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}
""")
# Keyspace 선택
session.set_keyspace('test_keyspace')
# 테이블 생성
session.execute("""
CREATE TABLE IF NOT EXISTS users (
id UUID PRIMARY KEY,
name text,
age int
)
""")
Cassandra는 Keyspace를 데이터베이스처럼 사용하고, 내부에 테이블을 정의합니다.
UUID는 고유 식별자로 자주 쓰이는 자료형이에요.
➕ 2. 데이터 삽입 (INSERT)
import uuid
session.execute("""
INSERT INTO users (id, name, age) VALUES (%s, %s, %s)
""", (uuid.uuid4(), '홍길동', 29))
이렇게 간단하게 데이터를 넣을 수 있어요.
UUID는 uuid.uuid4()
로 자동 생성할 수 있고, 문자열이나 숫자는 그대로 입력하면 됩니다.
🔍 3. 데이터 조회 (SELECT)
rows = session.execute('SELECT * FROM users')
for row in rows:
print(row.id, row.name, row.age)
결과는 Row
객체로 반환되고, 반복문으로 출력할 수 있어요.
SQL처럼 SELECT * FROM
구문이 익숙하죠?
✏️ 4. 데이터 수정 (UPDATE)
# 예시용 id (실제로는 SELECT로 먼저 확인 필요)
user_id = uuid.UUID("e4c94406-48a1-4a2a-a423-5149a1e16899")
session.execute("""
UPDATE users SET age = %s WHERE id = %s
""", (30, user_id))
Cassandra는 WHERE 조건에서 Primary Key만 필터링 가능하다는 점, 꼭 기억하세요!
복잡한 조건은 허용되지 않아요.
🗑️ 5. 데이터 삭제 (DELETE)
session.execute("""
DELETE FROM users WHERE id = %s
""", (user_id,))
삭제도 마찬가지로 Primary Key를 기준으로 수행해야 해요.
정해진 조건 없이 DELETE
를 사용하는 것은 Cassandra에서 제한적입니다.
📌 정리: Cassandra CRUD 한눈에 보기
작업 | SQL 문법 | Cassandra 문법 |
---|---|---|
삽입 | INSERT INTO ... | 동일 |
조회 | SELECT * FROM ... | 동일 (단, 조건 제한) |
수정 | UPDATE ... WHERE ... | Primary Key만 WHERE에 사용 가능 |
삭제 | DELETE FROM ... | Primary Key 기반만 가능 |
이제 여러분도 Cassandra에서 데이터를 다룰 수 있는 실력을 갖추게 되었어요!
다음 단계에서는 SQL과 CQL의 차이를 좀 더 깊이 비교해볼게요.
5. CQL과 SQL의 차이점과 실습 예제 비교 💡
처음 Cassandra를 접하면 "SQL이랑 거의 똑같네?" 싶은데요.
맞아요.
실제로 Cassandra는 CQL(Cassandra Query Language)이라는 SQL과 유사한 문법을 사용합니다.
하지만! 자세히 들여다보면 결정적인 차이점들이 존재합니다.
특히 관계형 DB에 익숙한 분들에게는 이 차이점이 실무에서 꽤 중요하게 작용하죠.
⚙️ SQL vs CQL 차이점 정리표
항목 | SQL (RDBMS) | CQL (Cassandra) |
---|---|---|
JOIN | 자유롭게 사용 가능 | 지원하지 않음 (데이터 중복 허용) |
GROUP BY / HAVING | 지원 | GROUP BY는 일부만 지원, HAVING은 지원 안됨 |
스키마 변경 | 제약조건 및 외래키 포함 관리 | 제약조건 없음, 유연한 컬럼 추가 가능 |
트랜잭션 | ACID 보장 | 최소한의 트랜잭션 보장 (Eventually Consistent) |
쿼리 최적화 | 서버가 최적화 | 개발자가 쿼리 설계를 직접 최적화 |
🧪 실습 예제로 비교해 보기
1️⃣ SQL에서 자주 쓰는 JOIN 쿼리
SELECT u.name, o.order_date
FROM users u
JOIN orders o ON u.id = o.user_id;
Cassandra에서는 이런 JOIN 쿼리는 불가능합니다.
그래서 데이터를 중복해서 저장하는 방식으로 해결해야 합니다.
이를 Denormalization(비정규화)라고 하죠.
2️⃣ Cassandra에서는 이렇게!
CREATE TABLE IF NOT EXISTS user_orders (
user_id UUID,
name text,
order_id UUID,
order_date timestamp,
PRIMARY KEY (user_id, order_id)
);
JOIN 대신, 사용자 + 주문 정보를 하나의 테이블에 중복해서 저장해버리는 방식이에요.
이 덕분에 조회 성능은 훨씬 빨라지지만 유지보수에 유의해야 해요.
💡 핵심 요약
- CQL은 SQL 문법과 매우 유사하지만 기능적인 제약이 있다.
- Cassandra는 JOIN 없이도 성능을 유지하기 위해 구조 자체를 다르게 설계한다.
- 확장성과 성능을 위해 데이터 중복을 감수하는 설계가 기본이다.
Cassandra는 전통적인 RDBMS와 완전히 다르게 접근해야 해요.
하지만 원리를 이해하고 나면, 오히려 대용량 시스템에 더 적합하다는 사실에 감탄하게 될 거예요.
6. 꼭 필요한 예제로 Cassandra 마스터하기 💪
지금까지 Cassandra의 개념과 파이썬 연동, CRUD, CQL 차이점까지 살펴봤죠.
이번에는 실제 서비스에 응용할 수 있는 실전 예제를 통해 정리해보겠습니다.
사용자별 주문 이력을 저장하고 조회하는 간단한 예제를 중심으로 Cassandra의 구조적 특징도 함께 익혀볼게요.
📦 사용자 주문 내역 저장 테이블 설계
CREATE TABLE IF NOT EXISTS user_orders (
user_id UUID,
order_id UUID,
order_date timestamp,
product_name text,
quantity int,
PRIMARY KEY (user_id, order_id)
);
이 테이블은 user_id 기준으로 파티셔닝되며, 한 사용자의 주문들이 order_id 순으로 정렬돼 저장돼요.
이렇게 하면 조회 성능이 매우 빠릅니다.
🛒 주문 추가 예제
from datetime import datetime
import uuid
user_id = uuid.uuid4()
order_id = uuid.uuid4()
session.execute("""
INSERT INTO user_orders (user_id, order_id, order_date, product_name, quantity)
VALUES (%s, %s, %s, %s, %s)
""", (user_id, order_id, datetime.utcnow(), '무선 이어폰', 2))
간단하죠? 필요한 데이터만 넣으면 끝입니다.
시간 저장 시 UTC 기준을 사용하는 게 좋습니다.
📋 주문 내역 조회 예제
rows = session.execute("""
SELECT order_id, order_date, product_name, quantity
FROM user_orders
WHERE user_id = %s
""", (user_id, ))
for row in rows:
print(row.order_date, row.product_name, row.quantity)
user_id만 알면 해당 사용자의 모든 주문 내역을 빠르게 불러올 수 있어요.
Cassandra는 인덱스 없는 고속 조회를 위해 이렇게 설계합니다.
✅ 실전 활용 포인트
- 파티션 키를 기준으로 테이블 설계해야 성능이 제대로 나와요.
- JOIN, 서브쿼리, 복잡한 필터링은 Cassandra 스타일에 맞지 않아요. 설계에서 단순화가 필요해요.
- 읽기 성능은 좋지만, 설계 실패 시 되돌리기 어려워요. 쿼리 우선 설계(Query-first modeling)가 기본입니다.
Cassandra는 단순한 구조와 높은 쓰기/읽기 성능이 핵심이지만, 그만큼 초기 설계의 중요성이 매우 커요.
예제 위주로 익히고, 실제 프로젝트에선 설계부터 철저히 접근하세요.
🎯 마무리하며
이번 글에서는 파이썬과 Cassandra 연동의 전 과정을 차근차근 살펴봤습니다.
기본 개념부터 CRUD, CQL 차이점, 실습 예제까지 하나하나 따라 하셨다면, 이제 Cassandra가 전혀 낯설지 않으실 거예요.
여러분의 데이터 처리 역량이 한 단계 업그레이드 되었기를 바랍니다!
'Python > Python+Database' 카테고리의 다른 글
파이썬으로 벡터 데이터베이스 Weaviate 연동하기: 인공지능 시대의 데이터 검색 비법 (1) | 2025.04.14 |
---|---|
파이썬 데이터베이스 프로그래밍 완전 입문: 벡터 데이터베이스 Milvus 연동 방법 (0) | 2025.04.14 |
파이썬 데이터베이스 프로그래밍 완전 입문: Redis와의 연동 방법 (1) | 2025.04.12 |
파이썬 데이터베이스 프로그래밍 완전 입문: NoSQL MongoDB와 PyMongo 연동하기 (0) | 2025.04.12 |
파이썬 데이터베이스 프로그래밍 완전 입문: PostgreSQL과 psycopg2 연동하기 (0) | 2025.04.12 |