CertNote/ 출퇴근 학습 노트
로드맵
KOEN
CLF-C02 · FoundationalCloud Practitioner - Foundational
DVA-C02 · AssociateDeveloper - Associate
SAA-C03 · AssociateSolutions Architect - Associate
SOA-C02 · AssociateCloudOps Engineer - Associate
SAP-C02 · ProfessionalSolutions Architect - Professional
DOP-C02 · ProfessionalDevOps Engineer - Professional
SCS-C03 · SpecialtySecurity - Specialty
MLA-C01 · AssociateMachine Learning Engineer - Associate
AIF-C01 · FoundationalAI Practitioner - Foundational
DEA-C01 · AssociateData Engineer - Associate
  • Week 1
    • 1.데이터 엔지니어링이란
    • 2.배치 vs 스트리밍
    • 3.AWS 데이터 서비스 조감도
    • 4.데이터 포맷과 모델링
    • 5.Week 1 종합 복습
  • Week 2
  • Week 3
  • Week 4
  • Week 5
  • Week 6
  • Week 7
    • 1.Amazon Redshift: 분산/정렬 키와 워크로드 최적화
    • 2.Amazon Athena: 서버리스 쿼리와 비용 최적화
    • 3.DynamoDB (분석 관점): 키 설계와 스트림 기반 파이프라인
    • 4.RDS/Aurora & 스토어 선택: OLTP, 제로 ETL, 워크로드→스토어 결정
    • 5.Week 7 종합: 분석 스토어 복습
  • Week 8
  • Week 9
  • Week 10
MLS-C01 · SpecialtyMachine Learning - Specialty
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← DEA-C01/Week 7/Day 3

기준: DEA-C01 시험 가이드·오류 제보

DEA-C01· AssociateWeek 7 · Day 3읽기 약 15분
핵심 정리
  • DynamoDB 는 파티션 키의 해시로 데이터를 나눠 저장하는 키-값 스토어다. 키로 찾는 조회는 밀리초지만, 키 없이 훑는 Scan 은 테이블 전체를 읽고 그만큼 용량을 소비한다.
  • 파티션 하나의 처리량에는 상한이 있다. 한 키에 트래픽이 몰리면 핫 파티션이 되어 스로틀되므로 고르게 분포한 키를 쓰고, 필요하면 쓰기 샤딩으로 흩는다.
  • GSI 는 다른 키로 테이블 전체를 다시 인덱싱한다(결과적 일관성, 생성 후 추가 가능). LSI 는 같은 파티션 키에 다른 정렬 키다(생성 시에만 정의, 강한 일관성 가능).
  • 대량 분석은 테이블에서 하지 않고 밖으로 내보낸다: 실시간 변경은 DynamoDB Streams 또는 Kinesis Data Streams, 통째 스냅샷은 S3 export, 운영 부담 없는 웨어하우스 복제는 제로 ETL.
  • Streams 는 24시간 보존·중복 없음·항목 단위 순서 보장, Kinesis Data Streams 는 최대 1년 보존·더 많은 컨슈머·중복과 순서 뒤바뀜 가능이다.

Day 3 - DynamoDB (분석 관점): 키 설계와 스트림 기반 파이프라인

DynamoDB 기본 모델

Amazon DynamoDB 는 완전관리형 서버리스 NoSQL 키-값·문서 데이터베이스다. 본질은 OLTP 용이지만, 데이터 엔지니어는 두 가지 이유로 알아야 한다. 운영 데이터의 원천으로서 어떻게 꺼내 올 것인가, 그리고 파이프라인의 상태 저장소·조회 스토어로서 어떻게 설계할 것인가.

데이터는 테이블 → 아이템(행) → 속성(컬럼) 으로 구성된다. 아이템은 기본 키로 식별된다.

  • 파티션 키(PK): 해시되어 아이템이 저장될 물리 파티션을 정한다.
  • 정렬 키(SK): 같은 파티션 키 안에서 아이템을 정렬한다. PK + SK 조합이 복합 기본 키다.
