13강 DynamoDB 강의 노트 AWS Cloud

2025. 4. 9. 19:17·AWS_Cloud

🚀 DynamoDB 및 NoSQL 완벽 가이드

이번 포스팅에서는 NoSQL 데이터베이스와 그 중에서도 AWS의 DynamoDB에 대해 자세히 알아보겠습니다. DynamoDB는 완전 관리형 NoSQL 데이터베이스로 빠른 성능과 확장성을 제공하는 서비스입니다. 우리가 NoSQL을 사용해야 하는 이유와 DynamoDB의 특징, 장점, 그리고 실습을 통해 각 개념을 살펴보겠습니다.


📌 NoSQL (Non-SQL) 데이터베이스 개념

NoSQL의 정의

NoSQL은 Non-SQL 또는 Non-Relational의 약자로, **관계형 데이터베이스(RDBMS)**와 달리 데이터 간의 관계를 명시적으로 설정하지 않는 데이터베이스입니다. 이로 인해 RDBMS와는 다른 방식으로 데이터를 저장하고 쿼리할 수 있습니다.

NoSQL의 특징

  • 스키마가 없거나 유연한 데이터 모델을 사용합니다.
  • 수평적 확장이 가능하여 데이터량이 많아지더라도 성능 저하 없이 쉽게 확장할 수 있습니다.
  • 빠른 읽기/쓰기 성능을 제공합니다.
  • 복원력: 데이터 유실이 발생해도 다시 복구할 수 있는 기능을 제공하는 경우가 많습니다.

NoSQL 사용 이유

과거에는 관계형 데이터베이스가 대부분이었으나, 빅데이터와 같은 대규모 데이터를 다루거나 실시간 애플리케이션에서 높은 성능을 요구하는 환경에서는 NoSQL 데이터베이스가 더 유리합니다. 예를 들어, 페이스북이나 트위터와 같은 소셜 네트워크 서비스에서는 수억 명의 사용자가 실시간으로 데이터를 주고받기 때문에 수평 확장성과 빠른 응답 시간을 제공하는 NoSQL 데이터베이스가 필수적입니다.


📊 DynamoDB 개념

DynamoDB란?

DynamoDB는 AWS에서 제공하는 완전 관리형 NoSQL 데이터베이스로, 높은 성능과 확장성을 자랑합니다. 속도와 확장성을 최적화한 설계로, 수많은 읽기 및 쓰기 작업을 처리하면서도 10ms 이하의 지연 시간을 보장합니다. 또한 자동 스케일링 기능을 통해 사용량에 맞춰 용량을 자동으로 조정할 수 있습니다.

DynamoDB의 주요 특징

  • 완전 관리형: 서버 설정이나 유지보수 없이 AWS에서 모든 관리 작업을 처리합니다.
  • 속도: 평균 응답 시간이 10ms 이하로, 빠른 속도를 보장합니다.
  • 무제한 확장성: 데이터 양에 관계없이 수평적으로 확장할 수 있습니다.
  • 자동 성능 조정: 데이터베이스 성능을 자동으로 최적화하고, 사용량에 따라 오토 스케일링을 지원합니다.
  • 비용 효율성: 사용한 만큼만 비용을 지불합니다.

🏆 DynamoDB와 RDS 비교

특징DynamoDBRDS (관계형 DB)
데이터 모델 NoSQL (스키마 없음, 유연한 모델) RDBMS (스키마 강제)
확장성 수평 확장 가능 (데이터 양에 따라 자동 확장) 수직 확장 (성능을 높이려면 더 강력한 하드웨어 필요)
성능 빠른 읽기/쓰기 성능, 자동 조정 성능은 하드웨어 및 설정에 따라 다름
비용 사용량 기반, 자동 스케일링 인스턴스 크기 및 스토리지에 따른 고정 비용
트랜잭션 일부 트랜잭션 지원 강력한 ACID 트랜잭션 지원

DynamoDB는 NoSQL 데이터베이스로, 대규모 데이터와 빠른 성능을 요구하는 애플리케이션에 적합하며, RDS는 ACID 트랜잭션을 지원하는 관계형 데이터베이스로 데이터 관계와 일관성이 중요한 애플리케이션에 적합합니다.


🔑 DynamoDB의 데이터 모델 및 키

DynamoDB의 데이터 모델은 테이블을 기반으로 하며, 기본 키를 통해 데이터를 고유하게 식별할 수 있습니다. 기본 키에는 파티션 키와 정렬 키가 있습니다.

기본 키(Primary Key)

  • 단순 기본 키: 파티션 키만 사용하여 항목을 고유하게 식별합니다.
  • 복합 기본 키: 파티션 키와 정렬 키를 함께 사용하여 항목을 고유하게 식별합니다.

**파티션 키(Partition Key)**와 정렬 키(Sort Key)

  • 파티션 키는 데이터를 저장할 파티션을 결정합니다.
  • 정렬 키는 동일한 파티션 내에서 항목을 정렬하는 데 사용됩니다.

📈 DynamoDB 데이터 타입

  1. 스칼라 데이터 형식: 하나의 값만 표현할 수 있는 형식입니다.
    • Number: 양수, 음수, 0 (최대 38자리)
    • String: 문자열
    • Binary: 이진 데이터 (이미지, 파일 등)
    • Boolean: true 또는 false
    • Null: 정의되지 않은 값
  2. 문서 형식: 내포된 구조를 표현할 수 있는 형식입니다.
    • List: 순서가 지정된 값 모음
    • Map: 키-값 쌍의 모음
  3. 다중 값 형식: 여러 개의 값으로 구성된 집합입니다.
    • String Set: 문자열 집합
    • Number Set: 숫자 집합
    • Binary Set: 이진 집합

📜 DynamoDB 보조 인덱스

DynamoDB는 보조 인덱스를 통해 빠르고 효율적인 데이터 검색을 지원합니다.

  • 로컬 보조 인덱스(LSI): 파티션 키는 동일하고, 정렬 키만 다른 인덱스입니다.
  • 글로벌 보조 인덱스(GSI): 파티션 키와 정렬 키가 다른 인덱스입니다. GSI를 사용하면 데이터 모델링에 유연성을 추가할 수 있습니다.

🧑‍💻 DynamoDB 실습

실습 1: DynamoDB 테이블 만들기

  1. AWS 콘솔에서 DynamoDB 서비스를 검색하고 접속합니다.
  2. Create Table을 클릭하고, 테이블 이름과 기본 키를 설정합니다.
    • Partition Key: ID (문자열)
    • Sort Key: Timestamp (숫자)

실습 2: 데이터 삽입

  1. 테이블에 데이터를 삽입할 때 PutItem API를 사용합니다.
  2. PutItem을 통해 ID와 Timestamp에 해당하는 데이터를 삽입합니다.

실습 3: 데이터 조회 (Query vs Scan)

  • Query를 사용하여 파티션 키와 정렬 키를 기준으로 데이터를 조회합니다.
  • Scan을 사용하여 전체 테이블을 읽고 필터링합니다. Query가 Scan보다 성능이 뛰어납니다.

 

📌 DynamoDB 테이블 설계

1. 테이블 설계

먼저, DynamoDB 테이블 설계에서 가장 중요한 점은 기본 키와 보조 인덱스 설정입니다.

1.1. 기본 키 설정

  • 파티션 키: 데이터를 고유하게 식별하는 값입니다. 하나의 파티션에 데이터를 그룹화하는 역할을 합니다.
  • 정렬 키: 같은 파티션 키를 가진 데이터를 정렬하는 역할을 합니다.

예시: 학생 성적 관리 시스템

학생의 학번(StudentID)과 과목(Subject)을 관리하는 테이블을 설계한다고 가정해봅시다.

기본 키 설정:

  • 파티션 키: StudentID (학생 고유 식별자)
  • 정렬 키: Subject (과목 이름)

이렇게 설정하면, 하나의 학생(StudentID)에 대해 여러 과목(Subject)의 성적을 저장하고, 과목별로 정렬할 수 있습니다.


1.2. 복합 기본 키 사용

  • 복합 기본 키를 사용할 때, StudentID는 파티션 키, Subject는 정렬 키가 되어, 학생별 과목 정보를 효율적으로 조회할 수 있게 됩니다.

예시: 성적 테이블

Partition Key (StudentID)Sort Key (Subject)Score
1001 Math 95
1001 English 88
1002 Math 80
1002 Science 85

이 경우, **StudentID**로 학생을 찾고, **Subject**로 과목별 성적을 정렬하여 효율적으로 데이터를 조회할 수 있습니다.


📈 DynamoDB 데이터 조회: Query vs Scan

2. Query: 키 값으로 조회

  • Query는 파티션 키를 기반으로 특정 항목을 효율적으로 조회하는 방식입니다. 정렬 키를 추가하여 범위를 좁힐 수 있습니다.

예시:

  • 학생 A의 Math 과목 성적을 찾으려면, **StudentID = 1001**와 Subject = Math 조건으로 Query를 사용하여 빠르게 데이터를 가져올 수 있습니다.
const params = {
    TableName: "StudentGrades",
    KeyConditionExpression: "StudentID = :id and Subject = :sub",
    ExpressionAttributeValues: {
        ":id": "1001",
        ":sub": "Math"
    }
};

3. Scan: 전체 데이터 조회 후 필터링

  • Scan은 테이블의 모든 데이터를 읽어온 후 조건에 맞는 데이터를 필터링하는 방식입니다. 전체 테이블을 한 번에 읽기 때문에 성능이 느리고 비용이 높을 수 있습니다.

