Golang net/http vs Gin vs Fiber 비교

beluga000·2025년 11월 5일

net/http vs Gin vs Fiber 비교

Golang에서 웹 서버나 API 서버를 만들 때 가장 많이 사용되고 비교되는 3개의 프레임워크/패키지가 net/http, Gin, Fiber입니다.

아래는 이 셋의 핵심적인 차이점, 성능, 구조, 사용 목적을 정리한 비교입니다.

1. 성능 비교

net/http (표준 라이브러리)

  • 장점:
    • 가장 안정적이고 호환성이 높음
    • 추가 의존성 없음
    • 메모리 사용량이 적음
    • 표준 라이브러리로 장기 지원 보장
  • 단점:
    • 상대적으로 낮은 성능
    • Boilerplate 코드가 많음
    • 라우팅, 미들웨어, JSON 응답 등은 직접 구현해야 함

      Boilerplate(보일러플레이트)는 개발 전반에서 자주 등장하는 개념으로 모든 코드를 작성하기 위해서 필요한 기본 코드 틀 이라고 할 수 있다.
      Import, Component, Stylesheet, Export 구조로 이루어져 있으며 개박 속도 향상, 일관성 유지, 재사용성 증가, 실수 방지 등의 목적을 가지고 있다.

Gin

  • 장점:
    • 높은 성능 (httprouter 기반)
    • 활발한 커뮤니티와 풍부한 미들웨어
    • 간단한 API와 좋은 문서화
    • JSON 바인딩과 검증 기능
  • 단점:
    • Reflection 사용으로 인한 약간의 오버헤드(net/http에 비해 상대적으로)
    • Context가 sync.Pool을 사용하여 주의 필요

Fiber

  • 장점:
    • Express.js와 유사한 API로 학습 용이
    • 매우 높은 성능 (fasthttp 기반)
    • 풍부한 내장 미들웨어
    • 메모리 사용량 최적화
    • 개발 생산성 높음
  • 단점:
    • fasthttp는 표준 net/http와 호환되지 않음
    • 상대적으로 작은 커뮤니티
    • 일부 third-party 라이브러리와 호환성 문제

2. 벤치마크 결과 (상대적 비교)

프레임워크RPS (Requests per second, 초당 요청 수))메모리 사용량CPU 사용률
net/http~100,000100%100%
Gin~120,000120%80%
Fiber~200,000 이상90%70%

실제 수치는 환경/미들웨어 구성에 따라 달라지며, Fiber는 fasthttp를 기반으로 하여 커널 레벨에서 더 적은 메모리 복사와 context 전환을 수행하기 때문에 성능이 뛰어남

3. 코드 비교 예시

net/http

func userHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodGet {
        http.Error(w, "허용되지 않은 메서드", http.StatusMethodNotAllowed)
        return
    }
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(map[string]string{"message": "success"})
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/api/users", userHandler)
    log.Fatal(http.ListenAndServe(":8080", mux))
}

Gin

func main() {
    r := gin.Default()

    // Global middleware
    r.Use(gin.Logger(), gin.Recovery())

    r.GET("/api/users", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{"message": "success"})
    })

    r.POST("/api/users", func(c *gin.Context) {
        var body map[string]interface{}
        if err := c.BindJSON(&body); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, body)
    })

    r.Run(":8080")
}

Fiber

func main() {
    app := fiber.New(fiber.Config{
        Prefork: true, // 다중 프로세스로 성능 향상 가능
    })

    app.Use(logger.New())
    app.Use(cors.New())

    app.Get("/api/users", func(c *fiber.Ctx) error {
        return c.JSON(fiber.Map{"message": "success"})
    })

    app.Post("/api/users", func(c *fiber.Ctx) error {
        var body map[string]interface{}
        if err := c.BodyParser(&body); err != nil {
            return c.Status(400).JSON(fiber.Map{"error": err.Error()})
        }
        return c.JSON(body)
    })

    app.Listen(":8080")
}

4. 선택 기준 요약

사용상황추천 프레임워크이유
표준 API, 외부 의존성 최소화 필요net/http표준이므로 안정적, 내장 라이브러리만으로 충분
일반적인 REST API 서버Gin가장 많이 사용, 문서 많고, 성능/생산성 균형
초고성능, Express 스타일 선호Fiber비동기 I/O 기반으로 매우 빠르고 문법 간결

결론(선택 가이드-상황별 추천)

상황추천이유
Go 기본기 학습, 저수준 제어, 표준 호환성 중시🟦 net/http가장 단순하고 Go 언어의 HTTP 모델을 정확히 이해 가능
일반적인 REST API 서버 (CRUD 중심)🟩 Gin문서 많고, 표준 라이브러리 호환성 유지하면서 생산성 확보
고성능, 비동기 I/O, 대규모 요청 처리 필요🟥 Fiberfasthttp 기반으로 초고속, Express 스타일로 코드 간결
profile
Developer

0개의 댓글