미들웨어는 클라이언트 애플리케이션과 네트워크 서버 사이의 핵심적인 동작이 일어날 때 함께 실행되는 사용자 지정 코드를 설정하기 위해 사용한다.
Go에서 클라이언트 객체를 커스터마이징하여 미들웨어를 커스텀하는 방법으로 http.RoundTripper
인터페이스를 사용하는 방법을 소개해보겠습니다.
http.RoundTripper
인터페이스는 HTTP 요청을 보내고 받는 과정에서 추가적인 동작을 수행할 수 있게 해주는 미들웨어 또는 인터셉터 역할을 합니다.
이 방법을 통해 요청 전/후 처리, 로깅, 인증 헤더 추가와 같은 공통 작업을 수행할 수 있습니다.
http.RoundTripper
는 RoundTrip(*http.Request) (*http.Response, error)
메서드 하나만을 가지는 인터페이스입니다. 이 메서드는 HTTP 요청을 수행하고 그에 대한 응답을 받는 역할을 합니다.RoundTrip()
메서드를 구현하는 새로운 타입으로 정의됩니다. 이 타입은 원하는 추가 동작(예: 로깅, 요청 수정 등)을 수행한 후, 실제 HTTP 요청을 네트워크로 전송하기 위해 기본 Transport
객체의 RoundTrip()
메서드를 호출할 수 있습니다.Transport
필드를 새로운 미들웨어 인스턴스로 설정합니다.package main
import (
"log"
"net/http"
"os"
)
// 로깅을 수행하는 미들웨어 타입
type LoggingRoundTripper struct {
Proxied http.RoundTripper
}
// RoundTrip 메서드 구현
func (lrt *LoggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
log.Println("Request URL:", req.URL.String())
// 실제 HTTP 요청을 수행
return lrt.Proxied.RoundTrip(req)
}
func main() {
// 기본 Transport 객체를 사용하여 LoggingRoundTripper 인스턴스 생성
loggingTransport := &LoggingRoundTripper{Proxied: http.DefaultTransport}
// 커스텀 미들웨어를 Transport로 설정한 HTTP 클라이언트 생성
client := &http.Client{
Transport: loggingTransport,
}
// 커스텀 클라이언트 사용
_, err := client.Get("http://example.com")
if err != nil {
log.Println("Error:", err)
os.Exit(1)
}
}