PK = USER#1001     SK = ORDER#2026-06-26#A   amount=120
PK = USER#1001     SK = ORDER#2026-06-26#B   amount=80
PK = USER#1001     SK = PROFILE              name="Kim"
  • 키 외의 속성은 스키마가 없다. 아이템마다 속성이 달라도 된다. 아이템 하나의 크기에는 상한(400KB)이 있다.
  • 같은 PK 를 가진 아이템들의 묶음을 아이템 컬렉션이라 한다. 위 예에서 USER#1001 의 주문과 프로필이 한 컬렉션이고, PK 하나로 한 번에 가져온다.

읽는 방법 셋

연산동작비용
GetItem기본 키 전체를 지정해 아이템 하나그 아이템 크기만큼
QueryPK 를 지정하고 SK 조건(범위·접두)으로 한 컬렉션 안을 조회조건에 맞아 읽은 아이템만큼
Scan테이블(또는 인덱스) 전체를 처음부터 끝까지테이블 전체 크기만큼
  • Scan 의 FilterExpression 은 읽은 뒤에 버리는 필터다. 결과가 10건이어도 테이블 전체의 읽기 용량이 나간다. "필터를 걸었는데 왜 비싼가"의 답이다.
  • Query·Scan 은 한 번에 최대 1MB 까지 돌려주고, 그 이상은 페이지를 이어 받는다.

💡 관련 이론: DynamoDB 는 접근 패턴을 먼저 정하고 키를 설계한다(access-pattern-first). 관계형 DB 는 스키마를 정규화해 두고 쿼리를 나중에 짜지만, DynamoDB 는 "어떤 키로 무엇을 꺼낼 것인가"의 목록이 곧 스키마다. 목록에 없던 질문(임의 컬럼 집계, 조인)은 Scan 으로밖에 답할 수 없고, 그것이 분석을 밖으로 내보내는 이유다.

용량 모드와 과금 단위

축프로비저닝온디맨드
과금설정한 RCU·WCU 의 시간당 요금(쓰든 안 쓰든)실제 요청한 읽기·쓰기 요청 단위
용량 관리직접 설정하거나 Auto Scaling없음
맞는 트래픽꾸준하고 예측 가능변동 크고 예측 불가, 신규 워크로드
급증 대응프로비저닝한 만큼만이전 피크의 2배까지 즉시 수용
  • 읽기 단위 1개 = 4KB 이하 아이템의 강한 일관성 읽기 1회, 또는 결과적 일관성 읽기 2회. 쓰기 단위 1개 = 1KB 이하 아이템 쓰기 1회. 아이템이 크면 4KB·1KB 단위로 올림해 더 든다.
  • 그래서 20KB 아이템의 강한 일관성 읽기 한 번은 5단위다. 분석용으로 전체를 Scan 하면 "테이블 크기 ÷ 4KB" 만큼의 읽기 단위가 나간다.
  • 새 온디맨드 테이블은 초당 쓰기 4,000·읽기 12,000 까지 받는다. 이전 피크의 2배를 30분 안에 넘기면 스로틀될 수 있다.
  • 프로비저닝 → 온디맨드 전환은 24시간에 4번까지 가능하다.

키 설계와 핫 파티션

테이블의 파티션 하나는 초당 읽기 3,000단위·쓰기 1,000단위까지 내도록 설계되어 있다. 테이블 전체 용량이 아무리 커도 한 파티션 키에 몰린 트래픽은 이 상한에 걸린다.

  • 고른 분포: PK 는 값의 종류가 많고 트래픽이 고르게 퍼지는 속성(userId, deviceId)을 고른다. 날짜·상태·국가처럼 값이 적거나 쏠리는 속성은 나쁜 PK 다.
  • 쓰기 샤딩: 어쩔 수 없이 쏠리는 키에는 접미사를 붙여 여러 파티션으로 나눈다. 읽을 때는 모든 접미사를 조회해 합쳐야 한다.
  • 단일 테이블 설계: 여러 엔티티를 한 테이블에 넣고 PK/SK 접두사로 구분한다. 조인이 없는 대신 관련 데이터를 한 번의 Query 로 가져온다.
  • 적응형 용량(adaptive capacity)이 쏠린 파티션에 여유 용량을 돌려주지만, 파티션당 상한 자체를 넘겨 주지는 못한다.
