

# Lambda 기반 애플리케이션에 대한 데이터베이스 서비스 선택
<a name="ddb-rds-database-decision"></a>

많은 서버리스 애플리케이션은 데이터를 저장하고 검색해야 합니다. AWS는 Lambda 함수에서 작동하는 여러 가지 데이터베이스 옵션을 제공합니다. 가장 인기 있는 두 가지 옵션은 NoSQL 데이터베이스 서비스인 Amazon DynamoDB와 기존 관계형 데이터베이스 솔루션인 Amazon RDS입니다. 다음 섹션에서는 이러한 서비스를 Lambda와 함께 사용할 때 이러한 서비스의 주요 차이점을 설명하며, 서버리스 애플리케이션에 적합한 데이터베이스 서비스를 선택할 수 있도록 지원합니다.

AWS에서 제공하는 다른 데이터베이스 서비스에 대해 자세히 알아보고, 사용 사례 및 장단점을 더욱 종합적으로 이해하려면 [Choosing an AWS database service](https://docs.aws.amazon.com/decision-guides/latest/databases-on-aws-how-to-choose/databases-on-aws-how-to-choose.html) 섹션을 참조하세요. 모든 AWS 데이터베이스 서비스는 Lambda와 호환되지만, 모든 데이터베이스 서비스가 특정 사용 사례에 적합한 것은 아닙니다.

## Lambda를 사용하여 데이터베이스 서비스를 선택할 때 고를 수 있는 옵션
<a name="w2aac15c59d101c19b9"></a>

AWS는 여러 가지 데이터베이스 서비스를 제공합니다. 서버리스 애플리케이션의 경우 가장 많이 사용되는 두 가지 옵션은 DynamoDB 및 Amazon RDS입니다.
+ **DynamoDB**는 서버리스 애플리케이션에 최적화된 완전 관리형 NoSQL 데이터베이스 서비스입니다. 모든 규모에서 원활한 규모 조정 및 일관된 한 자릿수 밀리초 성능을 제공합니다.
+ **Amazon RDS**는 MySQL 및 PostgreSQL을 비롯한 여러 데이터베이스 엔진을 지원하는 관리형 관계형 데이터베이스 서비스입니다. 관리형 인프라를 통해 익숙한 SQL 기능을 제공합니다.

## 권장 사항(요구 사항을 이미 알고 있는 경우)
<a name="w2aac15c59d101c19c11"></a>

요구 사항을 이미 명확히 알고 있는 경우 기본 권장 사항은 다음과 같습니다.

지연 시간이 짧은 일관된 성능, 자동 규모 조정이 필요하고 복잡한 조인 또는 트랜잭션을 요구하지 않는 서버리스 애플리케이션에 [DynamoDB](with-ddb.md)를 사용하는 것이 좋습니다. 이는 서버리스의 특성상 Lambda 기반 애플리케이션에 특히 적합합니다.

[Amazon RDS](services-rds.md)는 복잡한 SQL 쿼리, 조인이 필요하거나 관계형 데이터베이스를 사용하는 기존 애플리케이션이 있는 경우에 더 적합한 옵션입니다. 그러나 Lambda 함수를 Amazon RDS에 연결하려면 추가 구성이 필요하며, 콜드 스타트 시간에 영향을 미칠 수 있습니다.

## 데이터베이스 서비스를 선택할 때 고려해야 할 사항
<a name="w2aac15c59d101c19c13"></a>

Lambda 애플리케이션에 DynamoDB 및 Amazon RDS 중 어떤 걸 사용할지 선택할 경우 다음 요소를 고려하세요.
+ 연결 관리 및 콜드 스타트
+ 데이터 액세스 패턴
+ 쿼리 복잡성
+ 데이터 일관성 요구 사항
+ 규모 조정 특성
+ 비용 모델

이러한 요소를 이해하면 특정한 사용 사례의 요구 사항에 가장 적합한 옵션을 선택할 수 있습니다.

### 연결 관리 및 콜드 스타트
<a name="w2aac15c59d101c19c13b9b1"></a>
+ DynamoDB는 모든 작업에 HTTP API를 사용합니다. Lambda 함수는 연결을 유지하지 않고도 즉시 요청할 수 있으므로 콜드 스타트 성능이 향상됩니다. 각 요청은 연결 오버헤드 없이 AWS 자격 증명을 사용하여 인증됩니다.
+ Amazon RDS는 기존 데이터베이스 연결을 사용하기 때문에 연결 풀을 관리해야 합니다. 이 경우 새 Lambda 인스턴스가 연결을 설정해야 하므로 콜드 스타트에 영향을 미칠 수 있습니다. 연결 풀링 전략을 구현해야 하며 [Amazon RDS Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.html)를 사용하여 연결을 효과적으로 관리해야 할 수 있습니다. Amazon RDS Proxy를 사용하면 추가 비용이 발생합니다.

### 데이터 액세스 패턴
<a name="w2aac15c59d101c19c13b9b3"></a>
+ DynamoDB는 알려진 액세스 패턴 및 단일 테이블 설계에 가장 적합합니다. 프라이머리 키 또는 보조 인덱스를 토대로 데이터에 대해 지연 시간이 짧은 일관된 액세스가 필요한 Lambda 애플리케이션에 적합합니다.
+ Amazon RDS는 복잡한 쿼리 및 변경되는 액세스 패턴을 위한 유연성을 제공합니다. Lambda 함수가 여러 테이블에서 고유한 맞춤형 쿼리 또는 복잡한 조인을 수행해야 하는 경우에 더 적합합니다.

### 쿼리 복잡성
<a name="w2aac15c59d101c19c13b9b5"></a>
+ DynamoDB는 간단한 키 기반 작업 및 사전 정의된 액세스 패턴에서 우수한 기능을 발휘합니다. 복잡한 쿼리는 인덱스 구조를 중심으로 설계되어야 하며, 조인은 애플리케이션 코드에서 처리되어야 합니다.
+ Amazon RDS는 조인, 하위 쿼리, 집계를 통해 복잡한 SQL 쿼리를 지원합니다. 이렇게 하면 복잡한 데이터 작업이 필요할 때 Lambda 함수 코드를 간소화할 수 있습니다.

### 데이터 일관성 요구 사항
<a name="w2aac15c59d101c19c13b9b7"></a>
+ DynamoDB는 단일 항목 읽기에 사용할 수 있는 강력한 일관성과 함께 최종 일관성 및 강력한 일관성 옵션을 모두 제공합니다. 트랜잭션이 지원되지만 몇 가지 제한 사항이 있습니다.
+ Amazon RDS는 완전한 원자성, 일관성, 격리, 내구성(ACID) 규정 준수 및 복잡한 트랜잭션 지원을 제공합니다. Lambda 함수에 복잡한 트랜잭션이 필요하거나 여러 레코드에 강력한 일관성이 필요한 경우 Amazon RDS가 더 적합할 수 있습니다.

### 규모 조정 특성
<a name="w2aac15c59d101c19c13b9b9"></a>
+ DynamoDB는 워크로드에 따라 자동으로 확장됩니다. 사전 프로비저닝 없이 Lambda 함수의 갑작스러운 트래픽 스파이크를 처리할 수 있습니다. 온디맨드 용량 모드를 사용하면 Lambda의 규모 조정 모델과 완벽하게 일치하는 사용량에 대해서만 비용을 지불할 수 있습니다.
+ Amazon RDS는 선택한 인스턴스 크기에 따라 용량이 고정됩니다. 여러 Lambda 함수가 동시에 연결을 시도할 경우 연결 할당량을 초과할 수 있습니다. 연결 풀을 꼼꼼하게 관리하고 재시도 로직을 구현해야 합니다.

### 비용 모델
<a name="w2aac15c59d101c19c13b9c11"></a>
+ DynamoDB의 요금은 서버리스 애플리케이션과 잘 맞습니다. 온디맨드 용량을 사용하면 Lambda 함수에서 수행한 실제 읽기 및 쓰기에 대해서만 비용을 지불합니다. 유휴 시간에는 요금이 부과되지 않습니다.
+ Amazon RDS는 사용량과 관계없이 실행 중인 인스턴스에 대해 요금을 청구합니다. 이렇게 되면 서버리스 애플리케이션에서 일반적으로 일어날 수 있는 산발적인 워크로드의 경우 비용 효율성이 떨어질 수 있습니다. 그러나 사용량이 일관되면서 처리량이 많은 워크로드의 경우에는 더 경제적일 수 있습니다.

## 선택한 데이터베이스 서비스 시작하기
<a name="w2aac15c59d101c19c15"></a>

이제 DynamoDB 및 Amazon RDS 중 하나를 선택하는 기준과 이들 간의 주요 차이에 대해 알아보았으니, 요구 사항과 가장 일치하는 옵션을 선택하고 다음 리소스를 사용하여 사용을 시작할 수 있습니다.

------
#### [ DynamoDB ]

**다음 리소스를 사용하여 DynamoDB 시작하기**
+ DynamoDB 서비스에 대한 소개는 **Amazon DynamoDB 개발자 가이드의 [What is DynamoDB?](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 섹션을 참조하세요.
+ [API Gateway에서 Lambda 사용](services-apigateway-tutorial.md) 자습서를 따라 API 요청에 대한 응답으로 Lambda 함수를 사용하여 DynamoDB 테이블에서 CRUD 작업을 수행하는 예제를 확인합니다.
+ **Amazon DynamoDB 개발자 안내서의 [DynamoDB 및 AWS SDK를 사용한 프로그래밍](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.html) 섹션을 읽고 AWS SDK 중 하나를 사용하여 Lambda 함수 내에서 DynamoDB에 액세스하는 방법을 자세히 알아봅니다.

------
#### [ Amazon RDS ]

**다음 리소스를 사용하여 Amazon RDS 시작하기**
+ Amazon RDS 서비스에 대한 소개는 **Amazon Relational Database Service 사용 설명서의 [Amazon Relational Database Service(Amazon RDS)란 무엇입니까?](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) 섹션을 참조하세요.
+ *Amazon Relational Database 사용 설명서*의 [Amazon RDS에 액세스하기 위해 Lambda 함수 사용](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-lambda-tutorial.html) 자습서를 따릅니다.
+ [Amazon RDS와 함께 AWS Lambda 사용](services-rds.md) 섹션을 읽고 Amazon RDS와 함께 Lambda를 사용하는 방법을 자세히 알아봅니다.

------