Go言語のWebフレームワークBeegoを使って良かったこと

こんにちは[@scrpgil](https://mobile.twitter.com/scrpgil)です

Go言語製のWebフレームワークBeegoを知っていますか？BeegoはフルスタックなWebフレームワークです。Githubのスター数はGo製のWebフレームワークでは一番多い数字です（2017年まで）。私もかれこれ1年以上利用しています。

しかし、日本ではあまりBeegoを使っているという話は聞きません。なので、今回は私がBeegoを**使ってここが良かった！**と思ったことを記事にしました。


# Beegoの紹介
改めてBeegoの紹介です。BeegoはフルスタックはWebフレームワーク。フルスタックということもありルーティング、ORM等が提供されています。

Beegoは主に以下のような特徴があります。
* MVCモデル
* Viewを必要としないAPIモードもある
* ORMあり
* 早い・軽い
* CLIツールがある

以下はリンクです。
[公式HP](https://beego.me/)
[Github](https://github.com/astaxie/beego)

# 使ってよかったこと

## １．いい塩梅なフルスタック具合
Beegoはフルスタックなフレームワークですが、よくある黒魔術連発のフレームワークという感じではありません。
提供されているのはルーティングやORM、ロガー等のわりと定型的な処理のみです。そして、それらがいい感じにモジュール化されています。

なので、例えばORMはgormを使いたいといった場合でも導入に支障はあまりありません。もちろんコードの再利用もしやすいです。私もBeegoからGAE/Goへの乗り換えも行ったことがありますが、作り直しといった感じではなく、大部分のソースコードを流用することができました（もちろん逆もしかり）

## ２．CLIツールがある
フレームワークに手を出す際に地味に嬉しいのがCLIツールの存在です。Beegoにも専用のCLIツールがあります。

[beego/bee](https://github.com/beego/bee)

このCLIツールが煩わしい作業をだいぶ肩代わりしてくれます。

<img width="636" alt="Screen Shot 2018-07-20 at 0.29.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/165335/c179d85b-af46-6381-d976-895c6dc9497e.png">

特にプロジェクト生成のbee new(または、bee api)は簡単なサンプルつきですのでそのコードを読めばどのように書けばBeegoでアプリが作れるかわかるようになると思います。

珍しい所でいうとdockerizeコマンドなんてものもあります。これはBeego用のDockerfileを生成してくれるコマンドですが、私はこのコマンドで生成したDockerfileを読むことでDockerを使うきっかけになりました。感謝...！

## ３．LiveReloadが嬉しい
BeegoはCLIツールで起動すればソースコードの変更検知をして勝手にLiveReloadされるようになります。また、コンパイルもGoだから早い。これがコンパイル言語かよ！と言いたくなります。
しかも、コンパイル時につまらないタイポに気づかせてくれるので劇的にコーディングミスが減ると思います。私も経験上コンパイルが通るようになれば9割方上手く動いてる印象です。

<img width="867" alt="Screen Shot 2018-07-20 at 0.36.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/165335/37499253-7eee-3564-f510-53e7c887dbc5.png">


## ４．ルーティングの記述が楽
APIモードに限った話ですがBeegoはルーティングの記述が少し特殊です。ざっくりいうとBeegoのルーティングの記述はdoxygenライクな記述になります。画像の赤線の部分がそれ。

<img width="503" alt="Screen Shot 2018-07-20 at 0.47.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/165335/91514d6f-3df0-201f-c2db-8affd6c2a02b.png">

赤線で書いておくと自動的にルーティングが実装されます。始めて見るとなかなかぎょっとする方法な気もします。

<img width="633" alt="Screen Shot 2018-07-20 at 0.49.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/165335/5e0d843b-1ad2-e1e6-cf63-c1f1e9ab81d3.png">

それでもControllerの関数とルーティングの記述が一対になっているのは極めてシンプルだと思います。基本的に1対1の関係であるため一つのControllerのソースコードでエンドポイントの情報も確認できるのはそれはそれで便利ですし、新しいエンドポイントをはやしたいときも基本関数まるごとコピペでいけるので楽です。

## ５．Swaggerが自動生成される
Beegoのルーティング記述方法はDoxigenライクな記述ですが、ずばりその記述に合わせてSwaggerが自動生成されます。

<img width="1075" alt="Screen Shot 2018-07-22 at 16.29.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/165335/5ef59dbb-e67d-092d-e6aa-3860a291e335.png">

Swaggerが自動生成されるのでクライアント側の実装がなくても比較的楽にAPIのテストができます

## ６．O/Rマッパーが標準装備
BeegoはDjangoライクなO/Rマッパーがついてきます。基本的に、構造体に記述したアノテーションを元にテーブルが生成されます。これでDBとコード間で整合性がとりやすいです。
また、テーブルのフィールド情報もGoのコードを読むだけで良いのでコードリーディングの作業がはかどります。

```golang

// Model Struct
type User struct {
    Id   int
    Name string `orm:"size(100)"`
}
```

使い方も公式ドキュメントが充実しているのでここを見れば十分でしょう。
[ORM Usage](https://beego.me/docs/mvc/model/orm.md)
[CRUD Operations](https://beego.me/docs/mvc/model/object.md)

もちろんO/Rマッパーもモジュール化されているのでgorm使いたい人はそれを使っても良いです。

## ７．バイナリサイズが小さい
BeegoというかGo言語の恩恵ですが出来上がったバイナリサイズが小さいです。数10Mbぐらいなので、BeegoのDockerイメージのサイズも小さくできます。Dockerイメージのサイズが小さいと立ち上がりも早くなるし、各種Dockerイメージのホスティングサービスの利用料も安くなるのでいい事たくさんです。

# まとめ
今回、Beegoについて良かったところをまとめました。いかがでしたでしょうか？個人的によかったところをまとめられたかと思います。

昨今のGo言語のサーバー側まわりですが、印象としてはecho、ginを使用されている方が多い印象です。また、上級者になればなるほど標準のnet/httpライブラリで十分という声も聞きBeegoの名を聞くことはあまりありません。

しかし、**「Go言語を触ってみたい + WebAPIを書きたい」**という要求を同時に満たすためにBeegoは良い出発点になるんじゃないかと思います。あとから別に乗り換えるときもそこまで苦労しないんじゃないかと思います（ただしORM周りを除く...）
この記事を読んで興味を持ったなら是非ともBeegoを使ってみてください。よろしくお願いします。

[Beego](https://beego.me/)