Echoはver.3で結局のところ何が変わったのか？

# 公式のリリース内容

* Automatic TLS certificates via Let's Encrypt
* Built-in support for graceful shutdown
* Utility functions to wrap standard handler and middleware
* Map type as shorthand for map[string]interface{}
* Context now wraps standard net/http Request and Response
* New configuration
    * Echo#ShutdownTimeout
    * Echo#DisableHTTP2
* New API
    * Echo#Start()
    * Echo#StartTLS()
    * Echo#StartAutoTLS()
    * Echo#StartServer()
    * Echo#Shutdown()
    * Echo#ShutdownTLS()
    * Context#Scheme()
    * Context#RealIP()
    * Context#IsTLS()
* Exposed the following properties instead of setter / getter functions on Echo instance:
    * Binder
    * Renderer
    * HTTPErrorHandler
    * Debug
    * Logger
* Enhanced redirect and CORS middleware
* Dropped static middleware in favor of Echo#Static
* Dropped API
    * Echo#Run()
    * Context#P()
* Dropped standard Context support
* Dropped support for fasthttp
* Dropped deprecated API
* Moved Logger interface to root level
* Moved website and recipes to the main repo
* Updated docs and fixed numerous issues

# 具体的には何が変わったのか？

## engineパッケージの廃止

```go
// 旧 (httpの場合)
err := e.Run(standard.New(addr))

// 旧 (fasthttpの場合)
err := e.Run(fasthttp.New(addr))

// 新
err := e.Start(addr)
```

standardかfasthttp（もしくは個々で作ったカスタムengine）を選べましたが、fasthttpが使われておらず、普通のhttpさえあれば十分だろうということで、engineが廃止されました。
これによってよりシンプルになりました。

### 公式リリースの該当箇所

* Dropped standard Context support
* Dropped support for fasthttp

## Graceful Shutdownの提供
> 注記：
> 最新のmasterでGraceful Shutdownが撤去されました。
> Built-inのものを使えるのは、v3.0.3までとなります。

```go
// 旧
e := echo.New()
eng := standard.New("localhost:8080")
eng.SetHandler(e)
hd := &httpdown.HTTP{
	StopTimeout: 10 * time.Second,
	KillTimeout: 1 * time.Second,
}
if err := httpdown.ListenAndServe(eng.Server, hd); err != nil {
	panic(err)
}

// 新
e := echo.New()
e.ShutdownTimeout = 30 * time.Second
e.Logger.Fatal(e.Start(":1323"))
```

Graceful Shutdownを適用させる場合、v2までは外部のパッケージを使用する必要がありましたが、これが内包されたことによって、その実装をする必要はなくなりました。
多くのAPIが実装されましたが、ほとんどはここに関連するものです。
その反面、この機構を外出しはできなくなったので、サードパーティをサーバのスタート・シャットダウンの処理に噛ませることもできなくなりました。
ちなみにGraceful Shutdownに使われてるパッケージは `github.com/tylerb/graceful` です。

### 公式リリースの該当箇所
* Built-in support for graceful shutdown
* New API
    * Echo#Start()
    * Echo#StartTLS()
    * Echo#StartAutoTLS()
    * Echo#StartServer()
    * Echo#Shutdown()
    * Echo#ShutdownTLS()
* Dropped API
    * Echo#Run()
    * Context#P()

## SSL証明書（TLS）の自動発行
```go
e := echo.New()
e.StartAutoTLS(":443")
```

StartAutoTLSでサーバを立てた場合、Let's Encryptを利用して証明書を自動取得し、適用します。

### 公式リリースの該当箇所
* Automatic TLS certificates via Let's Encrypt

## static middleware の廃止
```go
// 旧
e := echo.New()
e.Use(middleware.Static("/static"))

// 新
e := echo.New()
e.Static("/static", "assets")
```

静的ファイルのルートを指定する場合はmiddlewareで指定する必要がありましたが、
通常のハンドラと同じような感じで指定できるようになったため廃止されました。

### 公式リリースの該当箇所
* Dropped static middleware in favor of Echo#Static

## HTTPまわりの独自実装を廃止、net/httpを使用

何か良くなったというよりメンテナンスをしやすくしたという感じかもしれません。
何でもかんでも実装だと改修が大変ですから

### Query
```go
// 旧
values := c.Request().URL().QueryParams()

// 新
values := c.Request().URL.Query()
```

### RequestURI
```go
// 旧
values := c.Request().URI()

// 新
values := c.Request().RequestURI
```

### 公式のリリース内容
* Context now wraps standard net/http Request and Response

## 結局のところver3はなにをしたのか？
* 要望が多かった箇所の改修
    * Graceful ShutdownやAutomatic TLS certificatesなど
* メンテナンス性の向上
    * 処理自体変わってしまっているところもあるので単なるリファクタリングではない
    * とりあえずなんでも実装から、すでにあるものはそれを使うにシフト
    * その分、他の対応ができるようにした
        * ソース読むとFIXMEとかTODOがまだあるので、それとかたまったissueの解決に今後は動くのでは？
        * labstack/echoは関連パッケージもあるのでそちらの改修も今後ありうる
* Armorのための改修
    * labstack/echoはServer frameworkです。Web application frameworkとしてArmorができましたが、その対応のための改修がはいっています。