Skip to content

Instantly share code, notes, and snippets.

@muroon
Last active January 4, 2022 07:08
Show Gist options
  • Save muroon/7daf23236777991a058544bd01ab9cc0 to your computer and use it in GitHub Desktop.
Save muroon/7daf23236777991a058544bd01ab9cc0 to your computer and use it in GitHub Desktop.
CleanArchitectureをRDBからCloud Spannerに変更

CleanArchitectureをRDBからCloud Spannerに変更

memo_sample_spanner

old/new project DB
old memo_sample MySQL
new memo_sample_spanner Cloud Spanner

Clean Architecture

old_new

主キー

  • tag, memoテーブルの主キーをint⇒string(36)に変更
    • 主キー生成にUUID(v4)を使用するため
    • こちらを参照

Transaction

各トランザクション内でも、シングルアクセス(client.Single())でも開発者は共通のRepository、UseCaseメソッドを使用することができる

  • ReadWriteTransaction内でDBAを使用すれば、ReadWriteTransaction内でクエリが実行される
  • ReadOnlyTransaction内でDBAを使用すれば、ReadOnlyTransaction内でクエリが実行される
  • BatchReadOnlyTransaction内でDBAを使用すれば、BatchReadOnlyTransaction内でクエリが実行される
  • 上記以外で使用すれば、Single()としてクエリが実行される

使用例(ReadWriteTransactionとSingle)

	_, err := i.tx.ReadWriteTransaction(ctx,
		func(ctx context.Context) error {
			_, err := i.memo.Post(ctx, ipt) // ReadWriteTransaction内で登録クエリ発行
			return err
		},
	)
	
	_, err := i.memo.Post(ctx, ipt) // client.Single()で登録クエリ発行

使用例(ReadOnlyTransactionとSingle)

	err := i.tx.ReadOnlyTransaction(ctx, func(ctx context.Context) error {
		memos, tags, err := i.memo.SearchTagsAndMemos(ctx, ipt) // ReadOnlyTransaction内で検索クエリ発行

		// 後続処理
	})
	
	memos, tags, err := i.memo.SearchTagsAndMemos(ctx, ipt) // client.Single()で検索クエリ発行

またRDBとCloud Spannerではトランザクションの種類と接続方法が異なるので、Cloud Spannerに合う形に対応するため下記のような構成にしている

  • old (for RDB)
  • new (for Cloud Spanner)
    • Interface
    • Adapter
    • cloud spannerに則したトランザクションに対応
      • ReadWriteTransaction
      • ReadOnlyTransaction
      • BatchReadOnlyTransaction)
    • 共通処理内でトランザクションClose()を実行するので、Close漏れがない(ReadOnlyTransaction, BatchReadOnlyTransaction)

Repository

ReadWriteTransaction内でwrapped errorsが使用可能になったのでimport

zaganeをかけてみる

こちらに記載

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment