이 단원에서는 DynamoDB에서 데이터를 삽입 및 검색하는 몇 가지 간단한 예제를 설명합니다. CreateTable API를 사용하여 DynamoDB 테이블을 생성한 후, BatchWriteItem API 호출을 사용하여 몇 가지 항목을 삽입합니다. 마지막으로 GetItem API 호출을 사용하여 개별 항목을 검색합니다. 이 예제를 진행하기 전에, 온라인 서점 애플리케이션 예제에서 사용할 데이터 모델을 살펴봅니다.

후속 모듈에서는, Query API 호출을 사용하여 한 번에 여러 항목을 검색하는 방법과 보조 인덱스를 사용하여 추가 쿼리 패턴을 활성화하는 방법에 대해 알아봅니다. 또한 테이블에서 기존 항목을 업데이트하는 방법도 알아봅니다.

모듈 완료 시간: 15분


이 모듈에서는 다음과 같은 DynamoDB 개념이 중요합니다.

  • 테이블: DynamoDB 데이터 레코드 모음입니다.
  • 항목: DynamoDB 테이블의 단일 데이터 레코드입니다. 관계형 데이터베이스에서 행과 비슷합니다.
  • 속성: 항목의 단일 데이터 요소입니다. 관계형 데이터베이스에서 열과 비슷합니다. 그러나 관계형 데이터베이스의 열과 달리, 이 모듈에서 나중에 설명하는 기본 키 외에 테이블 작성 시 속성을 지정하지 않아도 됩니다. 속성은 문자열, 정수 또는 부울과 같은 단순 유형이거나 목록 또는 매핑과 같은 복합 유형일 수도 있습니다.
  • 기본 키: 기본 키는 DynamoDB 테이블의 단일 항목에 대한 고유 식별자입니다. 기본 키 이름 및 유형은 테이블 작성 시 지정해야 하며, 테이블에 쓰는 각 항목과 함께 지정된 유형의 기본 키를 포함해야 합니다. 단순 기본 키는 단일 속성으로 구성되며, 복합 기본 키는 두 개의 속성(파티션 키 및 정렬 키)으로 구성됩니다. 예를 들어, 식별자로 “UserID”를 사용하여 단순 기본 키를 생성하거나 항목 식별자로 “UserID” 및 “Creation_Date”를 결합하여 복합 기본 키를 생성할 수 있습니다.

애플리케이션을 구축할 때 항상 애플리케이션 논리에 필요한 데이터 모델을 설계하는 시간을 가져야 합니다. 데이터 모델을 설계할 때는 데이터 읽기 및 쓰기 측면 모두에 대해 애플리케이션에 필요한 데이터 액세스 요구 사항을 고려해야 합니다.

DynamoDB는 비관계형 데이터베이스입니다. 비관계형 데이터베이스에서는 테이블을 생성할 때 전체 스키마를 미리 지정하지 않아도 됩니다. 테이블에 대한 기본 키만 선언하면 됩니다. 이 기본 키로 테이블의 각 레코드를 고유하게 식별합니다. 그러면 애플리케이션 요구 사항이 변경될 때 스키마를 쉽게 수정할 수 있으므로, 데이터 모델을 설계하는 사전 비용을 줄일 수 있습니다.

이 자습서 “소개”의 “애플리케이션 배경 정보” 단원에서 설명한 대로, 애플리케이션은 서적의 제목과 작가로 개별 서적을 검색해야 합니다. 제목과 작가 조합은 서적의 고유한 식별자이므로, 이 속성을 테이블의 기본 키로 사용할 수 있습니다. 또한 애플리케이션은 역사 또는 전기와 같은 서적의 카테고리에 대한 정보와 함께 하드커버, 페이퍼백 또는 오디오북과 같은 사용 가능한 서적의 형식도 저장해야 합니다. 그러면 이러한 정보는 인벤토리 시스템의 항목 번호에 매핑됩니다.

이 요구 사항을 염두에 두고, 테이블에 대해 다음 스키마를 사용할 수 있습니다.

  • 제목(문자열): 서적 제목
  • 작가(문자열): 서적 작가
  • 카테고리(문자열): 역사, 전기 및 공상 과학과 같은 서적의 카테고리
  • 형식(맵): 하드커버, 페이퍼백 및 오디오북과 같이 판매할 수 있는 다양한 형식과 인벤토리 시스템에서 해당 항목 번호

