#개발 #기술블로그 #동아리 #ACC #AWS #RDS #DynamoDB #데이터베이스 #인프라 #백엔드
![[핸즈온_3회차.pdf]]
# 데이터베이스란?
- `정의` 구조화된 정보 또는 데이터의 조직화된 모음
- **DBMS(Database Management System)** 에 의해 제어됨
## 종류
- `관계형 데이터베이스 (Relational DB)`
- 구조화된 데이터를 저장
- 테이블(행 & 열) 형태
- 엄격한 스키마
- SQL을 사용해 데이터 조작
- *e.g., MySQL, PostgreSQL*
- `비관계형 데이터베이스 (Non-Relational DB)`
- 비정형 데이터를 저장
- 스키마 없음
- 대량의 분산 데이터 저장에 최적화
- 다양한 형태의 데이터를 빠르게 처리
- *e.g., MongoDB, Redis*
---
# Amazon RDS

[✅ AWS RDS 공식 문서](https://aws.amazon.com/ko/rds/))
- `정의` AWS 클라우드에서 관계형 데이터베이스를 더 쉽게 설치, 운영 및 확장할 수 있는 완전관리형 웹 서비스
- `배포 방식 비교`
- `On-Premise` 사용자가 직접 서버를 구축해 DB 관리
- `AWS EC2` EC2 인스턴스 위에 사용자가 직접 DB를 설치하고 관리
- `AWS RDS` AWS의 완전관리형 DB 서비스 ✅
## RDS의 장점
- `간편한 관리` 복잡한 DB 운영을 AWS가 대신 처리
- `가용성(Availability) 및 안정성(Durability)`
- `Multi AZ 지원`
- `자동 백업 vs. 스냅샷` 데이터 보호
- `보안성(Security)` VPC, IAM, 암호화 지원
- `확장성(Scalability)` Read Replica를 통한 수평 확장
- `비용 효율성(Cost Effective)` 사용한 만큼만 지불
## Multi AZ
- `정의` 데이터베이스의 복사본을 다른 가용 영역(Availability Zone)에 자동으로 생성하고 동기화
- `동작 방식`
- 기본 인스턴스(Primary)와 대기 인스턴스(Standby)를 서로 다른 AZ에 배포
- 쓰기 트랜잭션 발생 시, Primary → EBS에 쓰고 동시에 Standby EBS에도 동기화
- 장애 감지 시 **자동으로 대기 인스턴스로 Failover**
- `목적` 고가용성(High Availability) 확보
## Read Replica
- `정의` 읽기 전용 복제본 → 읽기(Read) 쿼리의 성능 향상과 분산 처리
- `특징`
- **비동기적**으로 Primary → Read Replica 복제 진행
- Read Replica 인스턴스를 이용한 **Scale Out** → 읽기 중심의 워크로드 처리량 향상
- `Multi AZ와의 차이`
- Multi AZ: 가용성(Failover) 목적, 동기 복제
- Read Replica: 성능(읽기 분산) 목적, 비동기 복제
- `SAA Example`
- RDS를 사용하는 회사에서 하루/한 달에 한 번씩 통계용으로 데이터를 읽어오는 데 성능 문제 발생 → **Read Replica 사용**
---
## RDS 핸즈온 — RDS for PostgreSQL DB 인스턴스 생성 및 연결
### 아키텍처
```
Internet
↕
Internet Gateway
↕
[Public Subnet]
EC2 Instance (Security Group: ec2-rds-n)
↕
[Private Subnet]
PostgreSQL DB Instance (Security Group: rds-ec2-n)
```
### 실습 순서
#### 1. EC2 인스턴스 생성
1. EC2 서비스 → **인스턴스 시작** 클릭
2. OS 이미지: **Amazon Linux 2023 AMI**, 인스턴스 유형: **t2.micro** (기본값 유지)
3. 키 페어: **키 페어 없이 계속 진행** (EC2 Instance Connect 사용)
4. 네트워크 설정: SSH 트래픽 허용 → **내 IP**로 설정
5. **인스턴스 시작** 클릭
#### 2. PostgreSQL DB 인스턴스 생성
1. RDS 서비스 → **데이터베이스 생성** 클릭
2. 생성 방식: **손쉬운 생성(Easy Create)**
3. 구성
- 엔진 유형: **PostgreSQL** (Aurora 아님)
- DB 인스턴스 크기: **프리 티어**
- DB 인스턴스 식별자: 적당한 이름 입력
- 자격 증명 관리: **자체 관리**
- 암호: 자동 생성 또는 직접 입력
4. EC2 연결 설정: **EC2 컴퓨팅 리소스에 연결** → 앞서 만든 EC2 인스턴스 선택
5. **데이터베이스 생성** 클릭
- ⚠️ 암호 자동 생성 선택 시, **자격 증명 세부 정보 보기** 버튼으로 암호 즉시 복사 (이후 재확인 불가)
#### 3. DB 인스턴스 연결
1. EC2 보안 그룹 → 인바운드 규칙 추가 (EC2 Instance Connect IP 허용)
2. EC2 인스턴스 → **연결** → **EC2 Instance Connect**로 접속
3. psql 설치 및 DB 연결
```bash
# 최신 버전으로 업데이트
sudo dnf update -y
# psql 설치
sudo dnf install postgresql15
# DB 인스턴스에 연결
psql --host={endpoint} --port=5432 --dbname=postgres --username=postgres
```
- DB 인스턴스 엔드포인트: **DB 인스턴스 → 연결 및 보안 탭**에서 확인
#### 4. 리소스 삭제
- EC2 인스턴스 종료 및 DB 인스턴스 삭제
- ‼️ DB 삭제 시 **최종 스냅샷 생성**, **자동 백업 보존** 체크 **해제** 필수
---
# Amazon DynamoDB
- `정의` 모든 규모에서 **10ms 미만**의 성능을 제공하는 서버리스 NoSQL 완전관리형 데이터베이스
## SQL vs NoSQL 비교
| 구분 | SQL | NoSQL |
|---|---|---|
| 데이터 구조 | 정형 (테이블) | 비정형 |
| 스키마 | 엄격한 스키마 | 스키마 없음 |
| 확장 방식 | 수직 확장 | 수평 확장 |
| 대표 서비스 | MySQL, PostgreSQL | MongoDB, DynamoDB |
## DynamoDB 특징
- `서버리스` 인프라 관리 불필요
- `완전관리형` 장비 운영부터 DB 솔루션 설치 및 운영까지 AWS 담당
- `고성능` 대부분 **10ms 내**에 데이터 읽기/처리
- `고가용성 & 내구성`
- 모든 데이터가 **SSD**에 저장
- AWS 리전의 여러 AZ에 걸쳐 **자동 복제**
- `Auto-Scaling`
- 요청 볼륨에 따라 읽기/쓰기 용량을 자동으로 조정
## DynamoDB 핵심 구성 요소
- `테이블(Table)` 데이터를 저장하는 공간
- `항목(Item)` 테이블 내의 각 레코드 (= RDB의 행)
- *e.g., People 테이블의 각 항목 = 한 사람*
- `속성(Attribute)` 각 항목을 구성하는 데이터 요소 (= RDB의 열)
- *e.g., PersonID, LastName, FirstName*
- `특징`
- 기본 키(PK)를 제외하고 **스키마가 없음** → 속성이나 데이터 형식을 미리 정의할 필요 없음
- 각 항목마다 자체 고유 속성 보유 가능
- 중첩된 속성(예: Address) 지원
## Primary Key 구조
### Partition Key (PK)
- RDBMS의 Primary Key와 동일한 역할
- 테이블에 무조건 하나만 존재해야 하는 유일한 값
- **파티션을 결정**하는 Hash 값으로 사용됨
- DynamoDB는 테이블 크기가 10GB를 초과하면 파티션을 나눔
- 같은 Partition Key를 가진 항목 → 같은 파티션에 저장
- **일치 검색(Equal)만 지원**
### Sort Key (SK)
- Partition Key로 파티션을 결정한 후, **같은 파티션 내에서 정렬**하는 기준
- 일치, 부등호, 포함 등 **범위 검색 지원** (begins_with, between, >, < 등)
- Partition Key + Sort Key 조합 → 복합 기본 키(Composite Primary Key) 구성
### DynamoDB Table 구조 예시
```
Partition Key (PK) | Sort Key (SK) | Attributes
-------------------|----------------------------|-----------------------------
UserID | Address#USA#CA#LA#90029 | data: "Street Address"
UserID | Cart#ACTIVE#Coffee | CoffeeSKU, GSI-SK: ...
UserID | Cart#SAVED#Cocoa | CocoaSKU, GSI-SK: ...
UserID | OrderHistory#OrderUID | {Order:DataMap}
UserID | ProfileName | "Paul Atreides"
UserID | Store#StoreUID | Los Angeles, Active
```
---
## DynamoDB 핸즈온 — NoSQL 테이블 만들기
### 실습 순서
#### 1. DynamoDB 테이블 생성
1. AWS 콘솔 → **DynamoDB** 검색
2. **테이블 생성** 클릭
3. 테이블 구성
- 테이블 이름: `Music`
- 파티션 키: `Artist` (문자열)
- 정렬 키: `songTitle` (문자열)
4. 테이블 설정: **설정 사용자 지정** 선택 (Auto Scaling 활성화 목적)
5. 테이블 클래스: **DynamoDB Standard** (자주 액세스하는 데이터에 적합)
6. 읽기/쓰기 용량 설정
- 용량 모드: **프로비저닝**
- Auto Scaling: **켜기**
- 최소 용량 단위: 1 / 최대: 10 / 목표 사용률: 70%
#### 2. 테이블에 데이터 추가
1. **항목 탐색** 메뉴 → Music 테이블 선택
2. **항목 생성** 클릭
3. 속성 입력
- `Artist`: NewJeans / `songTitle`: Attention
4. 여러 항목 추가 (*e.g., aespa-Supernova, aespa-BlackMamba, NewJeans-ETA, NewJeans-HypeBoy*)
#### 3. Query 실습
- **Partition Key만 사용**
- Artist = `aespa` → aespa의 모든 곡 반환 (Black Mamba, Supernova)
- **Partition Key + Sort Key 사용**
- Artist = `NewJeans` + songTitle 시작 문자 = `A` → Attention만 반환
#### 4. Lambda를 활용한 Batch 데이터 삽입
- DynamoDB에서는 **Batch 쓰기** 지원
- `BatchWriteItem API` 한 번에 최대 **25개 항목** 삽입 가능
- Lambda + `batch.put_item`으로 대량 데이터 삽입 자동화
- `CloudWatch Events`로 특정 시간 또는 주기적으로 Lambda 함수 트리거 가능
- DynamoDB는 NoSQL 특성상 **JOIN 미지원** → Join이 필요한 경우 Lambda로 구현
```python
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Music')
with table.batch_writer() as batch:
batch.put_item(Item={'Artist': 'NewJeans', 'songTitle': 'OMG'})
batch.put_item(Item={'Artist': 'aespa', 'songTitle': 'Whiplash'})
# ... 최대 25개까지 한 번에 처리
```
---
## RDS vs DynamoDB 비교
| 구분 | RDS | DynamoDB |
|---|---|---|
| DB 유형 | 관계형(SQL) | 비관계형(NoSQL) |
| 스키마 | 고정 스키마 | 유연한 스키마 |
| 조인 | 지원 | 미지원 |
| 확장 방식 | Read Replica (수평), 인스턴스 크기 변경 (수직) | Auto Scaling (수평) |
| 가용성 | Multi AZ | 다중 AZ 자동 복제 |
| 관리 수준 | 완전관리형 (일부 설정 필요) | 완전관리형 (서버리스) |
| 적합한 데이터 | 정형 데이터, 복잡한 쿼리 | 대용량 비정형 데이터, 단순 고속 조회 |
| 대표 사용 사례 | 금융, ERP, 전통적 웹 서비스 | 게임, SNS, IoT, 실시간 서비스 |