-- 안티패턴: 시계열에서 날짜만 PK 로 쓰면 그날 트래픽이 한 파티션에 집중
PK = 2026-06-26
 
-- 쓰기 샤딩: 접미사로 N개 파티션에 분산 (읽을 때는 0~N-1 을 모두 조회)
PK = 2026-06-26#03
 
-- 더 흔한 해법: 장치 ID 를 PK 로, 시각을 SK 로
PK = DEVICE#8821    SK = 2026-06-26T10:15:00Z
키 선택분포판정
user_id, device_id, order_id값이 많고 고름좋음
date, status, country값이 적거나 쏠림핫 파티션
tenant_id (대형 테넌트 하나가 대부분)한 값에 쏠림샤딩 필요
날짜 + 샤드 접미사인위적으로 고르게가능, 읽기가 복잡해짐

GSI 와 LSI

기본 키가 아닌 속성으로 조회하려면 보조 인덱스가 필요하다.

축GSI(Global Secondary Index)LSI(Local Secondary Index)
키테이블과 다른 PK(및 SK)테이블과 같은 PK, 다른 SK
범위테이블 전체한 파티션 키 안
생성 시점언제든 추가·삭제테이블 생성 시에만
일관성결과적 일관성만강한 일관성 선택 가능
용량테이블과 별도 용량테이블 용량을 공유
개수테이블당 기본 20개(쿼터)테이블당 5개
키 유일성인덱스 키가 중복되어도 됨-
-- GSI 예: 상태별 주문 조회
GSI: PK = status (SHIPPED/PENDING), SK = order_date
→ "PENDING 주문을 날짜순으로" 같은 새 접근 패턴 지원
  • 테이블에 쓰면 GSI 가 비동기로 따라온다. 보통 1초 안이지만 방금 쓴 값이 GSI 조회에 안 보일 수 있다.
  • GSI 의 쓰기 용량이 부족하면 기본 테이블의 쓰기까지 스로틀된다. 프로비저닝 모드에서 GSI 쓰기 용량은 테이블 이상으로 잡는다. "테이블 용량은 남는데 쓰기가 스로틀된다"의 흔한 원인이다.
  • 프로젝션: 인덱스에 복사할 속성을 고른다. KEYS_ONLY(키만), INCLUDE(지정한 속성 추가), ALL(전부). GSI 조회는 프로젝션되지 않은 속성을 가져오지 못하고, ALL 은 저장량과 쓰기 비용을 키운다.
  • 희소 인덱스: 인덱스 키 속성이 없는 아이템은 인덱스에 들어가지 않는다. "처리 대기 중인 것만" 같은 부분 집합을 싸게 조회하는 기법이다.
  • 위 예처럼 status 를 GSI 의 PK 로 쓰면 GSI 자체가 핫 파티션이 된다. 인덱스도 테이블과 같은 분포 규칙을 따른다.

💡 관련 이론: GSI 는 "미리 알고 있는 조회 축을 하나 더 만드는" 도구이지 분석 도구가 아니다. 집계 축이 늘 때마다 GSI 를 추가하면 쓰기마다 인덱스 수만큼 비용이 붙고, 그래도 SUM·GROUP BY 는 여전히 못 한다. 조회 축이 계속 바뀌는 질문은 컬럼형 분석 스토어의 일이다.

변경 캡처: Streams 와 Kinesis Data Streams

DynamoDB 는 아이템 단위 변경(INSERT·MODIFY·REMOVE)을 스트림으로 내보낸다. 선택지는 둘이고, 한 테이블에 둘 다 켤 수 있다.

