본문 바로가기

Previous (20-22)/Development

AWS DynamoDB in Python (Boto3) - #4. Query & Scan

이번 글에서는 Amazon Web Service(AWS) 에서 DynamoDB를 사용하는 방법을 Python을 이용해서 다루도록 하겠습니다.

처음에 AWS Python 카테고리에서 DynamoDB를 다루고자 했던 것은 아니였지만, 이번 회사에서 기술보고서를 작성하는 과정에 있어서 주제를 DynamoDB를 하다 보니까 블로그에도 같이 다루는 것이 좋을 것 같아서 올려봅니다.


2018/06/03 - [Onik Lab./AWS Python] - AWS DynamoDB in Python (Boto3) - #1. 소개

2018/06/03 - [Onik Lab./AWS Python] - AWS DynamoDB in Python (Boto3) - #2. 테이블 관리

2018/06/03 - [Onik Lab./AWS Python] - AWS DynamoDB in Python (Boto3) - #3. 항목 관리


이번 글은 지난 글에 이어서 AWS SDK for Python인 Boto3 를 사용한 DynamoDB의 항목(Items) 호출을 위한 Query & Scan에 대해서 다루어보도록 하겠습니다.

모든 내용은 AWS의 Boto3 Documentation에 있는 내용이며, 번역자료가 없기 때문에 제가 직접 실습하면서 나타내도록 하겠습니다.


원본 문서: http://boto3.readthedocs.io/en/latest/guide/


영어 문서이므로 참고하시기 바랍니다.


1. Query & Scan 

두 가지 모두 DynamoDB의 항목 호출을 위한 기능이지만, 사용 용도는 약간 차이가 있습니다.

Query는 특정 값을 검색했을 때 나타나는 결과를 조회할 때 사용됩니다. 예제에서는 하나의 항목만 반환하지만, get_items() 함수와 기능은 비슷하지만, get_items()가 단순히 키를 지정했을 때의 값을 가져오는 것이지만, Query는 더욱 자세한 조건을 통해서 값을 가져오는 것이 가능합니다.

Scan은 Query와는 다르게 특정 값을 지정해서 불러올 수도 있지만, 주 용도는 호출하고자 하는 값의 범위를 검색 조건으로 할 때 사용됩니다. 내부 속성으로는 FilterExpression을 사용하며, 이는 즉 필터링을 위한 용도로 보는 것이 맞을 것입니다.

Query & Scan을 사용하기 위해서는 boto3를 import하는 것 외에도 추가 클래스를 호출해야 합니다.

추가 클래스는 boto3.dynamodb.conditions.Key와 boto3.dynamodb.conditions.Attr 클래스로, 호출 방법은 아래와 같습니다.

from boto3.dynamodb.conditions import Key, Attr

import boto3 바로 밑에 작성하면 아무 문제 없이 클래스 import가 가능합니다.


아래 Query & Scan을 위한 기본 예제 테이블은 users 테이블로 할 것이며, 해당 테이블의 항목은 아래와 같습니다.

항목의 Address가 내재된 속성(Nested Attributes)들을 포함하고 있으므로, 각 항목 별 값을 나타내면 다음과 같습니다.


 


이 점을 참고하시고 아래 예제를 실행한 결과를 보시면 더욱 이해가 될 수 있을 것입니다.


2. Query

Query 예제는 아래와 같으며, username 파티션 키 값이 'johndoe'의 값을 가진 항목(Equal: EQ)을 조회하는 내용입니다.

당연히 import 에서 클래스 로드까지 모두 마친 상태입니다.

response = table.query(

    KeyConditionExpression=Key('username').eq('johndoe')

)

items = response['Items']

print(items)

결과는 johndoe의 항목이 호출됩니다.


3. Scan

Scan 첫번째 예제입니다. age 속성의 값이 27보다 작을 때 (Lower Than: LT) 의 내용입니다.

response = table.scan(

    FilterExpression=Attr('age').lt(27)

)

items = response['Items']

print(items)

 

결과는 johndoe와 bobsmith의 항목이 호출됩니다.



Scan 두번째 예제입니다. 조건이 조금은 더 복잡해졌습니다.

first_name의 값이 'J'로 시작(Begins_with)하고, account_type이 'super_user'와 동일할 때의 내용입니다.

response = table.scan(

    FilterExpression=Attr('first_name').begins_with('J') & Attr('account_type').eq('super_user')

)

items = response['Items']

print(items)

 

결과는 janedoering의 항목이 호출됩니다.



Scan 세번째 예제입니다. 위 예제와는 달리, 속성 내에 내재된 속성, 즉 속성 안에 속성 값을 검색할 때 쓰는 조건입니다.

Nested Attributes에 대한 검색 관리도 아래와 같이 할 수 있으며, addresss 속성의 state 속성의 값이 'CA'일 때 나타내는 내용입니다.

response = table.scan(

    FilterExpression=Attr('address.state').eq('CA')

)

items = response['Items']

print(items)

결과는 johndoe와 alicedoe의 항목이 호출됩니다.



Python SDK인 Boto3를 활용하여 DynamoDB를 관리하는 방법에 관한 글은 여기까지입니다.

이 모든 내용은 AWS Boto3 Documentation에 있는 내용이지만, 번역이 되어 있지 않았고,

앞으로도 DynamoDB를 사용할 일이 생길 때 Python으로 어떻게 해야 할 지를 나타내고자 할 때에는 이러한 기본 예제를 들어 활용하면 될 것입니다.


하지만 고급 프로그래밍을 하게 되면 이것보다는 훨씬 복잡한 명령어를 작성해야 할 것입니다.

그렇기 때문에 AWS에서는 이를 위한 예제를 별도로 제공하고 있습니다.

Tic-tac-toe라는 Python Application에서 DynamoDB를 사용한 예제를 AWS에서 제공하고 있으니, 향후 DynamoDB 프로그래밍이 필요할 때에는 위에서 다룬 내용을 바탕으로 하고, 예제 문서를 참고하여 프로그램을 개발하면 될 것으로 생각됩니다.


Tic-tac-toe Python Link: https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/TicTacToe.html


이상 글 마치겠습니다.