다음 단계에서는 테이블의 복합 기본 키(AuthorTitle)를 지정하여 테이블을 생성합니다. 그런 다음, 일부 항목을 테이블로 로드하고 테이블에서 개별 항목을 읽습니다.


  • 1단계. DynamoDB 테이블 생성

    다운로드한 디렉터리에는 CreateTable API를 사용하여 Books 테이블을 작성하는 create_table.py 스크립트가 들어 있습니다. AWS Cloud9 터미널에서 다음 명령을 입력하여 이 스크립트를 실행할 수 있습니다.

    $ python create_table.py

    AWS Cloud9 편집기에서 create_table.py 스크립트를 열면 다음을 확인할 수 있습니다.

    • 스크립트는 CreateTable API 호출에서 KeySchema 인수로 테이블의 복합 기본 키를 지정합니다. 테이블에서는 해시 키로 Author를, 범위 키로 Title을 사용합니다.
    • 스크립트에서는 읽기 용량 단위 및 쓰기 용량 단위 모두를 정의하여 테이블에 대해 프로비저닝된 처리량을 지정합니다. DynamoDB를 사용하면 읽기 및 쓰기 용량을 별도로 설정할 수 있으므로, 초과 프로비저닝으로 인해 많은 비용을 지불하지 않고도 애플리케이션의 요구 사항에 부합하도록 구성을 미세 조정할 수 있습니다.
  • 2단계. 테이블로 항목 로드

    이 단계에서는 테이블에 몇 가지 서적을 로드합니다. AWS Cloud9 터미널에서 다음 명령을 실행합니다.
    $ python insert_items.py
    이 명령은 다음 스크립트를 실행합니다.
    import boto3
    
    dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
    table = dynamodb.Table('Books')
    
    with table.batch_writer() as batch:
        batch.put_item(Item={"Author": "John Grisham", "Title": "The Rainmaker",
            "Category": "Suspense", "Formats": { "Hardcover": "J4SUKVGU", "Paperback": "D7YF4FCX" } })
        batch.put_item(Item={"Author": "John Grisham", "Title": "The Firm",
            "Category": "Suspense", "Formats": { "Hardcover": "Q7QWE3U2",
            "Paperback": "ZVZAYY4F", "Audiobook": "DJ9KS9NM" } })
        batch.put_item(Item={"Author": "James Patterson", "Title": "Along Came a Spider",
            "Category": "Suspense", "Formats": { "Hardcover": "C9NR6RJ7",
            "Paperback": "37JVGDZG", "Audiobook": "6348WX3U" } })
        batch.put_item(Item={"Author": "Dr. Seuss", "Title": "Green Eggs and Ham",
            "Category": "Children", "Formats": { "Hardcover": "GVJZQ7JK",
            "Paperback": "A4TFUR98", "Audiobook": "XWMGHW96" } })
        batch.put_item(Item={"Author": "William Shakespeare", "Title": "Hamlet",
            "Category": "Drama", "Formats": { "Hardcover": "GVJZQ7JK",
            "Paperback": "A4TFUR98", "Audiobook": "XWMGHW96" } })
    

    이전 스크립트에서와 같이 BatchWriteItem API를 사용하여 서적 5권을 테이블로 로드합니다. 각 서적에는 기본 키에 해당하는 AuthorTitle 속성과 서적에 대한 추가 정보를 제공하는 CategoryFormats 속성이 있습니다. 각 속성에는 유형이 있으며, 속성 유형은 Category 속성에 대한 문자열과 같은 단순 유형 또는 Formats 속성에 대한 맵과 같은 복합 유형일 수 있습니다.

    Boto 3 클라이언트 라이브러리를 사용하여 HTTP API로 데이터를 삽입했습니다. 모든 데이터 액세스 및 조작 요청은 관계형 데이터베이스 관리 시스템에서 일반적으로 데이터베이스에 대한 영구 연결을 유지 관리하는 대신, HTTP 요청으로 수행됩니다..

  • 3단계. 테이블에서 항목 검색

    GetItem API 요청을 사용하고 원하는 항목의 기본 키를 지정하여 단일 서적을 검색할 수 있습니다.

    AWS Cloud9 터미널에서 다음 명령을 실행합니다.

    $ python get_item.py

    그러면 다음 스크립트를 실행하여 단일 항목을 검색합니다. 이때 찾는 항목은 John Grisham이 쓴 The RainMaker입니다.

    import boto3
    
    dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
    table = dynamodb.Table('Books')
    
    resp = table.get_item(Key={"Author": "John Grisham", "Title": "The Rainmaker"})
    
    print(resp['Item'])

    터미널에서는 테이블에서 검색된 전체 서적 데이터를 출력합니다.

    $ python get_item.py
    {'Title': 'The Rainmaker', 'Formats': {'Hardcover': 'J4SUKVGU', 'Paperback': 'D7YF4FCX'}, 'Author': 'John Grisham', 'Category': 'Suspense'}

    테이블의 각 항목은 기본 키로 고유하게 식별되므로, GetItem API 호출은 항상 테이블에서 하나 이상의 항목을 반환합니다.


    다음 모듈에서는 단일 API 호출로 DynamoDB 테이블에서 여러 항목을 검색하는 방법에 대해 알아봅니다. 또한 보조 인덱스를 사용하여 테이블에서 여러 데이터 액세스 패턴을 활성화하는 방법도 살펴봅니다.