Goを学ぶ　～echoの初期設定～ part2

## 目標
echoのインストールから初期設定からサーバーの起動までを行う
DBからの取得は次回に実施する

## echo
GoのWebフレークワークの１つ
WebフレームワークとしてはGinが有名ではあるが、近年は注目を集めている様子がある。
スター数などは全然Ginのほうが圧倒的な状況でもある。
採用理由は、ベースの使い方は同じなのでトレンドっぽさで選択した。

参考: https://go.libhunt.com/compare-gin-vs-echo

## echoを導入する
利用環境についてはこちら
https://qiita.com/dsricekun/items/33968201abdc2992671d

#### STEP1 echoモジュールを取得
コンテナ内でモジュールを取得する
```
go get github.com/labstack/echo/v4
```

#### STEP2 サーバー起動設定
サーバー起動したときにポートに1323番を使用するのでdocker-compose.ymlを見直す
```
version: '3'
services:
  go_echo:
    container_name: go_echo
    build:
      context: ./echo/
    volumes:
      - ./echo:/go/src/app
    tty: true
    environment:
      - TZ=Asia/Tokyo
    ports:
      - 1323:1323

  go_echo_db:
    image: mysql:5.7
    container_name: mysql_host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: echo
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./database/data:/var/lib/mysql
    ports:
      - 3306:3306
```

今までの構成に新しくmain.goを追加する
```
tree.nathanfriend.io
What is this?
database
echo
  main.go(new)
  go.mod
  Dockerfile
docker-compose.yml
database
echo
  main.go(new)
  go.mod
  Dockerfile
docker-compose.yml
.
├── database
├── echo/
│   ├── main.go(new)
│   ├── go.mod
│   └── Dockerfile
└── docker-compose.yml
```

main.goはechoのチュートリアルに従って次の実装をする
```
package main

import (
	"github.com/labstack/echo/v4"
	"net/http"
)

func main() {
	server := echo.New()
	server.GET("/", func(ctx echo.Context) error {
		return ctx.String(http.StatusOK, "Hello, World")
	})

	server.Logger.Fatal(server.Start(":1323"))
}
```
コンテナ内でサーバー起動を行う
```
コマンド
go run main.go
```
実行結果はこちら
```
/go/src/app # go run main.go

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.10.2
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:1323
```
出力が確認できたらブラウザから「http://localhost:1323 」にアクセスする
正常に設定できていたら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688298/312a5347-5a1b-4457-8a21-52f0fd664f9b.png)
の出力確認ができる。

出力確認ができたらechoの導入は成功になる

## echoを触っていくための構成を少し整理
本格的な構成は仕様を整理してからになるが、さすがにあまりイケていないので構成を整理する
ここからはechoファルダ内のみの構成を記載する。
全体図が気になる方はgithubのアクセスURLを記載するのでそちらを見てください。
URL： https://github.com/dsrice/go_echo/tree/part2

```
.
├── controllers/
│   └── hello.go
├── infra/
│   └── server.go
└── main.go
```
各役割を説明すると
<dl>
    <dt>controllersディレクトリ</dt>
    <dd>EPの実処理にあたるコントローラー置き場</dd>
    <dt>hello.go</dt>
    <dd>暫定で用意するコントローラー　controllersパッケージになるのでファイル名にはcontrollerはつけない</dd>
    <dt>infraディレクトリ</dt>
    <dd>環境関連ファイル置き場</dd>
    <dt>server.go</dt>
    <dd>ルーティングなどサーバーに関する処理をまとめるファイル</dd>
    <dt>main.go</dt>
    <dd>サーバーの起動といった起動処理をまとめるファイル</dd>
</dl>

hello.go
```
package controllers

import (
	"github.com/labstack/echo/v4"
	"net/http"
)

type HelloController struct{}

func NewHelloController() *HelloController {
	return &HelloController{}
}
func (controller *HelloController) GetMessage(ctx echo.Context) error {
	return ctx.String(http.StatusOK, "Hallow World!")
}
```

server.go
```
package infra

import (
	"app/controllers"
	"github.com/labstack/echo/v4"
)

type Server struct {
	Echo *echo.Echo
}

func NewServer() *Server {
	return &Server{
		Echo: echo.New(),
	}
}

func (server *Server) Start() {
	server.Echo.GET("/", controllers.NewHelloController().GetMessage)

	server.Echo.Start(":1323")
}
```

main.go
```
package main

import "app/infra"

func main() {
	server := infra.NewServer()
	server.Start()
}
```

## 終わりに
今回はechoを導入してチュートリアルに沿った簡単な実装を対応した。
echoが使えるようになったので次回から公式ドキュメントを参考に設定を追加していこうと考えている

## 参考文献
https://echo.labstack.com/guide/