공부 흔적남기기

adapter Pattern (Go middleware 사용법) 본문

web study/배경지식

adapter Pattern (Go middleware 사용법)

65살까지 코딩 2023. 2. 27. 21:50
728x90
반응형

Go를 이용해서 Rest Api를 개발하고 있는 도중 middleware를 사용할 일이 생겨 사용할려다보니 내부적으로 이해가 안되서 정리함.

 

어댑터 패턴은 간단하게 말해서 A타입을 사용하고 싶은데 우리에게 B타입밖에 없다면 어댑터를 이용해서 B타입을 A타입으로 바꿔주는 역할을 하는 것이다. 

 

Go에서 middleware를 사용하기 위해 Gorlia Mux의 router.Use라는 function을 사용할 건데

func (r *Router) Use(mwf ...MiddlewareFunc) {
   for _, fn := range mwf {
      r.middlewares = append(r.middlewares, fn)
   }
}

type MiddlewareFunc func(http.Handler) http.Handler

Use function의 argument Type을 보면 -> argument가 Handler Type이고 return이 Handler Type인 함수를 받는다.

 

근데 나는

func(rw http.ResponseWriter, r *http.Request) {
   rw.Header().Add("Content-Type", "application/json")
}

다음과 같이 미들웨어를 구성하고 싶다.  

위함수를 handler Type으로 convert해주는 함수를 Go에서 지원하는데 그게 HandlerFunc이고 이것이 어댑터 패턴이다

내가 사용하고 싶은 특정 타입을 필요한 타입으로 바꿔주는 것이다.

func jsonContentTypeMiddleware(next http.Handler) http.Handler {
   return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
      rw.Header().Add("Content-Type", "application/json")
      next.ServeHTTP(rw, r)
   })
}

다음과 같이 코드를 작성할 수 있다.  http.HandlerFunc으로 한번 감쌈으로서 Handler를 return할 수 있게 된다. 

 

HanlderFunc을 자세히 살펴보면

type Handler interface {
   ServeHTTP(ResponseWriter, *Request)
}
type HandlerFunc func(ResponseWriter, *Request)

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

Handler interface 를 상속 받아 구현함으로서 Handler 타입으로서도 사용할 수 있게 된다. (go 에서는 굳이 implemnets를 사용하지 않아도 내적으로 상속하게 된다.)

Adpater pattern super cool

 

728x90
반응형