Goのフレームワーク“Revel”を触ってみた

この記事はeureka Engineering Advent Calendar 2017 12日目の記事です。
昨日は香取さんSlackでバックオフィスのFAQ対応を自動化した(い)話でした。

はじめに

こんにちは!エウレカwebエンジニア新卒の鈴木康文(こうや)です。
普段はGo言語を書いています。Tech Blogは初めて書きます!
eurekaではginをbaseにした自社マイクロフレームワークを採用しているのですが、個人ではRuby on Railsをつかっていた経験があり、
Goでも似た様なフルスタック型のフレームワークはないかと探していたらRevelというフレームワークを見つけたので、
実際にコードを交えながら紹介してみたいとおもいます。

Revelの特徴


https://github.com/revel/revel

Revelにはwebアプリケーションに必要な機能は大体揃っています。

  • ルーティング
  • Webテンプレート
  • DBアクセスのためのライブラリ
  • セッション管理

自動的にコンパイルを実行できたり、devモードの実行で簡単にデバックができたりします。

Revelってどういう意味?

  • 大いに楽しむ
  • 酒盛り
  • お祭り騒ぎ

最高ですね。

環境

  • mac OS X
  • go 1.7.5 darwin/amd64
  • Revel v0.18.0

手順

1.Goのバージョン確認
2.Revelのインストール
3.localhost:9000にアクセス
4.簡単なAPI作成

Goのバージョン確認

Revelが対応しているGoのバージョンは1.6以上なので確認します

1
2
$ go version
go version go1.7.5 darwin/amd64

Revelのインストール

1
2
$ go get github.com/revel/revel # revel framework を取得
$ go get github.com/revel/cmd/revel # revel command を取得
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ revel help
~
~ revel! http://revel.github.io
~
usage: revel command [arguments]
 
The commands are:
 
    new         create a skeleton Revel application
    run         run a Revel application
    build       build a Revel application (e.g. for deployment)
    package     package a Revel application (e.g. for deployment)
    clean       clean a Revel application's temp files
    test        run all tests from the command-line
 
Use "revel help [command]" for more information.

上記の結果になっていればインストールできています。

アプリケーションの作成

1
2
3
4
5
6
7
8
9
10
$ cd $GOPATH
$ revel new myapp
~
~ revel! http://revel.github.io
~
Your application is ready:
    $HOME/Development/Go/src/myapp
 
You can run it with:
    revel run myapp

実行

1
2
3
4
5
6
7
8
9
$ revel run myapp
DEBUG 21:45:06  revel  server.go:27: RegisterServerEngine: Registered engine   section=server name=go
~
~ revel! http://revel.github.io
~
Trying to build with revel/ (0x0,0x0)
(省略)
istening on.. localhost:51576
INFO  21:45:07  revel harness.go:190: Listening on :9000

http://localhost:9000/にアクセスして

動きました。

Hello World!の出力

app/controlers/app.goを開き
下記の様に変更します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package controllers
 
import (
    "github.com/revel/revel"
)
 
type App struct {
    *revel.Controller
}
 
func (c App) Index() revel.Result {
    text := "Hello Wordl!"
    return c.Render(text)
}

次にapp/views/App/Index.htmlを開き編集します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{{set . "title" "Home"}}
{{template "header.html" .}}
 
<header class="jumbotron" style="background-color:#A9F16C">
  <div class="container">
    <div class="row">
      <h1>{{ .text  }}<h1>
      <p></p>
    </div>
  </div>
</header>
 
<div class="container">
  <div class="row">
    <div class="span6">
      {{template "flash.html" .}}
    </div>
  </div>
</div>
 
{{template "footer.html" .}}

表示される文字がHello Wordl!に変更されます。


簡単なAPI作成

次に簡単にAPIを作成してみます
・GET(引数なし)
・GET(引数あり)

GET(引数なし)

routeの設定

conf/routesを開き、下記の様に修正します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Routes Config
#
# This file defines all application routes (Higher priority routes first)
#
 
module:testrunner
# module:jobs
 
 
GET     /                                       App.Index
GET     /hoge                                   App.Hoge    //新しく追加
 
# Ignore favicon requests
GET     /favicon.ico                            404
 
# Map static resources from the /app/public folder to the /public path
GET     /public/*filepath                       Static.Serve("public")

Controllerの処理を追記

app/controlers/app.goに処理を追記します

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package controllers
 
import (
    "github.com/revel/revel"
)
 
type App struct {
    *revel.Controller
}
 
func (c App) Index() revel.Result {
    text := "Hello World!"
    return c.Render(text)
}
 
func (c App) Hoge() revel.Result {
    type Result struct {
        Message string `json:"message"`
    }
 
    result := Result{
        Message: "hogehoge",
    }
 
    return c.RenderJSON(result)
}

出力結果

1
2
3
{
    "message": "hogehoge"
}

GET(引数あり)

routeの設定

1
GET     /fuga/:number                            App.Fuga    

Controllerの処理を追記

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func (c App) Fuga(number int) revel.Result {
    type Result struct {
        Message string `json:"message"`
        Number  int    `json:"number"`
    }
 
    number = number * 10
 
    result := Result{
        Message: "url/:引数名とすると引数を取れるようになります",
        Number:  number,
    }
 
    return c.RenderJSON(result)
}

出力結果

1
2
3
4
{
    "message": "url/:引数名とすると引数を取れるようになります",
    "number": 2000
}

使ってみて

今回はGoのフレームワークであるRevelを使用して簡単なAPIを作成するところまで行いました。

個人的に良かった点

  • ドキュメントが充実しています
  • デフォルトでi18n対応
  • 充実した debug機能
  • Hot Code Reloadというファイルの変更を監視し再コンパイルしてくれる機能の搭載

まとめ

RailsのようなgenerateコマンドでController、ViewまたはModelを作成するコマンドが用意されていたらもっと楽なのになと。
RevelはHot Code Reloadというファイルの変更を監視し再コンパイルしてくれる機能を搭載しており、viewの更新が多いwebサービスを開発する際は適しているのかと思いました。
ドキュメントが充実していたので開発が取り掛かりやすいと思います。
普段使わないフレームワークを使い、便利なとこも不便なところも知れました。
今後は他のフレームワークも触り、学習を続けていきたいです。


明日は山内さんです!お楽しみに!


エウレカでは、一緒に働いていただける方を絶賛募集中です。募集中の職種はこちらからご確認ください!皆様のエントリーをお待ちしております!

Recommend

いますぐ始める高負荷対策

Go+App Engine+Cloud SQLで始めるGo言語Webアプリケーション開発