데이터 저장소 설계 의사결정: RDS/DynamoDB vs S3 + Cognito
개요
프로젝트 초반에는 RDS나 DynamoDB를 도입할지 고민했다.
하지만 실제 요구사항을 검토하고 테스트한 결과, Cognito + S3 조합으로 충분하다는 결론을 내렸다.
이 과정에서 어떤 기준으로 판단했고, 왜 해당 결정을 내렸는지를 기록한다.
후보안 비교
| 항목 | RDS | DynamoDB | S3 + Cognito |
|---|
| 구조적 데이터 저장 | 관계형 구조에 강점 | Key-Value/NoSQL 구조 | 비정형 데이터(S3), 인증은 Cognito |
| 데이터 성격 | 스키마 강제 필요 | 빠른 읽기/쓰기, 단순 구조 적합 | 파일 중심(이력서, 음성, 분석 결과) |
| 운영 복잡도 | 스키마 관리, 백업 필요 | 파티션 키 설계 필수 | 단순 저장/조회, 관리 부담 적음 |
| 비용 | 인스턴스 비용 지속 발생 | 읽기/쓰기 요청 단위 비용 | 저장량 기반 과금, 소규모 프로젝트 저렴 |
| 성능/지연 | 높은 일관성 보장 | 마이크로초 단위 응답 | S3는 대량 파일에도 안정적 |
| 확장성 | 수직 확장 중심 | 수평 확장 우수 | 대규모 파일 저장에 최적화 |
테스트 및 검토
- 데이터 형태
- 실제로 저장해야 하는 정보는 이력서 파일, 생성된 질문, 답변, 피드백 위주 → 비정형 데이터 중심
- 실시간 요구사항
- 면접 서비스는 실시간 처리(STT, TTS)가 핵심 → DB의 강한 트랜잭션 기능까지는 필요 없음
- 비용/운영 편의
- RDS는 인스턴스 유지비가 커서 프로젝트 규모에 맞지 않음
- DynamoDB는 테이블 설계와 사용 패턴이 단순하지 않으면 오히려 과설계 위험
- S3 + Cognito 테스트
- 사용자 로그인은 Cognito로 간단히 해결
- 이력서 업로드/분석 결과를 S3에 저장 후 DynamoDB 없이도 충분히 관리 가능
DB 생성 테스트

기본 키 구성
| 키 종류 | 이름 | 타입 | 설명 |
|---|
| Partition Key | user_id | String | Cognito에서 발급되는 사용자 고유 ID (sub 값) |
| Sort Key | interview_id | String | 각 면접을 구분하기 위한 고유 ID (날짜 기반 or UUID 가능) |
주요 속성 필드
| 필드명 | 타입 | 설명 |
|---|
timestamp | String | 면접 시작 시간 (ISO 8601 형식) |
resume_s3 | String | S3에 업로드된 이력서 파일 경로 |
resume_keywords | List of Strings | 이력서 분석을 통해 추출된 주요 키워드 |
questions | List of Maps | 생성된 질문 목록 (type, text 포함) |
answers | List of Strings | 사용자의 답변 목록 |
feedback | Map | 분석 피드백 (text, score) 포함 |
{
"user_id": {
"S": "user-abc123"
},
"interview_id": {
"S": "interview-20250602-001"
},
"answers": {
"L": [
{
"S": "저는 컴퓨터공학을 전공했고..."
},
{
"S": "작년 팀 프로젝트에서 리더 역할을 맡았고..."
}
]
},
"feedback": {
"M": {
"score": {
"N": "87"
},
"text": {
"S": "명확한 논리와 사례 사용이 좋았습니다."
}
}
},
"questions": {
"L": [
{
"M": {
"text": {
"S": "자기소개 부탁드립니다."
},
"type": {
"S": "기본질문"
}
}
},
{
"M": {
"text": {
"S": "리더십 경험을 말씀해 주세요."
},
"type": {
"S": "꼬리질문"
}
}
}
]
},
"resume_keywords": {
"L": [
{
"S": "Python"
},
{
"S": "Leadership"
},
{
"S": "AI"
}
]
},
"resume_s3": {
"S": "s3://your-bucket/user-abc123/resume.pdf"
},
"timestamp": {
"S": "2025-06-02T14:00:00Z"
}
}
최종 결정
Cognito + S3
“데이터베이스는 무조건 필요하다”는 고정관념을 버리고,
현재 프로젝트의 데이터 성격과 운영 부담을 기준으로 선택하는 게 중요했다.
초기에는 DynamoDB를 고려했지만, 실제 기능 요구를 테스트한 결과 과도한 설계라는 결론에 도달했다.
결과적으로 Cognito + S3 구조는 간단하고 비용 효율적이며, 팀 내 모두가 이해하기 쉬운 방식이었다.