← Week 9 목차 다음: Week 11 →

Week 10: 시스템 요구사항 구조화 3 - 저장소 통합설계 및 질의 🗄️


📌 학습 목표


🔍 RDBMS vs NoSQL 비교

RDBMS (Relational Database Management System) 📊

특징

장점 ✨

단점 ⚠️

NoSQL (Not Only SQL) 🌐

특징

장점 ✨


🗃️ NoSQL 데이터베이스 유형

1. Key-Value Store 🗝️

특징

대표 제품

사용 사례

사용자 세션 관리
쇼핑카트 정보
실시간 추천 시스템

2. Document Database 📄

특징

대표 제품

사용 사례

{
  "고객ID": "C001",
  "이름": "김철수",
  "주소": {
    "시": "서울",
    "구": "강남구"
  },
  "주문이력": [
    {"상품": "노트북", "날짜": "2024-03-15"},
    {"상품": "마우스", "날짜": "2024-03-20"}
  ]
}

3. Column-Family 📊

특징

대표 제품

사용 사례

시계열 데이터 (IoT 센서)
로그 데이터 분석
실시간 분석 대시보드

4. Graph Database 🕸️

특징

대표 제품

사용 사례

소셜 네트워크 분석
추천 시스템
사기 탐지
지식 그래프

⚖️ 데이터 저장소 선택 기준

CAP 정리 🔺

Consistency (일관성) 🎯

Availability (가용성) 🔄

Partition Tolerance (분단 내성) 🌐

CAP 선택 전략

CP (Consistency + Partition tolerance): MongoDB, Redis
AP (Availability + Partition tolerance): Cassandra, DynamoDB
CA (Consistency + Availability): MySQL, PostgreSQL (단일 노드)

ACID vs BASE 🧪

ACID (RDBMS)

BASE (NoSQL)

선택 기준 매트릭스 📋

요구사항 RDBMS NoSQL
트랜잭션 보장 ❌/△
복잡한 쿼리
확장성
스키마 유연성
개발 속도
데이터 일관성

🔄 ETL (Extract, Transform, Load) 프로세스

ETL 개념 및 필요성

정의 📖

다양한 소스에서 데이터를 추출(Extract), 변환(Transform), 적재(Load)하는 프로세스

필요성 🎯

ETL 단계별 상세

1. Extract (추출) 📥

데이터 소스
├─ 관계형 DB (MySQL, PostgreSQL)
├─ NoSQL DB (MongoDB, Redis)  
├─ 파일 (CSV, JSON, XML)
├─ API (REST, GraphQL)
└─ 스트리밍 (Kafka, Kinesis)

2. Transform (변환) 🔄

변환 작업
├─ 데이터 정제 (Null 처리, 중복 제거)
├─ 데이터 타입 변환 (문자 → 숫자)
├─ 데이터 표준화 (날짜 형식 통일)
├─ 계산 필드 추가 (총액 = 단가 × 수량)
├─ 데이터 검증 (범위, 형식 검사)
└─ 데이터 집계 (일별, 월별 합계)

3. Load (적재) 📤

적재 방식
├─ Full Load (전체 적재)
├─ Incremental Load (증분 적재)
├─ Delta Load (변경분 적재)
└─ Upsert (삽입/업데이트)

현대적 ETL 도구 🛠️

클라우드 기반

오픈소스


🏗️ 데이터 통합 아키텍처

전통적 아키텍처 📊

Data Warehouse

운영 시스템 → ETL → 데이터웨어하우스 → OLAP → 리포팅

특징

현대적 아키텍처 🚀

Data Lake

다양한 소스 → 원시 데이터 → 데이터 레이크 → 분석 도구

특징

Lambda Architecture

실시간 스트림 → 스트림 처리 → 서빙 레이어
배치 데이터 → 배치 처리 → 배치 뷰

💾 SQL 기초

DDL (Data Definition Language) 🏗️

CREATE - 테이블 생성

CREATE TABLE 고객 (
    고객ID VARCHAR(10) PRIMARY KEY,
    고객명 VARCHAR(50) NOT NULL,
    연락처 VARCHAR(15),
    가입일 DATE DEFAULT CURRENT_DATE
);

ALTER - 테이블 수정

