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) |
|---|---|---|---|
| Fiber | Go | ~420,000 | 0.8ms |
| Gin | Go | ~380,000 | 1.0ms |
| Express | Node.js | ~15,000 | 12ms |
| Fastify | Node.js | ~35,000 | 6ms |
- Express.js와 유사한 API로 빠른 학습 곡선
- Fasthttp 기반으로 net/http 대비 10배 이상 성능
- WebSocket, SSE, 파일 업로드 등 기본 지원
- 다양한 내장 미들웨어: CORS, Rate Limiter, Helmet, Compress
- Prefork 모드로 멀티코어 활용 가능
댓글 0