Go - Middleware

OneDayDev·2024년 3월 30일
0

Go

목록 보기
1/2

Middleware(=Interceptor)

미들웨어는 클라이언트 애플리케이션과 네트워크 서버 사이의 핵심적인 동작이 일어날 때 함께 실행되는 사용자 지정 코드를 설정하기 위해 사용한다.

Go에서 클라이언트 객체를 커스터마이징하여 미들웨어를 커스텀하는 방법으로 http.RoundTripper 인터페이스를 사용하는 방법을 소개해보겠습니다.

http.RoundTripper 인터페이스는 HTTP 요청을 보내고 받는 과정에서 추가적인 동작을 수행할 수 있게 해주는 미들웨어 또는 인터셉터 역할을 합니다.
이 방법을 통해 요청 전/후 처리, 로깅, 인증 헤더 추가와 같은 공통 작업을 수행할 수 있습니다.

클라이언트 객체 커스터마이징

  1. RoundTripper 인터페이스: http.RoundTripperRoundTrip(*http.Request) (*http.Response, error) 메서드 하나만을 가지는 인터페이스입니다. 이 메서드는 HTTP 요청을 수행하고 그에 대한 응답을 받는 역할을 합니다.
  2. 미들웨어 구현: 미들웨어는 RoundTrip() 메서드를 구현하는 새로운 타입으로 정의됩니다. 이 타입은 원하는 추가 동작(예: 로깅, 요청 수정 등)을 수행한 후, 실제 HTTP 요청을 네트워크로 전송하기 위해 기본 Transport 객체의 RoundTrip() 메서드를 호출할 수 있습니다.
  3. 클라이언트 커스터마이징: 커스텀 미들웨어(인터셉터)를 사용하려면, HTTP 클라이언트의 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)
    }
}

RoundTripper를 커스텀할 때, 주의할 점

  1. 반드시 어느 시점에서든 하나 이상의 인스턴스가 실행되고 있다는 가정을 기반으로 구현하기에 어느 자료구조를 조작하더라도 해당 자료구조는 병렬 처리에 안전해야 한다.
  2. 요청이나 응답 자체를 변경해서는 안 되고, 에러를 반환해서도 안 된다.
profile
안녕하세요.

0개의 댓글