golang - webFramework Echo

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

개요

  • 웹 프레임워크.
  • 경량 고속.
  • 공식 페이지 https://labstack.com/echo
  • 설치 go get github.com/labstack/echo
  • 버전 2부터는 fasthttp 모듈을 선택해서 사용 가능하다.
  • 성능 테스트 예. http://yamamaijp.hatenablog.com/entry/2016/03/10/161831

간단 예제 코드

main.go

package main

import (
    "github.com/labstack/echo"
    "github.com/labstack/echo/engine/standard"
    "github.com/labstack/echo/middleware"

    "./handler"
)

func main() {
    // Echo 인스턴스를 만든다
    e := echo.New()

    // 모든 요청에 들어가는 미들웨어(로그 ) 여기에
    e.Use(middleware.Logger())
    e.Use(middleware.Recover())

    // 라우팅
    e.Get("/hello", handle.MainPage())

    // 서버 시작
    e.Run(standard.New(":1323"))    
}

handler\handle.go

package handler

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

func MainPage() echo.HandlerFunc {
    return func(c echo.Context) error {     
        return c.String(http.StatusOK, "Hello World")
    }
}

Path parameter

main.go

e.Get("/hello/:username", handle.MainPage())    //세미콜론이 플레이스홀더가 된다

handle.go

func MainPage() echo.HandlerFunc {
    return func(c echo.Context) error {
        username := c.Param("username")    //플레이스홀더 username의 값 추출
        return c.String(http.StatusOK, "Hello World " + username)
    }
}
  • c.Param(“username”)을 c.P(0) 같이 인덱스로 지정할 수도 있다.

인증

basic 인증

main.go

e.Use(interceptor.BasicAuth())

auth.go

package interceptor

import (
    "github.com/labstack/echo/middleware"
    "github.com/labstack/echo"
)

func BasicAuth() echo.MiddlewareFunc {
    return middleware.BasicAuth(func(username, password string) bool {
        return username == "validUser" && password == "validPassword"
    })
}

개별 인증

main.go

e.Get("/user/apps/:username", handle.MainPage(), interceptor.BasicAuth())

JSON

handle.go

jsonMap := map[string]string{
            "foo": "bar",
            "hoge": "fuga",
        }

        return c.JSON(http.StatusOK, jsonMap)
func hello(c *echo.Context) error {
    var content struct {
        Response  string `json:"response"`
        Timestamp string `json:"timestamp"`
    }
    content.Response = "Hello, World!"
    content.Timestamp = getNow()
    return c.JSON(http.StatusOK, &content)
}

CORS

main.go

e.Use(standard.WrapMiddleware(cors.New(cors.Options{
        AllowedOrigins: []string{"http://example.com"},
    }).Handler))

예제 코드 해설

  • 글. https://eurie.co.jp/blog/engineering/2015/12/go-lang-web-framework-echo
  • 예제 코드 위치. https://github.com/eurie-inc/echo-sample

Routing과 미들웨어 이용

func Init() *echo.Echo {
    e := echo.New()

    e.Debug()

    // Set MiddleWare
    e.Use(echoMw.Logger())
    e.Use(echoMw.Recover())
    e.Use(echoMw.Gzip())

    // Set Custom MiddleWare
    e.Use(myMw.TxMiddleware(db.Init()))

    // Routes
    v1 := e.Group("/api/v1")
    {
        v1.Post("/members", api.CreateMember)
        v1.Get("/members", api.GetMembers)
        v1.Get("/members/:id", api.GetMember)
    }
    return e
}

이 글은 2018-10-30에 작성되었습니다.