#100DaysOfCode 31일차 — SQL + NoSQL 기본
I’m unable to access external websites, so I can’t retrieve the article from the link you provided. If you paste the text you’d like translated here, I’ll be happy to translate it into Korean while preserving the formatting and code blocks.
구조화된 방식 (테이블 및 행)
이는 관계형 데이터베이스라고 불리는 방식이며, 데이터를 테이블로 구성합니다. 여기서:
- Table → 하나의 엔터티를 나타냅니다 (예: Users, Orders)
- Row → 해당 테이블의 한 레코드/항목 (예: 한 명의 사용자)
- Column → 속성/필드 (예: name, email, age)
- Cell → 행과 열이 교차하는 실제 값
스프레드시트와 정확히 같은 형태입니다:
| id | name | |
|---|---|---|
| 1 | John | john@gmail.com |
| 2 | Saad | saad@gmail.com |
🔑 핵심 개념
- Schema – 모든 테이블의 전체 구조/청사진
- Primary Key – 각 행을 고유하게 식별하는 키
- Foreign Key – 한 테이블을 다른 테이블에 연결하는 열
- Relationship – 테이블 간 연결 방식
🟦 SQL 기본 구문
Create a table
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
age INT
);
Insert rows
INSERT INTO users (name, email, age)
VALUES ('Alice', 'alice@email.com', 28);
Read data
SELECT name, email
FROM users
WHERE age > 25
ORDER BY name ASC
LIMIT 10;
Update a row
UPDATE users
SET age = 29
WHERE email = 'alice@email.com';
Delete a row
DELETE FROM users
WHERE age `, `<`, `IN`, `LIKE`.*
Update a document
db.users.updateOne(
{ email: "alice@email.com" },
{ $set: { age: 29 } }
);
Delete documents
db.users.deleteMany({ age: { $lt: 18 } });
Join collections (aggregation with $lookup)
db.orders.aggregate([
{
$lookup: {
from: "users",
localField: "user_id",
foreignField: "_id",
as: "user"
}
},
{ $unwind: "$user" }
]);
Aggregation pipeline example
db.users.aggregate([
{ $match: { age: { $gt: 20 } } },
{ $group: { _id: "$age", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
]);
🔵 NoSQL / 문서 데이터베이스 사용 사례
문서 데이터베이스와 NoSQL은 데이터가 유동적이고, 규모가 크며, 속도가 중요하거나 각 레코드의 구조가 실제로 다양할 때 뛰어납니다. 전형적인 실제 시나리오에는 다음이 포함됩니다:
- 콘텐츠 관리 및 블로그 플랫폼
- 소셜 미디어 피드 및 사용자 프로필
- 실시간 채팅 및 메신저
- 제품 카탈로그
- 모바일 및 게임 앱
- 사용자 활동 및 행동 분석
- IoT 및 센서 데이터
- 추천 엔진
- 물류 및 배송 추적
- 빠른 프로토타이핑 및 스타트업
🔵 SQL vs 🟠 NoSQL: 언제 사용해야 할까?
| 시나리오 | SQL이 유리한 이유 |
|---|---|
| 구조화된 관계형 데이터 | 명확한 관계를 가진 테이블 (사용자 → 주문 → 제품) |
| 데이터 무결성이 중요한 경우 | ACID 트랜잭션, 외래 키, 제약 조건 |
| 복잡한 쿼리 | JOIN, 집계, 보고, 분석 |
| 스키마가 안정적인 경우 | 데이터 형태가 자주 변하지 않음 |
| 시나리오 | NoSQL이 유리한 이유 |
|---|---|
| 매우 가변적이거나 진화하는 스키마 | 스키마가 없는 컬렉션으로 문서마다 필드가 다를 수 있음 |
| 대규모 수평 확장 | 샤딩 및 분산 아키텍처가 기본 제공 |
| 단순 쿼리의 빠른 읽기/쓰기 | 정규화되지 않은 데이터가 비용이 많이 드는 JOIN을 없앰 |
| 비정형 또는 반정형 데이터 | JSON과 같은 문서가 현대 데이터 포맷에 자연스럽게 매핑 |
두 패러다임 모두 장점이 있으며, 올바른 선택은 애플리케이션의 구체적인 요구 사항에 따라 달라집니다.
재무/거래 시스템
은행, ERP, 전자상거래 백엔드
NoSQL을 언제 사용해야 할까
| 시나리오 | NoSQL이 승리하는 이유 |
|---|---|
| 유연하고 진화하는 스키마 | 레코드마다 필드가 다르고 스키마가 자주 변경됩니다 |
| 대규모 확장 및 속도 | 다수의 서버에 걸친 수평 확장 |
| 비정형/반정형 데이터 | JSON 문서, 로그, 센서 데이터 |
| 높은 쓰기 처리량 | 초당 수백만 이벤트 (Cassandra, DynamoDB) |
| 계층형 또는 그래프 데이터 | 중첩 문서 (MongoDB), 관계 (Neo4j) |
| 캐싱 | Redis와 같은 키‑값 저장소 |
🧭 빠른 결정 가이드
Is the data relational with a stable schema? → SQL
Need ACID compliance (finance, healthcare)? → SQL
Unknown/flexible data structure? → NoSQL (Document)
Massive scale, simple lookups? → NoSQL (Key‑Value)
Graph relationships (social networks)? → NoSQL (Graph)
Time‑series or IoT data? → NoSQL (Wide‑Column)
✅ Conclusion
Day 31은 SQL과 NoSQL이 어떻게 다른지, 단순히 구문적인 차이뿐 아니라 철학적인 차이까지 명확히 보여주었습니다.
- SQL은 구조, 규칙, 일관성에 중점을 둡니다.
- NoSQL은 유연성, 속도, 확장성을 우선시합니다.
각각을 언제 선택해야 하는지를 이해하는 것은 백엔드 개발자에게 핵심 역량이며, 이번 비교를 통해 그 이해가 확고해졌습니다.
내일은 이 기반 위에 #100DaysOfCode 여정을 이어가겠습니다.
읽어 주셔서 감사합니다. 의견을 자유롭게 공유해주세요!