SlideShare a Scribd company logo
1 of 14
Download to read offline
Go言語で色々試行錯誤して
フレームワークもどきを作ってみた話
LT Lovers 4th @ アイスタイル様
2018 / 06 / 26
Fumiya Sakai
自己紹介
・酒井 文也 (Fumiya Sakai)
・Designer → ServerSide Engineer → AppDeveloper
Accounts
・Facebook: https://www.facebook.com/fumiya.sakai.37
・Twitter: https://twitter.com/fumiyasac
・Github: https://github.com/fumiyasac
・Qiita: https://qiita.com/fumiyasac@github
Who are you?
Library (Personal)
【本職: Swiftを書いているiOSエンジニアです】
Golang歴は浅い(1ヶ月)です
仕事でやっていること :
・ メディカル/ヘルスケア系の新規アプリの開発
や保守全般(2本)
・ iOSアプリに関わるお仕事全般の担当&ポジショ
ンはサッカーで例えるならDFに該当。
何卒お手柔らかによろしくお願いします😓
このトピックスを選んだ理由
以前に一度触ってみようと思ってほったらかしていたGo言語に思い切って挑戦
当初に抱いていた勝手なイメージ:
・�文法が今まで扱ってきた言語と勝手が思いっきり違いそう
・�ClassやGenericsがないから面倒くさそう
・�でも慣れるとAPIとかバッチ処理はシンプルに書けそう
Server Side (Ruby & PHP)
Client Side (Swift & ReactNative)
そうは言うてもやってみないと何も始まらんやん!
初めはGo言語自体に恐れを感じていた
と同時にGo言語自体に憧れを感じていた
・�自分のエンジニア友達の界隈でもよく聞くから楽しそう
まずは基本からしっかりとやってみる
一旦はさらっと流して全部読む
まずは何と言ってもA Tour of Goを眺める + 既存の教材からスタートしてみる
充実してるがゴツい…
・ 章立てはしっかりしているが必要そうなところ
だけをうまくかいつまんで進める
・ 基本的な文法の理解は書いていく上でのいち
ばん大切な部分なのでしっかりと進める
ただやっぱり基本だけでは何か物足りない
そうだ、アプリのサーバーサイドのAPI部分を実装してみようと思い立つ
一番最初の設計方針
ぶつかった壁と問題
これまで嗜んだもの一覧
・�Go言語 + MVCパターンでCRUDができるAPIをつくる方針
・�便利なパッケージはなるべく使って試しながら進めていく
初めは触りなれたMVCパターンに当てはめてみては?
・�ModelとControllerに分類しにくい機能はどうしよう…
・�Structの整理をどうしよう…
強引にそれっぽくしてみたものの個人的にものすごい違和感
・ CakePHP / CodeIngiter / Laravel / Symfony
PHP
・ Ruby on Rails / Sinatra
Ruby
・ そもそもiOSのアーキテクチャはMVCパターン
iOS (Swift)
悪い意味で囚われ過ぎてしまったか…?
CRUD操作のDEMOを行います
サンプルリポジトリ
・Githubサンプル (まだまだ機能追加の試行錯誤中です…)
https://github.com/fumiyasac/SampleApiOfGo
コンソール経由での操作デモを行います
そうだ、アプリのサーバーサイドのAPI部分を実装してみようと思い立つ
今回のサンプルで導入したパッケージの一覧
パッケージ名 パッケージの機能概要
dep  パッケージの依存関係の管理をするために用いる
goose MySQLをはじめとするデータベースのスキーマ定義を管理するために用いる
swag
 GodocからSwaggerによるAPI定義書の書き出しをするために用いる
gin-swagger(/swaggerFiles) Ginを利用した構成の際に上記の処理ができるようにするために用いる
パッケージ名 パッケージの機能概要
Gin ルーティング(APIのエンドポイント)に関する設定をする際に用いる
xorm MySQLをはじめとするデータベースのデータ操作用のORMapper
bcrypt パスワード等をハッシュ化する際に用いる
まだ機能がほとんどないので諸々の検証も含めて試しています
アプリケーションの構築に関するパッケージ
便利ツール&運用保守に関するパッケージ
基本的な概要設計
下記のような構成でざっくりと役割ごとに分けて考えてみる
main.go
Interface
controller
・ Routing / EndPoint
repository
validator factory MySQLentity
constants middleware database
アプリケーションのサポートに関する部分
mapping
アプリケーションのロジック部分
リクエスト処理部分&ロジック部分
・ Business Logic / API Response
今回のサンプルでの階層構造の概要
パッケージ名 パッケージの機能概要
constants どこでも使うような定数値やenumのような形で使いたいものを格納する。
controllers エンドポイントからのリクエスト/レスポンスに関わるものを格納する。
database 接続するデータベース(ORMの接続設定やMigraion関連)に関わるものを格納する。
entities 接続しているテーブルのDBスキーマ定義と構造体を格納する。

