GDRM

DynamoDB Single Table Design을 위한 Go 라이브러리.
심플하고 직관적인 API로 DynamoDB를 쉽게 다루세요.

코드 플레이그라운드

GDRM의 사용 예제를 확인하세요.

Go

문서

GDRM의 모든 함수와 사용법을 확인하세요.

Client Functions

NewDDB

DynamoDB 클라이언트를 생성합니다.

import (
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb"
    gdrm "github.com/zkfmapf123/gdrm"
)

cfg, _ := config.LoadDefaultConfig(context.Background())
dynamoClient := dynamodb.NewFromConfig(cfg)

client := gdrm.NewDDB(dynamoClient)

AddTable

테이블 설정을 추가합니다. 체이닝 방식을 지원합니다.

client.AddTable("my_table", gdrm.DDBTableParams{
    IsCreate:        true,
    IsPK:            true,
    PkAttributeType: types.ScalarAttributeTypeS,
    IsSK:            true,
    SkAttributeType: types.ScalarAttributeTypeS,
    BillingMode: gdrm.DDBBillingMode{
        IsOnDemand: true,
    },
})

Start

등록된 테이블들을 생성합니다.

ctx := context.Background()

err := client.Start(ctx, true)  // true: 테이블 생성
if err != nil {
    log.Fatal(err)
}

Insert Functions

Insert

단건 아이템을 삽입합니다. PK 중복 시 에러를 반환합니다.

type User struct {
    PK   string `dynamodbav:"PK"`
    SK   string `dynamodbav:"SK"`
    Name string `dynamodbav:"Name"`
    Age  int    `dynamodbav:"Age"`
}

ctx := context.Background()

err := client.Insert(ctx, "my_table", User{
    PK:   "USER#123",
    SK:   "#PROFILE",
    Name: "tom",
    Age:  32,
})

InsertBatch

여러 아이템을 배치로 삽입합니다. 25개씩 자동 분할됩니다.

users := []any{
    User{PK: "USER#1", SK: "#PROFILE", Name: "tom", Age: 32},
    User{PK: "USER#2", SK: "#PROFILE", Name: "jane", Age: 28},
    User{PK: "USER#3", SK: "#PROFILE", Name: "mike", Age: 30},
}

err := client.InsertBatch(ctx, "my_table", users)

Select Functions

FindByKey

PK와 SK로 단건 아이템을 조회합니다.

ctx := context.Background()

item, err := client.FindByKey(ctx, "my_table", "USER#123", "#PROFILE")
if err != nil {
    log.Fatal(err)
}

// MarshalMap으로 변환
user := gdrm.MarshalMap[User](item)

FindByKeyUseExpression

Expression을 사용하여 조건부 조회를 수행합니다.

ctx := context.Background()

items, err := client.FindByKeyUseExpression(
    ctx,
    "my_table",
    100,  // limit
    gdrm.RangeParams{
        KeyConditionExpression: "PK = :pk",
        ExpressionAttributeValues: map[string]types.AttributeValue{
            ":pk": &types.AttributeValueMemberS{Value: "TEAM#DEV"},
        },
    },
)

// begins_with 사용 예시
items, err = client.FindByKeyUseExpression(
    ctx,
    "my_table",
    50,
    gdrm.RangeParams{
        KeyConditionExpression: "PK = :pk AND begins_with(SK, :sk)",
        ExpressionAttributeValues: map[string]types.AttributeValue{
            ":pk": &types.AttributeValueMemberS{Value: "USER#123"},
            ":sk": &types.AttributeValueMemberS{Value: "ORDER#"},
        },
    },
)

Marshal Functions

MarshalMap[T any]

DynamoDB 결과를 지정한 타입으로 변환합니다.

ctx := context.Background()

item, _ := client.FindByKey(ctx, "my_table", "USER#123", "#PROFILE")

// 제네릭을 사용한 타입 변환
user := gdrm.MarshalMap[User](item)

fmt.Println(user.Name)  // "tom"
fmt.Println(user.Age)   // 32

MarshalMaps[T any]

여러 DynamoDB 결과를 지정한 타입 슬라이스로 변환합니다.

items, _ := client.FindByKeyUseExpression(...)

// 배열 결과 변환
users := gdrm.MarshalMaps[User](items)

for _, user := range users {
    fmt.Printf("%s: %d세\n", user.Name, user.Age)
}

설치 방법

1

Go 모듈 설치

go get github.com/zkfmapf123/gdrm
2

코드에서 import

import gdrm "github.com/zkfmapf123/gdrm"