10.5 Middlewareパターンを使って処理を分離する

アプリケーションのハンドラーを実装していると、多くのハンドラーで共通して実行したい処理があります。たとえば認証チェックを行ってログインしていなければログインフォームに遷移させたり、ロギングや、panic時のエラー制御、レスポンスのgzip化といったものです。すべてのハンドラーに同じ処理を実装するのは面倒ですし、共通する関心事はアプリケーションハンドラーとは別のレイヤーで処理したいでしょう。Goのウェブアプリケーションの世界では、これを実現するための仕組みを ミドルウェア と呼びます。

10.5.1 Middlewareの仕組み

「10.2  ウェブプログラミングの基本 」でも紹介しましたが、Goの Handler インタフェースは ServeHTTP メソッドをもちます。 ServeHTTP が呼び出されたときは HandlerFunc 型の func(ResponseWriter, *Request)f として呼び出します。

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
    f(w, r)
}

ServeHTTPHandlerFunc 型の f を呼び出す仕組みを応用すると、ハンドラーとして定義されている f を処理する前(あるいは後)に実行したい処理を実装できます。このアプリケーションハンドラーに対して共通の処理を行う実装パターンが Middleware です。ロギングを行うMiddlewareについて見ていきましょう。

以下は localhost:8888/health にリクエストされたときに OK と出力するハンドラーです。 ...