#개발 #기술블로그 #동아리 #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 ![](https://blog.kakaocdn.net/dna/bC0KH2/btsdGABMEPL/AAAAAAAAAAAAAAAAAAAAAIGrVdsKnuMz6DyZxkowJKfUNoktrpUG6Os6XXlHbLiv/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1777561199&allow_ip=&allow_referer=&signature=ar54L3bgJfVIPwS1HR6vy1NOkO4%3D) [✅ 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, 실시간 서비스 |