본문 바로가기
Backend2026년 2월 12일8분 읽기

Go Fiber 프레임워크 — Express 스타일의 고성능 웹 개발

YS
김영삼
조회 368

Go Fiber 프레임워크

Fiber는 Go 언어로 작성된 웹 프레임워크로, Express.js에서 영감을 받아 설계되었습니다. Fasthttp 엔진을 기반으로 뛰어난 성능을 제공합니다.

프로젝트 설정

package main

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/cors"
    "github.com/gofiber/fiber/v2/middleware/logger"
    "github.com/gofiber/fiber/v2/middleware/recover"
)

func main() {
    app := fiber.New(fiber.Config{
        Prefork:       true,
        ServerHeader:  "MyApp",
        StrictRouting: true,
        CaseSensitive: true,
        BodyLimit:     10 * 1024 * 1024,
    })

    app.Use(logger.New())
    app.Use(recover.New())
    app.Use(cors.New(cors.Config{
        AllowOrigins: "https://example.com",
        AllowMethods: "GET,POST,PUT,DELETE",
    }))

    setupRoutes(app)
    app.Listen(":3000")
}

CRUD API 구현

type User struct {
    ID    uint   `json:"id"`
    Name  string `json:"name" validate:"required,min=2"`
    Email string `json:"email" validate:"required,email"`
}

func setupRoutes(app *fiber.App) {
    api := app.Group("/api/v1")

    users := api.Group("/users")
    users.Get("/", getUsers)
    users.Get("/:id", getUser)
    users.Post("/", createUser)
    users.Put("/:id", updateUser)
    users.Delete("/:id", deleteUser)
}

func getUsers(c *fiber.Ctx) error {
    page := c.QueryInt("page", 1)
    limit := c.QueryInt("limit", 20)
    offset := (page - 1) * limit

    var users []User
    result := db.Offset(offset).Limit(limit).Find(&users)
    if result.Error != nil {
        return c.Status(500).JSON(fiber.Map{
            "error": "Failed to fetch users",
        })
    }

    return c.JSON(fiber.Map{
        "data":  users,
        "page":  page,
        "limit": limit,
    })
}

func createUser(c *fiber.Ctx) error {
    user := new(User)
    if err := c.BodyParser(user); err != nil {
        return c.Status(400).JSON(fiber.Map{
            "error": "Invalid request body",
        })
    }

    result := db.Create(user)
    if result.Error != nil {
        return c.Status(500).JSON(fiber.Map{
            "error": "Failed to create user",
        })
    }

    return c.Status(201).JSON(user)
}

미들웨어 작성

func AuthMiddleware() fiber.Handler {
    return func(c *fiber.Ctx) error {
        token := c.Get("Authorization")
        if token == "" {
            return c.Status(401).JSON(fiber.Map{
                "error": "Missing authorization header",
            })
        }

        tokenString := strings.TrimPrefix(token, "Bearer ")
        claims, err := validateJWT(tokenString)
        if err != nil {
            return c.Status(401).JSON(fiber.Map{
                "error": "Invalid token",
            })
        }

        c.Locals("userId", claims.UserID)
        c.Locals("role", claims.Role)
        return c.Next()
    }
}

api.Use("/admin", AuthMiddleware())
api.Get("/admin/dashboard", adminDashboard)

에러 핸들링

app := fiber.New(fiber.Config{
    ErrorHandler: func(c *fiber.Ctx, err error) error {
        code := fiber.StatusInternalServerError

        var e *fiber.Error
        if errors.As(err, &e) {
            code = e.Code
        }

        return c.Status(code).JSON(fiber.Map{
            "error":   true,
            "message": err.Error(),
            "code":    code,
        })
    },
})

성능 비교

프레임워크언어요청/초레이턴시 (p99)
FiberGo~420,0000.8ms
GinGo~380,0001.0ms
ExpressNode.js~15,00012ms
FastifyNode.js~35,0006ms
  • Express.js와 유사한 API로 빠른 학습 곡선
  • Fasthttp 기반으로 net/http 대비 10배 이상 성능
  • WebSocket, SSE, 파일 업로드 등 기본 지원
  • 다양한 내장 미들웨어: CORS, Rate Limiter, Helmet, Compress
  • Prefork 모드로 멀티코어 활용 가능

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록