factories APIレスポンス形式の雛形となる構造体を格納する。
middleware [機能作成中...]全体もしくは一部の処理で共通して必要な前後処理を割り込ませる。
repositories APIレスポンスを構築するためのロジックに関わるものを格納する。

static HTMLやCSS等の静的ファイルに関わるものを格納する。

作成中...]全体もしくは一部の処理で共通して必要な前後処理を割り込ませる。続する
validators APIレスポンスを構築するためのロジックに関わるものを格納する。

main.go 主にここではエンドポイントの管理を担当している。

作成中...]全体もしくは一部の処理で共通して必要な前後処理を割り込ませる。続する
まだ機能がほとんどないので諸々の検証も含めて試しています
アプリケーションの実行に関するものの一覧
実装部分のコード例(1)
Controller部分ではJSONを作成する形にし、具体的な処理や整形はRepositoryに集約
func (ctrl UserController) GetUsers(c *gin.Context) {
    userRepository := repositories.NewUserRepository()
    userData, fetchResult := userRepository.GetLists()
    if fetchResult != true {
        errorMessage := factories.APIErrorMessageFactory{
            Message: constants.ErrorMessageOfUserNotFound,
        }
        c.JSON(http.StatusBadRequest, errorMessage)
        return
    }
    c.JSON(http.StatusOK, userData)
}
Controller〜Repository側の処理例: 登録ユーザーの一覧を表示する
// UserRepository ... interfaceの宣言
type UserRepository interface {
    GetLists(id int) (factories.SingleUserFactory, bool)
…
}
・ リクエストをいい具合に加工してレスポンスを返却
controller
// GetLists ... ユーザー一覧情報を取得する
// @GET("api/v1/users")
func (repo UserRepository) GetLists()
(factories.UserItemsFactory, bool) {
    … MySQLからユーザーの一覧情報を取得する
    return userItemsFactory, true
}
repository
controller
ControllerのActionをシンプルに
実装部分のコード例(2)
Factory部分でレスポンス時の表示内容を定義し、DB操作はEntityで行う
// GetByID ... 引数のidに該当するユーザー情報を取得する
// @GET("api/v1/users/:id")
func (repo UserRepository) GetByID(id int) (factories.SingleUserFactory, bool) {
    var user = entities.User{}
    var userFactory factories.SingleUserFactory
    result, _ := engine.Where("id = ?", id).Get(&user)
    if result {
        userFactory = factories.SingleUserFactory{
            ID: user.ID,
            Username: user.Username,
            MailAddress: user.MailAddress,
            Password: user.Password,
            UserStatus: “登録済",
            CreatedAt: user.CreatedAt,
            UpdatedAt: user.UpdatedAt,
        }…
// User ... 登録されているユーザー情報用の構造体
type User struct {
    ID int `xorm:"'id'"`
    Username string `xorm:"'username'"`
    MailAddress string `xorm:"'mailaddress'"`
    Password string `xorm:"'password'"`
    StatusCode int `xorm:"'status_code'"`
    CreatedAt time.Time `xorm:"'created_at'"`
    UpdatedAt time.Time `xorm:"'updated_at'"`
}
entity
factory
repository
Username string `json:"username" example:"samplename"`
型とサンプル値をまとめたStruct
Tableのカラム名
運用・これからの管理にも役立ちそうなパッケージを探す
他のフレームワークでも利用しているような便利なツールの活用と検証
他のFWでもあるもの
・�DatabaseのマイグレーションとDB構造の管理
・�利用しているパッケージ(ライブラリ)と依存性の管理
平素のRailsやiOS開発でも活用しているものの代表的な例
・(参考)	SwaggerでRESTful	APIの管理を楽にする

https://qiita.com/disc99/items/37228f5d687ad2969aa2
※ ここではSwaggerのボトムアップ形式の開発
Swaggerを試してみる
Goose (Database migration)
dep (Package dependencies)
Controllers/Factories等のファイルに
GoDoc形式で記載されたコメント
・ goファイルのコメントからAPI定義書の作成
・ SwaggerUIドキュメントの閲覧や更新が容易
Gin + swagを利用したSwaggerでのAPI定義書作成
// GetUsers godoc
// @Summary ユーザー一覧を表示する
// @Description userテーブルに登録されているデータを全件取得する
// @Accept json
// @Produce json
// @Success 200 {object} factories.UserItemsFactory
// @Failure 400 {object} factories.APIErrorMessageFactory
// @Router /users [get]
// SingleUserFactory ... JSONにマッピングする構造体の宣言
type SingleUserFactory struct {
    ID int `json:"id" example:"1"`
    Username string `json:"username" example:"samplename"`
    MailAddress string `json:"mailaddress" example:"sample@example.com"`
    Password string `json:"password" example:"(crypted strings...)"`
    UserStatus string `json:"status" example:"有効"`
    CreatedAt time.Time `json:"created_at" example:"2018-05-15T12:59:09+09:00"`
    UpdatedAt time.Time `json:"updated_at" example:"2018-05-15T12:59:09+09:00"`
}
EndPointのRequest/Response等
Factoryに「example: “サンプル値”」と定義する
ことで各エンドポイントでのパラメーター欄やデー
タの構造部分の凡例を表示できるので便利です!
取りうる値の例やデータ定義
レスポンスのjson構成の部分をFactoryに切
り出す構造にすることで扱いやすくすると同時
にSwaggerとの連携もしやすくする。
まとめ
なんだかんだで親しみやすかった&パッケージの充実ぶりがありがたかった
1. 複数のパッケージをうまく組み合わせる & シンプルな感じが個人的に好きになった
2. 実装だけではなく運用や管理ツールに関するパッケージ
・とりあえずすぐに動かして試すところまでが、パッケージを組み合わせるだけ実現できた
・Structの扱いや文法の部分はこれまで親しんできた言語とは勝手が違うので、この部分は最初ものすごいハマった
・これまで親しんできたフレームワークで導入してきたライブラリやツールに近いものもあった
・特にコード内のGoDocを元にSwaggerでのAPI定義書の書き出しができるライブラリがエエ感じで驚きました!
今回の登壇内で紹介したサンプルに関しましては、今後も鋭意開発&運用を続けていく所存です😅 😅 😅
・文法は少し今まで親しんできた言語とは異なるもの、慣れればシンプルで結構書きやすく感じた

More Related Content

Similar to Go言語で色々試行錯誤して フレームワークもどきを作ってみた話

動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
Fumiya Sakai
 

Similar to Go言語で色々試行錯誤して フレームワークもどきを作ってみた話 (20)

最近の業務やAndroid関連のインプットと振り返り
最近の業務やAndroid関連のインプットと振り返り最近の業務やAndroid関連のインプットと振り返り
最近の業務やAndroid関連のインプットと振り返り
 
少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発
 
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
 
2022年の抱負とここ数年続けてきたインプット
2022年の抱負とここ数年続けてきたインプット2022年の抱負とここ数年続けてきたインプット
2022年の抱負とここ数年続けてきたインプット
 
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞくレイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
 
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
 
iOSアプリで気になった動きや表現を上手にアレンジして活用してみる
iOSアプリで気になった動きや表現を上手にアレンジして活用してみるiOSアプリで気になった動きや表現を上手にアレンジして活用してみる
iOSアプリで気になった動きや表現を上手にアレンジして活用してみる
 
Approach of Prototyping for making Application User Interface about iOS
Approach of Prototyping for making Application User Interface about iOSApproach of Prototyping for making Application User Interface about iOS
Approach of Prototyping for making Application User Interface about iOS
 
アプリ開発におけるテキスト装飾のアイデア集
アプリ開発におけるテキスト装飾のアイデア集アプリ開発におけるテキスト装飾のアイデア集
アプリ開発におけるテキスト装飾のアイデア集
 
まずはできるところから始める UnitTestとテストができる実装について
まずはできるところから始める UnitTestとテストができる実装についてまずはできるところから始める UnitTestとテストができる実装について
まずはできるところから始める UnitTestとテストができる実装について
 
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめできるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
 
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒントiOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
 
メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察
 
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
 
スグにできる!Microsoft Flow でこんな連携あんな連携
スグにできる!Microsoft Flow でこんな連携あんな連携スグにできる!Microsoft Flow でこんな連携あんな連携
スグにできる!Microsoft Flow でこんな連携あんな連携
 
UIを作る際にライブラリにする? それともDIYする?の切り分け(僕の見解)
UIを作る際にライブラリにする? それともDIYする?の切り分け(僕の見解)UIを作る際にライブラリにする? それともDIYする?の切り分け(僕の見解)
UIを作る際にライブラリにする? それともDIYする?の切り分け(僕の見解)
 
SharePoint と Yammer
SharePoint と YammerSharePoint と Yammer
SharePoint と Yammer
 
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介
 
mROSをクラウド/仮想環境に連携させてみる
mROSをクラウド/仮想環境に連携させてみるmROSをクラウド/仮想環境に連携させてみる
mROSをクラウド/仮想環境に連携させてみる
 
RxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップRxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップ
 

More from Fumiya Sakai

既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
Fumiya Sakai
 

More from Fumiya Sakai (14)

RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために
 
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwiftMeasures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
 
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
 
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
 
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察するUIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
 
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
 
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
 
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
 
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
 
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
 
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
 
Hint of a little ingenuity about UI.
Hint of a little ingenuity about UI.Hint of a little ingenuity about UI.
Hint of a little ingenuity about UI.
 
書籍執筆からの今後に向けてのロードマップ
書籍執筆からの今後に向けてのロードマップ書籍執筆からの今後に向けてのロードマップ
書籍執筆からの今後に向けてのロードマップ
 

Recently uploaded

Recently uploaded (7)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

Go言語で色々試行錯誤して フレームワークもどきを作ってみた話