속성DynamoDB StreamsKinesis Data Streams for DynamoDB
보존24시간최대 1년
컨슈머 수샤드당 동시 2개까지샤드당 5개, 향상된 팬아웃이면 20개
순서같은 아이템의 변경은 실제 순서대로레코드의 타임스탬프로 순서를 직접 판단
중복없음(각 레코드가 정확히 한 번)가끔 중복될 수 있음
처리 수단Lambda, Kinesis 어댑터(KCL)Lambda, Managed Service for Apache Flink, Data Firehose, Glue 스트리밍 ETL
고르는 단서"변경마다 Lambda 로 반응", 단순"장기 보존·재처리", "여러 앱이 소비", "Firehose 로 S3 에 적재"

스트림에 무엇을 담을지는 뷰 타입으로 정한다.

StreamViewType담기는 것쓰임
KEYS_ONLY바뀐 아이템의 키만변경 사실만 알리고 본문은 다시 조회
NEW_IMAGE변경 후 아이템 전체최신 상태를 다른 스토어에 복제
OLD_IMAGE변경 전 아이템 전체삭제된 값 보관, 감사
NEW_AND_OLD_IMAGES변경 전후 모두차이 계산, CDC 를 완전하게 재현
  • 뷰 타입은 스트림을 만든 뒤 바꿀 수 없다. 바꾸려면 스트림을 끄고 새로 만든다.
  • 스트림은 비동기로 기록되므로 켜도 테이블 성능에 영향이 없다.
  • Lambda 는 샤드마다 레코드를 순서대로 배치로 받는다. 함수가 실패하면 그 샤드의 다음 레코드로 넘어가지 못하므로, 재시도 제한·배치 분할·실패 대상 설정이 Kinesis 때와 똑같이 필요하다.
  • TTL 로 만료된 아이템의 삭제도 스트림에 나온다(사용자 삭제가 아닌 서비스 삭제로 표시). TTL 삭제는 만료 즉시가 아니라 백그라운드에서 일어나고 쓰기 용량을 쓰지 않는다. "만료된 아이템을 S3 로 아카이브"가 Streams + Lambda 의 전형적 용도다.
DynamoDB 테이블
   ├─ DynamoDB Streams ──► Lambda ──► 가공 ──► S3 / OpenSearch / 다른 테이블
   └─ Kinesis Data Streams ──► Data Firehose ──► S3 (Parquet) ──► Athena / Redshift Spectrum
                           └─► Managed Service for Apache Flink (실시간 집계)

통째로 내보내기: S3 export 와 그 밖의 방법

방법동작테이블 용량 소비신선도맞는 경우
S3 exportPITR 백업에서 특정 시점의 테이블을 S3 로없음내보낸 시점정기 스냅샷 분석, 대용량
증분 S3 export지정한 기간에 바뀐 것만없음15분~24시간 구간 단위전체 export 이후의 따라잡기
제로 ETL → Redshift전체 export 후 증분 export 로 자동 복제없음15~30분 간격웨어하우스에서 운영 부담 없이 분석
Athena 페더레이션(DynamoDB 커넥터)Athena 가 테이블을 직접 읽음있음실시간가끔 하는 탐색적 조회
Glue ETL·Redshift COPY 로 직접 읽기Scan 으로 읽어 감있음실행 시점작은 테이블, 단발성
  • S3 export 는 PITR(특정 시점 복구)이 켜져 있어야 한다. 백업에서 읽으므로 읽기 용량을 쓰지 않고 테이블 성능에 영향이 없다. 출력 포맷은 DynamoDB JSON 또는 Amazon Ion 이고, 다른 계정·다른 리전의 버킷으로도 내보낼 수 있다.
  • export 결과는 Parquet 이 아니다. Athena 로 반복 조회할 것이면 Glue 나 CTAS 로 Parquet 으로 한 번 변환한다.
  • export 는 완료 시간이 보장되지 않는 비동기 작업이다. "몇 분 안에 끝난다"를 전제로 파이프라인을 짜지 않는다.
  • 제로 ETL 은 원천 테이블의 PITR 을 요구하고, Redshift 에는 아이템이 SUPER 타입 컬럼으로 들어온다. 최소 지연이 15분이므로 초 단위 신선도가 필요하면 스트림이 답이다.
  • 직접 Scan 하는 방식은 운영 트래픽과 읽기 용량을 다툰다. 지문에 "운영 테이블에 영향 없이"가 있으면 export 다.