-- 컬럼 추가
ALTER TABLE 고객 ADD COLUMN 이메일 VARCHAR(100);

-- 컬럼 수정  
ALTER TABLE 고객 MODIFY COLUMN 연락처 VARCHAR(20);

-- 컬럼 삭제
ALTER TABLE 고객 DROP COLUMN 이메일;

DROP - 테이블 삭제

DROP TABLE 고객;

DML (Data Manipulation Language) 📝

SELECT - 데이터 조회

-- 기본 조회
SELECT 고객명, 연락처 FROM 고객;

-- 조건부 조회
SELECT * FROM 고객 WHERE 가입일 >= '2024-01-01';

-- 정렬
SELECT * FROM 고객 ORDER BY 고객명 ASC;

-- 집계
SELECT COUNT(*), AVG(주문금액) 
FROM 주문 
WHERE 주문일자 >= '2024-01-01';

INSERT - 데이터 삽입

INSERT INTO 고객 (고객ID, 고객명, 연락처) 
VALUES ('C001', '김철수', '010-1234-5678');

UPDATE - 데이터 수정

UPDATE 고객 
SET 연락처 = '010-9876-5432' 
WHERE 고객ID = 'C001';

DELETE - 데이터 삭제

DELETE FROM 고객 WHERE 고객ID = 'C001';

DCL (Data Control Language) 🔐

GRANT - 권한 부여

GRANT SELECT, INSERT ON 고객 TO '사용자1';

REVOKE - 권한 회수

REVOKE INSERT ON 고객 FROM '사용자1';

TCL (Transaction Control Language) 🔄

COMMIT - 트랜잭션 확정

BEGIN TRANSACTION;
UPDATE 계좌 SET 잔고 = 잔고 - 10000 WHERE 계좌번호 = 'A001';
UPDATE 계좌 SET 잔고 = 잔고 + 10000 WHERE 계좌번호 = 'A002';
COMMIT;

ROLLBACK - 트랜잭션 취소

BEGIN TRANSACTION;
DELETE FROM 고객 WHERE 고객ID = 'C001';
ROLLBACK; -- 삭제 취소

🛠️ SQL 실습 예제

온라인 쇼핑몰 데이터베이스

테이블 생성

-- 고객 테이블
CREATE TABLE Customer (
    CustomerID VARCHAR(10) PRIMARY KEY,
    CustomerName VARCHAR(50) NOT NULL,
    Email VARCHAR(100),
    Phone VARCHAR(15),
    JoinDate DATE
);

-- 상품 테이블  
CREATE TABLE Product (
    ProductID VARCHAR(10) PRIMARY KEY,
    ProductName VARCHAR(100) NOT NULL,
    Price DECIMAL(10,2),
    Category VARCHAR(50)
);

-- 주문 테이블
CREATE TABLE OrderHeader (
    OrderID VARCHAR(10) PRIMARY KEY,
    CustomerID VARCHAR(10),
    OrderDate DATE,
    TotalAmount DECIMAL(10,2),
    FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID)
);

복합 쿼리 예제

-- 월별 매출 현황
SELECT 
    DATE_FORMAT(OrderDate, '%Y-%m') AS ,
    COUNT(*) AS 주문건수,
    SUM(TotalAmount) AS 총매출,
    AVG(TotalAmount) AS 평균주문금액
FROM OrderHeader 
WHERE OrderDate >= '2024-01-01'
GROUP BY DATE_FORMAT(OrderDate, '%Y-%m')
ORDER BY ;

-- 고객별 구매이력 및 등급
SELECT 
    c.CustomerName,
    COUNT(o.OrderID) AS 주문횟수,
    SUM(o.TotalAmount) AS 총구매금액,
    CASE 
        WHEN SUM(o.TotalAmount) >= 1000000 THEN 'VIP'
        WHEN SUM(o.TotalAmount) >= 500000 THEN 'GOLD'
        ELSE 'SILVER'
    END AS 고객등급
FROM Customer c
LEFT JOIN OrderHeader o ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID, c.CustomerName
ORDER BY 총구매금액 DESC;

📚 참고 자료


**© 2024-2025 한국공학대학교 경영학부 All Rights Reserved**