Taeyoung Kim

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 테이블 생성

  1. AWS 콘솔에서 DynamoDB 서비스로 이동합니다.
  2. 테이블 생성을 클릭합니다.
  3. 테이블 이름StudentScore를 입력합니다.
  4. 파티션 키id를 입력하고 타입을 숫자로 설정합니다.
  5. 정렬 키 추가를 선택하고, 정렬 키에 subject를 입력하고 타입을 문자열로 설정합니다.
  6. 테이블 설정에서 설정 사용자 지정을 선택합니다.
  7. 보조 인덱스 섹션에서 글로벌 인덱스 생성을 클릭합니다.
  8. 새 GSI의 파티션 키subject (타입: 문자열), 정렬 키score (타입: 숫자)를 입력합니다.
  9. 인덱스 이름subject-score-index로 지정하고 인덱스 생성을 클릭합니다.
  10. 모든 설정을 확인한 후 테이블 생성 버튼을 클릭하여 생성을 완료합니다.

9. (실습) DynamoDB 데이터 입력

  1. 생성된 StudentScore 테이블을 선택합니다.
  2. 작업 드롭다운 메뉴에서 항목 생성을 클릭합니다.
  3. id (숫자), subject (문자열) 값을 입력합니다.
  4. 새 속성 추가 버튼을 눌러 Number 타입을 선택하고, 속성 이름에 score, 값에 점수를 입력합니다.
  5. 항목 생성을 클릭하여 데이터를 저장합니다.
  6. 이 과정을 반복하여 모든 학생의 과목별 점수 데이터를 입력합니다.

10. (실습) DynamoDB 데이터 조회

  1. 테이블의 항목 탐색 탭으로 이동합니다.
  2. 항목 스캔 또는 쿼리 섹션을 확장합니다.

특정 학생의 모든 점수 조회 (Query)

  1. 쿼리를 선택합니다.
  2. 소스가 테이블 - StudentScore로 설정된 것을 확인합니다.
  3. 파티션 키 id 값에 조회할 학생의 학번(예: 1)을 입력합니다.
  4. 실행을 클릭하면 해당 학생의 모든 과목과 점수가 조회됩니다.

과목별 점수 순으로 학생 조회 (Query on GSI)

  1. 쿼리를 선택합니다.
  2. 소스를 인덱스 - subject-score-index로 변경합니다.
  3. 파티션 키 subject 값에 조회할 과목(예: Math)을 입력합니다.
  4. 실행을 클릭하면 해당 과목의 모든 학생 점수가 점수(score) 순으로 정렬되어 조회됩니다.

전체 데이터에서 필터링하여 조회 (Scan with Filter)

  1. 스캔을 선택합니다.
  2. 필터 추가를 통해 원하는 조건(예: id1과 같음)을 설정합니다.
  3. 실행을 클릭하면 전체 테이블을 스캔한 후 조건에 맞는 결과만 필터링하여 보여줍니다.

11. (실습) DynamoDB 테이블 삭제

  1. DynamoDB 대시보드의 테이블 메뉴로 이동합니다.
  2. 삭제하려는 테이블(StudentScore)을 선택합니다.
  3. 작업 드롭다운 메뉴에서 테이블 삭제를 클릭합니다.
  4. 경고창이 나타나면 delete 또는 삭제를 입력하여 확인합니다.
  5. 삭제 버튼을 클릭하면 테이블이 영구적으로 삭제됩니다.

12. 요약

  • NoSQL: 관계형 데이터베이스의 한계를 극복하기 위해 등장했으며, 수평 확장성, 유연한 스키마가 특징입니다.
  • DynamoDB: AWS의 완전관리형 NoSQL 데이터베이스로, 빠르고 안정적인 성능을 제공합니다.
  • 데이터 타입: 스칼라(Number, String 등), 문서(List, Map), 다중 값(Set) 형식을 지원합니다.
  • 파티션 및 키: 파티션 키로 데이터 저장 위치를 결정하고, 정렬 키로 데이터를 정렬합니다. 이 둘을 합쳐 기본 키(Primary Key)를 구성합니다.
  • 보조 인덱스: 기본 키 이외의 속성으로 데이터를 효율적으로 쿼리하기 위해 LSI와 GSI를 사용합니다.
  • 데이터 조회: Query(효율적)와 Scan(비효율적) 두 가지 방법이 있으며, 항상 Query 사용을 지향해야 합니다.