# PITR 백업에서 특정 시점의 테이블을 S3 로 내보내기
aws dynamodb export-table-to-point-in-time \
  --table-arn arn:aws:dynamodb:ap-northeast-2:111122223333:table/Orders \
  --s3-bucket acme-datalake-raw-prod \
  --s3-prefix dynamodb/orders/ \
  --export-format DYNAMODB_JSON

DynamoDB 가 맞는 경우와 맞지 않는 경우

워크로드판정대신 쓸 것
키로 한 자릿수 밀리초 조회(세션, 장바구니, 디바이스 상태)맞음-
예측할 수 없는 대규모 동시 요청, 서버리스 백엔드맞음(온디맨드)-
파이프라인의 체크포인트·메타데이터·중복 제거 키 저장맞음-
임의 컬럼 집계, GROUP BY 리포트맞지 않음export·스트림 → S3 + Athena, Redshift
여러 테이블 조인맞지 않음RDS/Aurora, Redshift
전문 검색맞지 않음스트림·제로 ETL → OpenSearch
큰 객체(수 MB 문서, 이미지)맞지 않음(아이템 크기 상한)S3 에 저장하고 키만 DynamoDB 에
운영(OLTP): DynamoDB  →  변경 캡처(Streams/Kinesis) 또는 스냅샷(Export)  →  분석(OLAP): S3 + Athena / Redshift

이것은 CQRS(명령-조회 책임 분리)의 데이터 엔지니어링 버전이다. 쓰기와 키 조회는 DynamoDB, 분석과 집계는 컬럼형 스토어로 나눠 각자 잘하는 일을 시킨다. 둘 사이를 잇는 방법이 실시간이면 스트림, 주기적이면 export, 관리형으로 맡기려면 제로 ETL 이다.

증상 → 원인 → 조치

증상원인조치
테이블 용량은 남는데 특정 요청만 스로틀핫 파티션(한 키에 쏠림)키 재설계, 쓰기 샤딩
쓰기가 스로틀되는데 테이블 WCU 는 여유GSI 쓰기 용량 부족GSI 용량을 테이블 이상으로
필터를 건 조회인데 읽기 용량이 치솟는다Scan + FilterExpressionQuery 가 되도록 키·GSI 설계
분석 잡이 도는 시간에 서비스 지연분석이 테이블을 직접 ScanS3 export 로 전환
방금 쓴 값이 인덱스 조회에 안 보인다GSI 의 결과적 일관성테이블을 강한 일관성으로 읽거나 LSI
스트림 컨슈머를 셋째로 붙였더니 스로틀Streams 의 샤드당 동시 리더 2개 한도Kinesis Data Streams 로 전환
하루 넘게 멈췄던 컨슈머가 데이터를 잃음Streams 24시간 보존 초과Kinesis Data Streams(장기 보존), export 로 재구축
export 가 실패한다PITR 미활성PITR 활성화
하류에 같은 변경이 두 번 반영됨Kinesis 경로의 중복 레코드, Lambda 재시도멱등 처리(키 기준 업서트)

지문 단서 → 정답 판별표

지문 단서정답
"날짜·상태를 파티션 키로 썼더니 스로틀"핫 파티션 → 고른 키, 쓰기 샤딩
"기본 키가 아닌 속성으로 테이블 전체를 조회"GSI
"같은 파티션 키 안에서 다른 정렬 기준, 강한 일관성 필요"LSI(테이블 생성 시 정의)
"아이템 변경에 실시간으로 반응"DynamoDB Streams + Lambda
"변경 이력을 며칠 이상 보존, 여러 애플리케이션이 소비"Kinesis Data Streams for DynamoDB
"변경분을 S3 에 지속 적재"Kinesis Data Streams → Data Firehose → S3
"운영 테이블에 영향 없이 전체를 S3 로"S3 export(PITR 필요)
"DynamoDB 데이터를 Redshift 에서, 파이프라인 관리 없이"제로 ETL 통합
"S3 데이터와 DynamoDB 를 가끔 SQL 로 조인"Athena 페더레이션 쿼리
"트래픽을 예측할 수 없다, 용량 관리를 원치 않는다"온디맨드 모드
"오래된 아이템을 자동으로 지우고 지워진 것은 보관"TTL + Streams + Lambda → S3

