Go

Go gorm mysql の構成でデッドロックに立ち向かう ~retry処理, retry-go~

Go

Go gorm mysql の構成でデッドロックに立ち向かう ~retry処理, retry-go~

Go言語の振り返り

Go

Go言語を使い出してもうすぐ一年が経ちます。 この機会にGo言語の振り返りをしたいと思います。 Go言語のメリット Goを学習して感じたメリット 可読性が高い gofmtが世界標準になっていて、プロジェクト毎に設定する必要がない 標準パッケージが充実している…

GraphQL vs OpenAPI スキーマ駆動開発比較

今回はGraphQLとOpenAPIの開発を比較していきたいと思います。 筆者は本業のプロジェクトでGraphQLを、副業でOpenAPIを使用しています。 アプリケーション開発時にどちらを選定するか迷っている方の参考になれば幸いです。 使用技術概要 GraphQL OpenAPI バ…

DaynamoDB を学習した時の記事、詰まった箇所

2022年の1月から副業業務委託としてtoB SaaSの開発をお手伝いさせて頂いています。 以下の技術スタックで開発してます。 Go DynamoDB OpenAPI3 DynamoDB, OpenAPIは初めて触る技術でした。 新しい技術のキャッチアップはかなり負荷のかかる学習ですが、同時…

goldie でAPIテスト Go Golang goldie その1

今回はgoldieというライブラリを使ったGolden testを実装していきます。 Golden Test Goleden Testとは .golden拡張子のファイルにAPIの結果(jsonなどを)保持しておき、テスト時に出力結果に変更がないかを比較するテスト手法です。 goldie goldieはGo言語用…

Go logLevel設計 logrus echo

今回はGo言語でログ出力を実装します。 Go言語には標準でlog パッケージがありますが、今回はよりリッチな logrus を使ったログ設計を行なっていきます。 レベル設計 ログをレベル単位で分けることでバグの検出を容易にするだけでなく、特定のレベルが出力さ…

Go CSV download API

今回はGo製のAPIでCSVをダウンロードする方法を見ていきたいと思います。 普段はGraphQLについて発信していますが、今回はRestで実装し、"encoding/csv"パッケージなどメイン機能部分のみ解説していきます。 ルーター Restなのでまずはルーティングを作りま…

Go time.Timeの扱いで学んだこと

今回は本業で開発しているGoのAPIで時刻の概念をドメインとして扱ったのでその時に学んだことを復習したいと思います。 TL;DR 要件はDateTimeのような日付ではなく、時刻のみを扱い比較した結果に応じてビジネスロジックを振り分けるようなイメージです。 以…

DDDことはじめ ~アプリケーションサービス~

前回の続きです。 今回はDDDのサービスについて振り返りたいと思います。 shikatech.hatenablog.com アプリケーションサービス 前回に続きこちらの記事からコードを引用します。 How to Implement Domain-Driven Design (DDD) in Golang | by Percy Bolmér |…

DDD ことはじめ ~値オブジェクト・集約・エンティティ・ファクトリ~

今回は以前から気になっていたDDDの技術書とGo×DDDの実装記事を読んだので振り返りをします。 今回読んだ書籍と記事は以下です。 本: ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本 記事: towardsdatascience.com 尚、DDDの概念や思想…

Go × GitHub Actions CI構築 ~ MySQL・Redis docker-compose 別リポジトリをGit clone する~

今回はGitHub ActionsでGoのAPIサーバーのCI構築を行いたいと思います。 GitHub Actionsのチュートリアル的な部分には触れませんのでご留意ください。 TL;DR 以下の構成でCI構築を行います。 CIはdocker-composeを使用する docker-composeのある親ディレクト…

Gin echo corsのオリジンをHttp Request から取得する

Go, Golang の echo, Gin それぞれのフレームワークでHTTP Headerのmiddlewareをカスタマイズ(custom)する方法 Http Request から Originを取得する方法

GraphQL APIエラー Go gqlgenで実装

今回はGraphQLのエラーについて復習してみました。 また、簡単ではありますがgqlgenを使ってカスタムエラーを実装してみたいと思います。 GraphQLのエラーハンドリングについては "GraphQL エラー" で検索するとトップにヒットするこちらの記事が大変分かり…

GraphQL Subscriptionを Redis KeySpaceで実装する ~その2~

今回は 前回に続き GraphQLのSubscriptionをRedisのkeyspace notificationを使って実装していきたいと思います。 前回はkeyspaceの概要編でしたが今回は実践編です。 以下の技術を使用します。 - Go - gqlgen v0.13.0 - go-redis v8 今回実装する機能 今回は…

Go GraphQL AWS S3への画像アップロード

今回はGraphQLで画像のアップロードを行なっていきたいと思います。 アップロード先のストレージにはAWSのS3を使用します。 尚、この記事ではS3のバケットポリシーやAWS関連については深掘りしません、aws-sdk-go-v2 というGoのaws-sdkを使用しますがコード…

Go GraphQl Redis PubSub でリアルタイムチャット (gqlgen websocket)

今回は色々なWebサービスで見かけるチャットアプリケーションのバックエンドサーバーを構築していきたいと思います。 様々な技術を使用しますが、主にGoとgo-redisを用いた実装に着目します。 Redis PubSub RedisのPub/SubはRedisの主要機能の一つです。 あ…

gqlgen directive @goField と Global Object Identification

今回はgqlgenの機能を使って Relayの仕様であるGlobal Object Identificationの実装を行なっていく。 Global Object Identificationとは GraphQLのクライアントライブラリRelayで定められたIDフィールドの実装方法。 relay.dev ざっくりとした説明は 全スキ…

GraphQL ページネーション Go gqlgen

GraphQLの必須項目ページネーションの実装方法を理解する。 使用技術 Go1.13 × gqlgen v0.13.0 ページネーションとは APIのクエリを制限する方法。 返却するデータの量を制限する事ができる。 クエリの負荷を事前に計算できる。 GraphQLのページネーション G…

Go 埋め込み

きっかけ こちらの記事でクリーンアーキテクチャを勉強していたときに埋め込みについてさらっと使用されていたので自分なりに深堀ってみた。 https://qiita.com/hirotakan/items/698c1f5773a3cca6193e type UserRepository struct { SqlHandler } func (repo…

Go migrateion goose setup

Goのマイグレーションツール goose bitbucket.org Go製のmigration ツールでは人気のある方? 業務でも採用されていたので使ってみました。 情報にバラつきがありセットアップまでに時間がかかりました。 goose bitbucket版 と github版があります。 github…

Go API開発の環境構築 テンプレート アーキテクチャ、ホットリロード、ロギング、Docker

GoでAPIを作るときのテンプレです。 ホットリロード、ロギング、コンテナ、DB、まとめて構築していきます。 以下の技術を使用します。 Docker docker-compose ホットリロードライブラリair https://github.com/cosmtrek/air フレームワークgin https://githu…