예시:

  • 전체 학생 성적 데이터를 모두 읽은 뒤, 필터를 적용하여 필요한 데이터를 찾는 방식입니다. 예를 들어, 학생 1001의 데이터를 **Scan**으로 읽고 Subject 값으로 필터링할 수 있습니다.

3.1. Query vs Scan 비교

  • Query는 키 값으로 직접 정확한 데이터를 빠르게 조회할 수 있는 방법입니다.
  • Scan은 전체 데이터를 읽고 필요한 데이터를 필터링하기 때문에 속도가 느리고 비용이 비쌉니다.

예시: 학생 찾기

  • Query는 학번 1, 2, 3, 4 학생을 빠르게 찾을 수 있습니다.
  • Scan은 전체 학생을 일일이 불러서 학번을 하나씩 확인해야 하므로 시간이 오래 걸립니다.

📊 DynamoDB의 과금 방식

  • DynamoDB는 읽기/쓰기 용량 유닛을 기반으로 과금이 이루어집니다.
    • 읽기 용량 유닛: 초당 최대 2건의 읽기 작업을 지원합니다.
    • 쓰기 용량 유닛: 초당 최대 1건의 쓰기 작업을 지원합니다.

예시:

  • 읽기 유닛: 초당 2건 읽을 수 있음 (520만 건/월)
  • 쓰기 유닛: 초당 1건 쓰기 가능 (260만 건/월)

과금 예시:

  • 읽기 요청 100만 건당 약 0.27 USD 부과
  • 쓰기 요청 100만 건당 약 1.36 USD 부과

비용을 최적화하려면, 쿼리 방식을 사용하여 불필요한 스캔을 피하고, 적정 용량 유닛을 설정하는 것이 중요합니다.


🔧 실습 예시: DynamoDB 테이블 생성 및 데이터 조회

1. DynamoDB 테이블 생성

  • AWS Console에서 DynamoDB 서비스를 열고, Create Table을 선택합니다.
  • Table Name: StudentGrades
  • Partition Key: StudentID (Type: String)
  • Sort Key: Subject (Type: String)

2. 데이터 삽입

const params = {
    TableName: "StudentGrades",
    Item: {
        "StudentID": "1001",
        "Subject": "Math",
        "Score": 95
    }
};

3. 데이터 조회

const params = {
    TableName: "StudentGrades",
    KeyConditionExpression: "StudentID = :id and Subject = :sub",
    ExpressionAttributeValues: {
        ":id": "1001",
        ":sub": "Math"
    }
};

4. 데이터 스캔

const params = {
    TableName: "StudentGrades",
    FilterExpression: "StudentID = :id",
    ExpressionAttributeValues: {
        ":id": "1001"
    }
};

🧠 결론

DynamoDB는 빠르고 확장성 높은 NoSQL 데이터베이스로, 효율적인 쿼리와 데이터 모델링을 통해 애플리케이션을 빠르게 개발할 수 있습니다. 파티션 키와 정렬 키를 적절히 설계하고, 보조 인덱스를 활용하면 더욱 효율적인 데이터 조회가 가능합니다. Scan을 사용하기보다는 Query를 활용하여 속도와 비용을 최적화하는 것이 좋습니다.


💡 결론

DynamoDB는 매우 빠르고 확장 가능한 NoSQL 데이터베이스로, 자동 성능 조정, 무제한 용량, 10ms 이하의 지연 시간을 제공하며, 빠르게 변화하는 데이터를 관리하는 데 최적화되어 있습니다. RDB와 비교했을 때, 수평 확장성과 빠른 응답을 필요로 하는 대규모 데이터 처리에 유리합니다.

이번 포스팅을 통해 DynamoDB의 기본 개념과 실습 방법을 충분히 이해하고, 실제 애플리케이션에 적용할 수 있는 능력을 기를 수 있습니다. 🚀

'AWS_Cloud' 카테고리의 다른 글

13강 DynamoDB 및 Lamda 실습 노트 (AWS Cloud)  (0) 2025.04.10
13강 DynamoDB 테이블설계과정(Study) AWS Cloud  (0) 2025.04.10
AWS 기본 서브넷 생성  (0) 2025.04.09
11강 Iam 강의 및 실습노트 AWS Cloud  (0) 2025.04.09
10강 Route53 강의 및 실습노트 AWS Cloud  (0) 2025.04.09
'AWS_Cloud' 카테고리의 다른 글
  • 13강 DynamoDB 및 Lamda 실습 노트 (AWS Cloud)
  • 13강 DynamoDB 테이블설계과정(Study) AWS Cloud
  • AWS 기본 서브넷 생성
  • 11강 Iam 강의 및 실습노트 AWS Cloud
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (472) N
      • Python (31)
      • 프로젝트 (43)
      • 과제 (21)
      • Database (40)
      • 멘토링 (7) N
      • 특강 (18)
      • 기술블로그 (126) N
      • AI 분석 (4)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (34) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
13강 DynamoDB 강의 노트 AWS Cloud
상단으로

티스토리툴바