내일은 관계형 OLTP 스토어인 RDS/Aurora 와 제로 ETL, 그리고 워크로드를 보고 스토어를 고르는 기준을 다룬다.

📖 용어

  • 파티션 키 / 정렬 키 : 아이템이 놓일 파티션을 정하는 키와, 그 안에서 순서를 정하는 키.
  • 아이템 컬렉션 : 같은 파티션 키를 가진 아이템들의 묶음.
  • 핫 파티션 : 한 파티션 키에 트래픽이 몰려 그 파티션만 스로틀되는 현상.
  • 쓰기 샤딩 : 쏠리는 키에 접미사를 붙여 여러 파티션으로 나누는 기법.
  • RCU / WCU : 읽기·쓰기 용량 단위. 읽기는 4KB, 쓰기는 1KB 기준으로 계산한다.
  • GSI / LSI : 다른 키로 테이블 전체를 인덱싱하는 전역 보조 인덱스와, 같은 파티션 키에 다른 정렬 키를 주는 로컬 보조 인덱스.
  • 프로젝션(인덱스) : 테이블에서 인덱스로 복사해 둘 속성의 범위.
  • DynamoDB Streams : 아이템 단위 변경을 시간순으로 24시간 보관하는 변경 로그.
  • PITR : 특정 시점 복구. 연속 백업을 유지해 과거 임의 시점으로 복원하거나 내보낼 수 있게 한다.
  • TTL : 아이템에 만료 시각을 지정해 자동 삭제되게 하는 기능.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

DynamoDB에서 시계열 데이터의 PK를 날짜(예: 2026-06-26)로만 지정했을 때 발생하는 문제는?

문제 2

기본 키와 다른 속성(예: status)으로 테이블 전체를 조회하는 새로운 접근 패턴을 추가하려면 무엇을 사용하는가?

문제 3

DynamoDB 테이블의 아이템 변경을 시간순으로 캡처해 분석 파이프라인으로 흘려보내는 기능은?

문제 4

운영 DynamoDB 테이블에 부하를 주지 않고 특정 시점 데이터를 S3로 내보내 Athena로 분석하려면 가장 적절한 방법은?

문제 5

DynamoDB 사용이 분석 관점에서 부적합한 워크로드로 가장 적절한 것은?

이전Amazon Athena: 서버리스 쿼리와 비용 최적화Week 7 · Day 2다음 RDS/Aurora & 스토어 선택: OLTP, 제로 ETL, 워크로드→스토어 결정Week 7 · Day 4

참고 공식 자료

  • DEA-C01 공식 시험 안내(새 탭에서 열림)
  • Amazon DynamoDB 공식 문서(새 탭에서 열림)
  • Amazon S3 공식 문서(새 탭에서 열림)
  • Amazon Kinesis 공식 문서(새 탭에서 열림)
  • Amazon Athena 공식 문서(새 탭에서 열림)
  • Amazon Redshift 공식 문서(새 탭에서 열림)

이 페이지

  • DynamoDB 기본 모델
  • 읽는 방법 셋
  • 용량 모드와 과금 단위
  • 키 설계와 핫 파티션
  • GSI 와 LSI
  • 변경 캡처: Streams 와 Kinesis Data Streams
  • 통째로 내보내기: S3 export 와 그 밖의 방법
  • DynamoDB 가 맞는 경우와 맞지 않는 경우
  • 증상 → 원인 → 조치
  • 지문 단서 → 정답 판별표
  • 용어
  • 연습 문제