Cloud & Platform
13강. DynamoDB
13강. DynamoDB 학습 내용을 정리한 백필 노트입니다.
이 글은 2025년 학습 기록을 블로그 형식으로 정리한 백필 노트입니다.
1. NoSQL
NoSQL 데이터베이스 특징
NoSQL은 "Non SQL" 또는 "Non relational" 데이터베이스를 의미하며, 다음과 같은 특징을 가집니다.
- 관계형 데이터베이스의 데이터 일관성 제약을 일부 완화합니다.
- 수평적으로 확장이 가능합니다.
- 개발이 용이합니다.
- 짧은 지연 시간과 복원력을 가집니다.
- 스키마가 없는 데이터 모델에 최적화되어 있습니다.
- 간단한 데이터 구조를 가집니다.
- 다양한 데이터 모델을 사용합니다 (열 기반, 문서 기반, 그래프, 인 메모리 키-값 스토어).
- 빅데이터, 모바일 및 웹 애플리케이션에 매우 적합합니다.
RDBMS와 NoSQL 데이터베이스 비교
| 구분 | 관계형 데이터베이스 (RDBMS) | NoSQL 데이터베이스 | | --- | --- | --- | | 데이터 모델 | 스키마 강제 적용 (행과 열로 구성된 테이블로 정규화) | 스키마를 강제 적용하지 않음 | | ACID 속성 | ACID 속성(원자성, 일관성, 격리성, 내구성)을 모두 지원 | 일부 ACID 속성만 지원 | | 성능 | 디스크 하위 시스템에 따라 다름 (쿼리, 인덱스, 테이블 구조 최적화 필요) | 기본 하드웨어 클러스터 크기, 네트워크 지연 시간 등에 따라 다름 | | 확장성 | 더 빠른 하드웨어 사용 (수직 확장) | 하드웨어의 분산 클러스터 사용 (수평 확장) | | API | SQL을 준수하는 쿼리 사용 | 객체 기반 API (인 메모리 데이터 구조를 쉽게 저장 및 검색) | | 도구 | 다양한 도구 세트 제공 | 클러스터 관리 및 조정을 위한 도구 제공 |
NoSQL 데이터베이스 유형
- 열 기반 데이터베이스: 데이터의 행이 아닌 열을 읽고 쓰는 데 최적화되어 있습니다.
- 문서 데이터베이스: JSON 또는 XML 형식의 문서와 같은 반정형 데이터를 저장하도록 설계되었습니다.
- 그래프 데이터베이스: 간선(방향 링크)과 정점을 저장합니다.
- 인 메모리 키-값 스토어: 핵심 데이터를 메모리에 저장하여 액세스 지연 시간을 줄여 애플리케이션 성능을 향상시킵니다.
2. DynamoDB
DynamoDB란?
- 완전관리형 클라우드 NoSQL 데이터베이스입니다.
- 규모와 관계없이 10ms 미만의 지연 시간을 보장합니다.
- 유연한 데이터 모델을 가지며 용량 제한이 없고, 안정적인 성능을 제공합니다.
- 처리 용량을 자동으로 조정하는 기능이 있습니다.
- 사용한 용량과 읽기/쓰기 유닛에 대해 과금됩니다.
Amazon DynamoDB Accelerator (DAX)
- 가용성이 뛰어난 완전관리형 인 메모리 캐시입니다.
- 초당 수백만 개의 요청에도 DynamoDB의 응답 시간을 밀리초에서 마이크로초로 단축할 수 있습니다.
DynamoDB Read 방식
- Eventually Consistent Read (최종 일관성 읽기)
- 별도 지정이 없으면 기본으로 사용됩니다.
- 최근 완료된 쓰기 작업의 결과가 반영되지 않을 수 있어, 일부 부실 데이터가 포함될 수 있습니다.
- 잠시 후 읽기 요청을 반복하면 최신 데이터가 반환됩니다.
- Strongly Consistent Read (강력한 일관성 읽기)
- 성공한 모든 이전 쓰기 작업의 업데이트를 반영하여 가장 최신 데이터로 응답을 반환합니다.
- 네트워크 지연 또는 중단이 발생하면 사용이 어려울 수 있습니다.
DynamoDB 과금 방식
- 데이터 스토리지: 테이블에서 사용한 디스크 공간(GB)당 시간당 요금이 부과됩니다.
- 읽기 용량 유닛 (RCU): 1 RCU는 초당 최대 2건의 읽기 작업을 제공합니다.
- 쓰기 용량 유닛 (WCU): 1 WCU는 초당 최대 1건의 쓰기 작업을 제공합니다.
DynamoDB 기본 구성
- Table: Item들의 집합입니다.
- Item: Attribute들의 집합입니다.
- Attribute: Key-Value 방식의 데이터이며, Key는 문자열입니다.
3. DynamoDB 데이터 타입
스칼라 데이터 형식 (하나의 값만 표현)
- Number (N): 양수, 음수, 0을 표현하며 최대 38자리까지 지원합니다.
- String (S): UTF-8 이진 인코딩을 사용하는 유니코드 문자열입니다.
- Binary (B): 압축 텍스트, 암호화 데이터, 이미지 등 모든 이진 데이터를 저장합니다.
- Boolean (BOOL):
true또는false를 저장합니다. - Null (NULL): 알려지지 않았거나 정의되지 않은 상태를 나타냅니다.
문서 형식 (복잡한 구조 표현)
- List (L): 순서가 있는 값의 모음을 저장합니다.
- Map (M): 정렬되지 않은 이름-값 쌍의 모음을 저장합니다.
다중 값 형식 (여러 스칼라 값 표현)
- String Set (SS): 문자열 집합입니다.
- Number Set (NS): 숫자 집합입니다.
- Binary Set (BS): 이진 집합입니다.
4. DynamoDB 파티션 및 키
파티션 (Partition)
- DynamoDB가 데이터를 저장하는 공간으로, SSD(Solid State Drive)로 백업됩니다.
- 하나의 AWS 리전 내 여러 가용 영역에 데이터가 자동으로 복제됩니다.
- 파티션 관리는 전적으로 DynamoDB에서 처리하므로 직접 관리할 필요가 없습니다.
- 테이블의 처리량 설정을 늘리거나 스토리지 공간이 더 필요할 때 추가 파티션이 할당됩니다.
키 (Key)
- 기본 키 (Primary Key): 테이블 내에서 각 Item을 구분하는 고유 식별자입니다.
- 단순 기본 키: 파티션 키만 사용합니다.
- 복합 기본 키: 파티션 키와 정렬 키를 함께 사용합니다.
- 파티션 키 (Partition Key): 내부 해시 함수의 입력으로 사용되어 항목이 저장될 파티션을 결정합니다.
- 정렬 키 (Sort Key): 동일한 파티션 키를 가진 항목들을 정렬하는 데 사용되는 키 값입니다.
5. DynamoDB 보조 인덱스
보조 인덱스 종류
- 로컬 보조 인덱스 (Local Secondary Index, LSI): 테이블과 파티션 키는 동일하지만 정렬 키는 다른 인덱스입니다.
- 글로벌 보조 인덱스 (Global Secondary Index, GSI): 파티션 키 및 정렬 키가 테이블의 것과 다를 수 있는 인덱스입니다.
- 개수 제한: 테이블당 최대 20개의 GSI와 5개의 LSI를 정의할 수 있습니다.
글로벌 보조 인덱스 vs 로컬 보조 인덱스
| 특성 | 글로벌 보조 인덱스 (GSI) | 로컬 보조 인덱스 (LSI) | | --- | --- | --- | | 키 스키마 | 단순 또는 복합 기본 키 사용 가능 | 반드시 복합 기본 키여야 함 | | 파티션 키 값당 크기 제한 | 없음 | 인덱싱된 모든 항목의 전체 크기가 10GB 이하여야 함 | | 온라인 인덱스 작업 | 테이블 생성 후 추가/삭제 가능 | 테이블 생성 시에만 생성 가능, 추후 추가/삭제 불가 | | 쿼리 | 테이블의 모든 파티션에 대해 쿼리 가능 | 동일한 파티션 키를 가진 단일 파티션에 대해서만 쿼리 가능 | | 읽기 일관성 | 최종 일관성만 지원 | 최종 일관성 또는 강력한 일관성 선택 가능 | | 처리량 소비 | 자체 할당 처리량 설정이 있으며, GSI의 용량 단위를 소비 | 기본 테이블의 읽기/쓰기 용량 단위를 소비 | | 프로젝션 속성 | 인덱스로 프로젝션되는 속성만 요청 가능 | 인덱스로 프로젝션되지 않는 속성도 요청 가능 |
6. DynamoDB 데이터 조회
Query vs Scan
- Query: 키 값을 기반으로 항목을 찾는 효율적인 방법입니다. (예: 학번으로 학생을 바로 찾는 것)
- Scan: 테이블의 모든 항목을 읽어 필터링하는 방법으로, 속도가 느리고 비용이 많이 들어 가급적 사용하지 않는 것이 좋습니다. (예: 모든 학생을 한 명씩 불러 학번을 확인하는 것)
DynamoDB Query
- 기본 키 값을 기반으로 항목을 찾습니다.
- 파티션 키 속성과 값을 반드시 제공해야 합니다.
- 선택적으로 정렬 키 속성을 제공하여 검색 결과의 범위를 좁힐 수 있습니다.
DynamoDB Scan
- 테이블 또는 보조 인덱스의 모든 항목을 읽어옵니다.
- 단일 요청으로 최대 1MB까지 데이터를 가져올 수 있습니다.
ProjectionExpression파라미터를 사용해 일부 속성만 가져올 수 있고, 필터 표현식으로 결과 범위를 좁힐 수 있습니다.
7. (실습) DynamoDB 테이블 설계
시나리오
- 전교생의 시험 점수를 DynamoDB에 저장하고 관리합니다.
- 학생은 고유의 학번을 가집니다.
- 시험 과목은 영어, 과학, 수학 3과목입니다.
- 필요한 조회 기능:
- 특정 학생의 모든 과목 점수 조회하기
- 과목별 점수로 정렬하여 학생 목록 조회하기
기본 키 구성
- 파티션 키: 학생의 학번 (
id) - 정렬 키: 과목명 (
subject) - 이 구성을 통해 특정 학생(
id)의 모든 과목(subject) 점수를 효율적으로 조회할 수 있습니다.
보조 인덱스 추가
- 글로벌 보조 인덱스 (GSI)
- 파티션 키: 과목명 (
subject) - 정렬 키: 점수 (
score) - 이 GSI를 통해 특정 과목(
subject)의 점수(score) 순으로 학생 목록을 조회할 수 있습니다.
- 파티션 키: 과목명 (
- 로컬 보조 인덱스 (LSI): 이 시나리오에서는 필요하지 않습니다.
8. (실습) DynamoDB 테이블 생성
- AWS 콘솔에서 DynamoDB 서비스로 이동합니다.
- 테이블 생성을 클릭합니다.
- 테이블 이름에
StudentScore를 입력합니다. - 파티션 키에
id를 입력하고 타입을숫자로 설정합니다. - 정렬 키 추가를 선택하고, 정렬 키에
subject를 입력하고 타입을문자열로 설정합니다. - 테이블 설정에서 설정 사용자 지정을 선택합니다.
- 보조 인덱스 섹션에서 글로벌 인덱스 생성을 클릭합니다.
- 새 GSI의 파티션 키에
subject(타입: 문자열), 정렬 키에score(타입: 숫자)를 입력합니다. - 인덱스 이름을
subject-score-index로 지정하고 인덱스 생성을 클릭합니다. - 모든 설정을 확인한 후 테이블 생성 버튼을 클릭하여 생성을 완료합니다.
9. (실습) DynamoDB 데이터 입력
- 생성된
StudentScore테이블을 선택합니다. - 작업 드롭다운 메뉴에서 항목 생성을 클릭합니다.
id(숫자),subject(문자열) 값을 입력합니다.- 새 속성 추가 버튼을 눌러
Number타입을 선택하고, 속성 이름에score, 값에 점수를 입력합니다. - 항목 생성을 클릭하여 데이터를 저장합니다.
- 이 과정을 반복하여 모든 학생의 과목별 점수 데이터를 입력합니다.
10. (실습) DynamoDB 데이터 조회
- 테이블의 항목 탐색 탭으로 이동합니다.
- 항목 스캔 또는 쿼리 섹션을 확장합니다.
특정 학생의 모든 점수 조회 (Query)
쿼리를 선택합니다.- 소스가
테이블 - StudentScore로 설정된 것을 확인합니다. - 파티션 키
id값에 조회할 학생의 학번(예:1)을 입력합니다. - 실행을 클릭하면 해당 학생의 모든 과목과 점수가 조회됩니다.
과목별 점수 순으로 학생 조회 (Query on GSI)
쿼리를 선택합니다.- 소스를
인덱스 - subject-score-index로 변경합니다. - 파티션 키
subject값에 조회할 과목(예:Math)을 입력합니다. - 실행을 클릭하면 해당 과목의 모든 학생 점수가 점수(
score) 순으로 정렬되어 조회됩니다.
전체 데이터에서 필터링하여 조회 (Scan with Filter)
스캔을 선택합니다.- 필터 추가를 통해 원하는 조건(예:
id가1과 같음)을 설정합니다. - 실행을 클릭하면 전체 테이블을 스캔한 후 조건에 맞는 결과만 필터링하여 보여줍니다.
11. (실습) DynamoDB 테이블 삭제
- DynamoDB 대시보드의 테이블 메뉴로 이동합니다.
- 삭제하려는 테이블(
StudentScore)을 선택합니다. - 작업 드롭다운 메뉴에서 테이블 삭제를 클릭합니다.
- 경고창이 나타나면
delete또는삭제를 입력하여 확인합니다. - 삭제 버튼을 클릭하면 테이블이 영구적으로 삭제됩니다.
12. 요약
- NoSQL: 관계형 데이터베이스의 한계를 극복하기 위해 등장했으며, 수평 확장성, 유연한 스키마가 특징입니다.
- DynamoDB: AWS의 완전관리형 NoSQL 데이터베이스로, 빠르고 안정적인 성능을 제공합니다.
- 데이터 타입: 스칼라(Number, String 등), 문서(List, Map), 다중 값(Set) 형식을 지원합니다.
- 파티션 및 키: 파티션 키로 데이터 저장 위치를 결정하고, 정렬 키로 데이터를 정렬합니다. 이 둘을 합쳐 기본 키(Primary Key)를 구성합니다.
- 보조 인덱스: 기본 키 이외의 속성으로 데이터를 효율적으로 쿼리하기 위해 LSI와 GSI를 사용합니다.
- 데이터 조회:
Query(효율적)와Scan(비효율적) 두 가지 방법이 있으며, 항상Query사용을 지향해야 합니다.