DynamoDB는 BLOB을 저장할 수 있나요?
예, 한도 안에서는 가능합니다. DynamoDB는 항목 전체가 400 KB 미만으로 유지되는 한, 전송 시 base64로 인코딩되는 Binary(B) 속성에 바이너리 대용량 객체(BLOB)를 저장합니다. 그보다 큰 것 — 동영상, 오디오, 고해상도 이미지 — 에 대해서는 AWS가 BLOB을 Amazon S3에 저장하고 DynamoDB에는 참조와 메타데이터만 두라고 권장합니다.
BLOB을 직접 저장하기
바이트를 Binary 속성에 넣으세요. 애플리케이션은 바이너리 값을 보내기 전에 base64로 인코딩하며, DynamoDB는 400 KB 항목 크기에 원시 바이트 길이를 셉니다. 작은 BLOB(서명, 소형 페이로드)은 넉넉히 들어갑니다.
실제로 몇 바이트가 들어가나요
400 KB는 BLOB이 아니라 항목의 크기입니다. 경계를 이진 탐색하면 정확한 상한이 나옵니다. 한 글자짜리 파티션 키와 Binary 속성 하나만 담은 항목은 BLOB 409,594바이트를 받습니다. 한 바이트만 더하면 쓰기가 실패합니다:
ValidationException: Item size has exceeded the maximum allowed size그 옆에 현실적인 메타데이터 속성 여섯 개(콘텐츠 타입, 크기, 업로더, 타임스탬프)를 두면 94바이트를 차지해 상한이 409,500으로 내려갑니다.
base64 인코딩은 전송상의 세부 사항일 뿐 그 이상이 아닙니다. 그 409,594바이트 put은 요청 본문에 base64 546,128바이트를 보내고 DynamoDB는 그것을 받아들이므로, base64가 예산의 3분의 1을 잡아먹는다는 널리 퍼진 생각은 틀렸습니다. 실제로 비용이 드는 것은 처리량입니다. 가득 찬 BLOB은 put당 쓰기 400단위, 강력한 일관성 읽기당 100단위이며, 작은 항목은 각각 1단위와 0.5단위입니다.
대용량 객체 패턴
BLOB이 400 KB를 넘을 때는:
- 객체를 Amazon S3에 저장하세요.
- S3 키와 메타데이터(이름, 크기, 소유자, 타임스탬프)를 DynamoDB에 두세요.
이렇게 하면 DynamoDB의 빠른 인덱스 조회와 S3의 저렴하고 무제한인 객체 스토리지가 짝을 이룹니다. 한도를 조금만 넘는 데이터에 대해서는 AWS가 대용량 속성을 압축(GZIP 또는 LZO 출력을 Binary 속성에 저장)하거나 여러 항목으로 나누는 것도 제안합니다.
압축은 텍스트를 구하지, 미디어를 구하지는 않습니다
그 압축 조언은 정확히 한 종류의 BLOB에만 통합니다. 614,499바이트 YAML 락파일에 gzip -9를 적용하면 164,302바이트가 나옵니다. 73% 감축이며, 불가능하던 것을 여유롭게 만듭니다. 같은 명령을 794,311바이트 PNG에 적용하면 785,175바이트가 나옵니다. 1.2% 절감인데, 그 포맷은 이미 스스로 압축되어 있기 때문입니다. 그러니 압축은 로그, JSON 페이로드, 텍스트를 위한 여유는 벌어 주지만, 정작 한도에 부딪히는 흔한 원인인 미디어 파일에는 아무것도 벌어 주지 않습니다.
한 가지 주의점
DynamoDB와 S3 사이에는 서비스 간 트랜잭션이 없으므로, 부분 실패와 고아 객체는 애플리케이션이 직접 처리해야 합니다.
더 알아보기
항목 크기 계산기로 크기를 확인하고 항목 크기 한도 가이드를 읽어보세요. 바이너리 데이터를 보려면 DynoTable을 다운로드하세요.
참고 자료
- Best practices for storing large items and attributes in DynamoDB — Amazon DynamoDB Developer Guide
- Supported data types and naming rules in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Constraints in Amazon DynamoDB — Amazon DynamoDB Developer Guide
위에 링크된 공식 AWS 문서를 기준으로 2026-07-13에 마지막으로 검증했습니다.
2026-07-28에 @aws-sdk/client-dynamodb 3.1095.0을 통해 DynamoDB Local 3.3.0을 상대로 측정했습니다 — 두 바이트 상한은 유도한 것이 아니라 이진 탐색으로 찾았고, gzip 수치는 설명한 두 파일에 gzip -9를 실행해 얻은 것입니다. AWS의 프로덕션 엔진은 거부 메시지를 다르게 표현할 수 있습니다.