DynamoDB 테이블 생성하기
알림 서버에서 사용할 닉네임 관련 테이블을 DynamoDB를 이용해 생성해 보자.
RDB로 치면 member_nickname 테이블에 Long member_id(pk), Varchar nickname로 컬럼 두 개인 테이블인데 이것과 비슷하게 DynamoDB에서 테이블을 생성해 보자
DynamoDB 기본 개념
1. 테이블 이름
테이블 이름은 테이블을 고유하게 식별하는 이름이다.
내가 만들 테이블은 멤버의 ID와 닉네임을 저장하는 용도로 member_nickname라는 이름을 사용할 것이다.
2. 기본 키
기본 키는 DynamoDB의 각 항목을 고유하게 식별하는 데 사용되는 키다. 기본 키는 파티션 키만으로 구성되거나, 파티션 키와 정렬 키의 조합으로 구성될 수 있다.
3. 파티션 키
파티션 키는 기본 키의 일부로서, 항목을 분산 저장하는 기준이 된다. 내가 만들 member_nickname 테이블은 memberId를 파티션 키로 사용할 것이며, 이 키는 각 항목을 고유하게 식별한다.
데이터 타입으로는 '숫자(Number)'를 선택하여 스프링 부트에서 Long 타입으로 사용되는 memberId를 대응시킨다.
4. 정렬 키
정렬 키는 필수 값은 아니고 옵션 값으로, 파티션 키와 함께 사용하여 복합 기본 키를 구성할 수 있다. 한 파티션 내의 항목들을 정렬하는 데 사용된다.
member_nickname 테이블에서는 memberId와 nickname만 저장하므로, 정렬 키는 필요하지 않을 것 같다.
5. 속성(Attribute)
DynamoDB에서는 테이블의 '열(column)'을 '속성(attribute)'라고 부른다.
member_nickname 테이블에서는 memberId를 파티션 키로, nickname을 추가 속성으로 정의한다. DynamoDB는 스키마가 유연하므로, 테이블 생성 시 모든 속성을 명시할 필요가 없으며, 새로운 속성은 항목 추가나 업데이트 시 자동으로 생성된다.
6. 인덱스
파티션 키 인덱스
DynamoDB에서 파티션 키는 자동으로 인덱스 역할을 한다. memberId가 파티션 키로 사용되므로, 별도의 인덱스 추가 없이도 효율적인 데이터 접근이 가능하다.
보조 인덱스
추가적인 쿼리 패턴을 지원하기 위해, 글로벌 보조 인덱스(GSI)나 로컬 보조 인덱스(LSI)를 선택적으로 사용할 수 있다. 지금 member_nickname 테이블의 경우, memberId로 닉네임을 조회하는 것이 주된 사용 사례이므로, 보조 인덱스는 필요하지 않다.
DynamoDB 테이블 생성
DynamoDB로 생성할 테이블 예시는 다음과 같다.
테이블 이름: member_nickname
파티션 키: memberId (Number)
추가 속성: nickname (String)
이를 기반으로 생성하는 방법은 다음과 같다.
그 외 설정은 기본으로 두었다.
그리고 하단에 '테이블 생성' 버튼을 클릭하면 생성이 된다.
조금 기다리면 대시 보드에 생성된 테이블이 보인다!
💡 테이블 생성할 때 nickname에 해당하는 속성을 추가하지 않은 이유
DynamoDB는 NoSQL 데이터베이스로, 스키마가 유연하다. 이는 테이블을 생성할 때 모든 속성을 정의할 필요가 없다는 의미이다. 파티션 키(필수)와 정렬 키(선택 사항)만 초기에 정의하며, 이들은 테이블의 기본 키를 구성한다. 그 외의 속성은 항목을 추가할 때 자유롭게 정의할 수 있다.
한번 상황을 가정해 보자.
member_nickname 테이블에는 처음에 memberId만 정의되어 있다고 하자. 나중에 각 멤버의 nickname을 추가하고 싶다면, 단순히 nickname 속성을 포함하여 항목을 추가하거나 기존 항목을 업데이트하면 된다.
테이블에 항목(item) 생성
이 과정은 RDB 테이블에 row를 추가하는 것과 동일하다.
일단 수동으로 AWS console 화면에서 항목을 추가해 보자. 위에서 생성한 테이블에 들어가면 해당 화면이 보인다. 여기서 '작업 > 항목 생성'을 클릭해 준다.
속성 추가 방법
새 항목(예를 들어 nickname이나 email 같이 파티션 키인 memberId를 제외한 속성)을 추가하거나 기존 항목을 업데이트할 때 새로운 속성을 포함시키면, 해당 속성이 자동으로 테이블에 추가된다.
예를 들어, nickname 속성이 없는 항목에 nickname을 추가하려면 해당 항목을 업데이트하면서 nickname 값을 포함시키기만 하면 된다.
'항목 생성' 버튼을 클릭하면 아래 같은 화면이 나오는데 여기서 우측에 'JSON 뷰'를 클릭해서 JSON으로 항목을 추가하는 화면으로 바꾸자.
JSON 뷰로 이동되면 일단 기본으로 파티션 키만 입력되어 있는 모습을 확인할 수 있다.
DynamoDB에서 데이터를 나타내는 방식은 JSON과 유사하지만, 각 속성 값에 데이터 타입을 명시하는 특별한 형식을 사용한다.
예를 들어, { "memberId": { "N": "0" } }에서 "N"은 숫자(Number) 타입을 의미하며, 0은 memberId의 값이다.
DynamoDB는 다음과 같은 데이터 타입을 지원한다:
- "S": 문자열(String)
- "N": 숫자(Number)
- "B": 이진(Binary)
- 그 외에도 리스트(List), 맵(Map), 세트(Set) 등 복잡한 데이터 타입을 지원한다.
"N": "0" 구문에서 "0"은 문자열 형태로 표현되지만, "N"을 통해 이 값이 숫자임을 DynamoDB가 인식하게 된다. 이는 DynamoDB가 타입-안전한 데이터베이스임을 의미하며, 각 값의 데이터 타입을 명확히 지정해야 한다.
속성 추가 예시
기존 memberId에 nickname 값을 추가하려면 다음과 같이 항목을 정의할 수 있다:
다음 예시에서 memberId는 숫자 타입으로 1을 가지며, nickname은 문자열 타입으로 "user123"을 값으로 가진다.
{
"memberId": {
"N": "1"
},
"nickname": {
"S": "nickname124"
}
}
이렇게 적어주고 아래 '항목 생성' 버튼을 클릭한다.
그럼 생성 완료!
이제 다음 글에서는 스프링 부트에서 DynamoDB에 항목을 추가하는 코드를 같이 살펴보자.
사이드 팀원인 "개발자의 서랍"님의 블로그도 한번 방문해 보세요! 좋은 글이 많이 있습니다 :)
'AWS' 카테고리의 다른 글
[AWS] Lambda로 RDS 시작 및 중지 설정 (0) | 2023.12.04 |
---|---|
[AWS] AWS ALB 헬스 체크(상태 검사) 간격 및 경로 수정을 통한 서비스 최적화 (0) | 2023.11.22 |
[AWS] ECS에서 Zipkin을 통한 스프링 부트 서비스 트레이싱 구축하기 (0) | 2023.11.19 |
[AWS] SNS, SQS 연동하기 (2) - Spring Boot 3.X.X 버전과 SNS, SQS 연동하기 (2) | 2023.11.06 |
[AWS] SNS, SQS 연동하기 (1) - SNS, SQS 생성하기 (0) | 2023.11.06 |