public void FindUserInfoQuest()
{
    var request = new QueryRequest
    {
        TableName = "user_quest_table",
        // KeyConditionExpression = "userId = USER#imjae and BEGINS_WITH(questId, 'QUEST#m_materials')",
        KeyConditionExpression = "userId = :uid and begins_with(questId, :qib)",
        ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
            {":uid", new AttributeValue { S =  "USER#imjae" }},
            {":qib", new AttributeValue { S =  "QUEST#m_materials" }}
        }
    };

    client.QueryAsync(request, (result) =>
    {
        if (result.Exception != null)
        {
            Debug.LogException(result.Exception);
            return;
        }

        foreach (var item in result.Response.Items)
        {
            PrintItem(item);
        }
    });
}

아래와 같이 user_quest_table의 partition key 와 sort key의 조건에 해당하는 데이터를 가져오는 로직이다.

스프링 프레임워크에서 MyBatis 를 사용할 때 인자를 받는 느낌으로 Key조건을 줄수가 있었다.

Untitled

예시 퀘스트 테이블인데 User#imjae에 해당하는 questId가 m : 메인퀘스트이고 materials : 재료가 필요한, 01-03 퀘스트 넘버 의 퀘스트 리스트가 있고, isCleared는 해당 퀘스트를 완료했는지에 대한 값을 나타낸다.

private void PrintItem(Dictionary<string, AttributeValue> attributeList)
{
    string t = null;
    foreach (var kvp in attributeList)
    {
        string attributeName = kvp.Key;
        AttributeValue value = kvp.Value;

        t +=
        (
            "\n" + attributeName + " " +
            (value.S == null ? "" : "S=[" + value.S + "]") +
            (value.N == null ? "" : "N=[" + value.N + "]") +
            ("BOLL=[" + value.BOOL + "]") +
            (value.SS == null ? "" : "SS=[" + string.Join(",", value.SS.ToArray()) + "]") +
            (value.NS == null ? "" : "NS=[" + string.Join(",", value.NS.ToArray()) + "]")
        );
    }
    Debug.Log(t);
}

와 같이 로그를 찍었고, 데이터가 알맞게 나오는 것을 확인할 수 있다.

Untitled