🚀 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 비교
데이터 모델 | NoSQL (스키마 없음, 유연한 모델) | RDBMS (스키마 강제) |
확장성 | 수평 확장 가능 (데이터 양에 따라 자동 확장) | 수직 확장 (성능을 높이려면 더 강력한 하드웨어 필요) |
성능 | 빠른 읽기/쓰기 성능, 자동 조정 | 성능은 하드웨어 및 설정에 따라 다름 |
비용 | 사용량 기반, 자동 스케일링 | 인스턴스 크기 및 스토리지에 따른 고정 비용 |
트랜잭션 | 일부 트랜잭션 지원 | 강력한 ACID 트랜잭션 지원 |
DynamoDB는 NoSQL 데이터베이스로, 대규모 데이터와 빠른 성능을 요구하는 애플리케이션에 적합하며, RDS는 ACID 트랜잭션을 지원하는 관계형 데이터베이스로 데이터 관계와 일관성이 중요한 애플리케이션에 적합합니다.
🔑 DynamoDB의 데이터 모델 및 키
DynamoDB의 데이터 모델은 테이블을 기반으로 하며, 기본 키를 통해 데이터를 고유하게 식별할 수 있습니다. 기본 키에는 파티션 키와 정렬 키가 있습니다.
기본 키(Primary Key)
- 단순 기본 키: 파티션 키만 사용하여 항목을 고유하게 식별합니다.
- 복합 기본 키: 파티션 키와 정렬 키를 함께 사용하여 항목을 고유하게 식별합니다.
**파티션 키(Partition Key)**와 정렬 키(Sort Key)
- 파티션 키는 데이터를 저장할 파티션을 결정합니다.
- 정렬 키는 동일한 파티션 내에서 항목을 정렬하는 데 사용됩니다.
📈 DynamoDB 데이터 타입
- 스칼라 데이터 형식: 하나의 값만 표현할 수 있는 형식입니다.
- Number: 양수, 음수, 0 (최대 38자리)
- String: 문자열
- Binary: 이진 데이터 (이미지, 파일 등)
- Boolean: true 또는 false
- Null: 정의되지 않은 값
- 문서 형식: 내포된 구조를 표현할 수 있는 형식입니다.
- List: 순서가 지정된 값 모음
- Map: 키-값 쌍의 모음
- 다중 값 형식: 여러 개의 값으로 구성된 집합입니다.
- String Set: 문자열 집합
- Number Set: 숫자 집합
- Binary Set: 이진 집합
📜 DynamoDB 보조 인덱스
DynamoDB는 보조 인덱스를 통해 빠르고 효율적인 데이터 검색을 지원합니다.
- 로컬 보조 인덱스(LSI): 파티션 키는 동일하고, 정렬 키만 다른 인덱스입니다.
- 글로벌 보조 인덱스(GSI): 파티션 키와 정렬 키가 다른 인덱스입니다. GSI를 사용하면 데이터 모델링에 유연성을 추가할 수 있습니다.
🧑💻 DynamoDB 실습
실습 1: DynamoDB 테이블 만들기
- AWS 콘솔에서 DynamoDB 서비스를 검색하고 접속합니다.
- Create Table을 클릭하고, 테이블 이름과 기본 키를 설정합니다.
- Partition Key: ID (문자열)
- Sort Key: Timestamp (숫자)
실습 2: 데이터 삽입
- 테이블에 데이터를 삽입할 때 PutItem API를 사용합니다.
- 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는 정렬 키가 되어, 학생별 과목 정보를 효율적으로 조회할 수 있게 됩니다.
예시: 성적 테이블
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 |