개발을 파헤치다/서버 인프라

[AWS DynamoDB] PynamoDB로 DynamoDB에 테이블 생성하기

개발자_H 2023. 4. 17. 18:50
반응형

보통 Framework를 사용해서 DB를 모델링할 때 ORM(Object Relational Mapping)을 사용하는데요. 이렇게 하면 직접 데이터베이스 테이블을 생성하는 것보다 유지보수성이 좋습니다. 일단 클래스 형태로 DB 테이블을 관리할 수 있고, DB가 바뀌어도 ORM을 통해 구현된 비즈니스 로직은 수정할 필요가 없기 때문이죠. 그렇다면 DynamoDB를 사용할 때에도 이런 이점을 누릴 수 있을까요?

가능합니다. 여기에서 소개할 PynamoDB를 사용하면 말이죠. 이번 글에서는 PynamoDB를 활용해서 테이블을 생성하는 방법을 알아보겠습니다.

 

기본키에 대한 이해

키는 테이블 내에서 아이템들을 구분하는 역할을 하는데요. RDBMS에서의 키값과 DynamoDB에서의 키값은 의미가 약간 다르기때문에 이에 대한 이해가 먼저 필요합니다. DynamoDB에서는 두 가지 키값을 통해서 값을 구분할 수 있습니다.

  • 파티션키(해시키) : 아이템 항목을 저장할 파티션(물리적 스토리지)을 결정하는 키값입니다. DynamoDB는 내부 해시 함수에 의해 파티션키가 정해집니다. 파티션키로만 구성되어 있는 테이블에서는 아이템들끼리 동일한 파티션키값을 가질 수 없습니다.

  • 복합키(해시키 + 범위키) : 해시키와 범위키 두 개의 속성을 활용해서 기본키로 사용할 수 있습니다. 이때에는 해시키에 동일한 값이 들어가도 되고 정렬키가 고유값이 되어야 합니다. 복합키를 사용하면 더 유연하게 데이터를 쿼리 할 수 있습니다. 예를 들어, Music 테이블에 Artist와 SongTitle로 복합키를 설정했다고 해봅시다. 이런 경우 Artist값만 있으면 해당 Artist의 모든 노래를 검색할 수 있고 두 키값이 모두 있으면 특정 노래의 정보를 가져올 수 있습니다. 

 

 

 

 

DB 모델링하기

이제 PynamoDB를 활용해 새로운 테이블을 생성해봅시다.

먼저, IntelliJ에서 지원하는 DynamoDB 플러그인이 PyCharm에 설치되어 있으면 쉽게 쓸 수 있기 때문에 이 설정을 먼저 해줍니다.

플러그인이 활성화되었으면 이제 DB 모델링을 합니다.

 

from pynamodb.attributes import UnicodeAttribute
from pynamodb.models import Model


class TestModel(Model):

    class Meta:
        region = "ap-northeast-2"
        table_name = "dynamo-test"
        # read/write 모드 On-Demand로 설정
        billing_mode = 'PAY_PER_REQUEST'

    userId = UnicodeAttribute(hash_key=True)
    password = UnicodeAttribute()

먼저 해야 할 부분은 Meta 정보를 작성하는 것인데요. 

  • region : DynamoDB가 존재하는 리전을 설정해 줍니다.

  • table_name : 생성할 Table 이름을 설정합니다.

  • billing_mode : 읽기/쓰기 모드를 설정합니다. default는 프로비저닝 모드로 설정되어 있습니다. 이 경우 read_capacity_units와 write_capacity_units를 설정해 줘야 테이블이 생성됩니다. 온디맨드 모드로 사용하기 위해서는 PAY_PER_REQUEST 모드로 따로 설정을 해줘야 합니다.

이제 속성값 설정을 합니다. PynamoDB에서는 다양한 속성값들을 제공합니다.

  • UnicodeAttribute : 유니코드 필드를 입력할 수 있습니다. option으로 hash_key나 range_key 값을 지정해서 파티션키나 정렬키로 지정할 수 있습니다.

  • BinaryAttribute : base64로 인코딩 된 값을 문자열 바이트로 디코딩한 값으로 저장합니다.

  • NumberAttribute : 숫자값을 저장합니다.

  • UTCDateTimeAttribute : UTC 날짜값을 문자열 형태로 저장합니다. 데이터를 가져다 쓸 때에는 datetime object로 변환해 줍니다.

  • BooleanAttribute : True/False값을 저장할 수 있습니다. 
  • JSONAttribute : JSON 값을 저장할 수 있습니다. JSON값을 유니코드로 변환해서 저장한 다음 데이터를 가져올 때는 JSON 형태로 변환해서 줍니다.

  • MapAttribute : map attribute를 사용하면 필드에 key-value 형태의 데이터를 저장할 수 있습니다. 이때는 result를 MapAttribute로 설정하고 이에 대한 내용을 따로 클래스로 구현해줘야 합니다. 저장할 때에는 구현한 MapAttribute 클래스를 전달하면 되며, 데이터를 가져올 때에는 Dict형태로 반환됩니다.

테이블 생성하기

모델링이 끝났으면 이제 python 명령어를 활용해 테이블을 생성합니다.

좌측 하단에 있는 Terminal을 클릭하고 python을 입력합니다.
그리고 구현한 Model 클래스를 import 합니다.

 

>> from test_project.test.repository.TestRepository import TestModel

이제 테이블을 생성합니다.

>> if not TestModel.exists():
	TestModel.create_table(wait=True)

 

wait을 True로 설정하면 테이블 생성이 완료될 때까지 기다립니다.
이제 DynamoDB를 갱신한 뒤 확인하면 테이블이 생성된 것을 확인할 수 있습니다.

주의할 점이 있는데 테이블을 생성하고 데이터가 비어있는 상태에서는 속성값들이 들어가 있지 않을 수 있습니다. RDB와는 다르게 PynamoDB를 통해 테이블을 생성한다고 속성값들이 Column에 바로 보이지 않습니다. 
Model 클래스를 통해 인스턴스를 생성하고 save() 메서드를 사용해서 저장을 해야만 속성값들이 보이게 됩니다.

 

테이블 삭제하기

테이블을 삭제하려면 Terminal을 켠 뒤 삭제하려는 Model 클래스를 import 합니다. 그 후에 아래 명령어를 입력해서 Table을 삭제합니다.

>> TestModel.delete_table()
반응형