Fiber은 인터넷에서 가장 인기 있는 Web 프레임워크 Express에서 영감을 받았습니다. 저희는 Express사용성Go원시 성능을 결합했습니다. 만약 이전에 Node.js를 사용하여 (Express나 유사한 프레임워크를 사용하여) Web 애플리케이션을 개발한 적이 있다면, 많은 메소드와 원칙들은 여러분에게 매우 쉽게 이해되어야 할 것입니다.

빠른 시작

설치

Go 1.17 이상이 설치되어 있는지 확인하세요.

프로젝트를 초기화하려면 폴더를 만들고 해당 폴더 안에서 go mod init github.com/your/repo 명령을 실행하여 프로젝트를 초기화한 다음, go get 명령을 사용하여 Fiber를 설치하세요:

go get -u github.com/gofiber/fiber/v2

Hello World

package main

// fiber 패키지를 임포트합니다
import "github.com/gofiber/fiber/v2"

func main() {
    // fiber 앱을 정의합니다
    app := fiber.New()

    // http route를 정의합니다
    app.Get("/", func(c *fiber.Ctx) error {
        // 문자열로 "Hello, World ?!"을 반환합니다
        return c.SendString("Hello, World ?!")
    })

    // 포트 3000에서 대기합니다.
    app.Listen(":3000")
}

접근 주소: http://localhost:3000/

기본 라우팅

Fiber 기본 라우팅 예제

func main() {
    app := fiber.New()

    // GET /api/register
    app.Get("/api/*", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("✋ %s", c.Params("*"))
        return c.SendString(msg) // => ✋ register
    })

    // GET /flights/LAX-SFO
    app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("? From: %s, To: %s", c.Params("from"), c.Params("to"))
        return c.SendString(msg) // => ? From: LAX, To: SFO
    })

    // GET /dictionary.txt
    app.Get("/:file.:ext", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("? %s.%s", c.Params("file"), c.Params("ext"))
        return c.SendString(msg) // => ? dictionary.txt
    })

    // GET /john/75
    app.Get("/:name/:age/:gender?", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("? %s is %s years old", c.Params("name"), c.Params("age"))
        return c.SendString(msg) // => ? john is 75 years old
    })

    // GET /john
    app.Get("/:name", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("Hello, %s ?!", c.Params("name"))
        return c.SendString(msg) // => Hello john ?!
    })

    log.Fatal(app.Listen(":3000"))
}

정적 파일 제공

정적 파일 제공 설정

func main() {
    app := fiber.New()

    app.Static("/", "./public")
    // => http://localhost:3000/js/script.js
    // => http://localhost:3000/css/style.css

    app.Static("/prefix", "./public")
    // => http://localhost:3000/prefix/js/script.js
    // => http://localhost:3000/prefix/css/style.css

    app.Static("*", "./public/index.html")
    // => http://localhost:3000/any/path/shows/index/html

    log.Fatal(app.Listen(":3000"))
}

미들웨어

미들웨어를 통해 HTTP 요청을 다루는 기능을 향상시킵니다.

func main() {
    app := fiber.New()

    // 어떠한 route와도 일치하며, 여기서 클로저 함수를 사용하여 미들웨어를 사용자 정의합니다
    app.Use(func(c *fiber.Ctx) error {
        fmt.Println("? 첫 번째 핸들러")
        // 다음 미들웨어나 라우트 함수를 계속 처리합니다
        return c.Next()
    })

    // /api로 시작하는 경로에 일치합니다
    app.Use("/api", func(c *fiber.Ctx) error {
        fmt.Println("? 두 번째 핸들러")
        return c.Next()
    })
    
    // 내장된 미들웨어를 사용하여 예외를 처리합니다
    app.Use(recover.New())

    // GET /api/register
    app.Get("/api/list", func(c *fiber.Ctx) error {
        fmt.Println("? 마지막 핸들러")
        return c.SendString("Hello, World ?!")
    })

    log.Fatal(app.Listen(":3000"))
}

템플릿 엔진

템플릿 엔진이 설정되지 않으면 Fiber는 기본적으로 html/template을 사용합니다.

package main

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/template/pug"
)

func main() {
    // 템플릿 엔진 설정
    app := fiber.New(fiber.Config{
        Views: pug.New("./views", ".pug"),
    })

    app.Get("/", func(c *fiber.Ctx) error {
        // fiber.map 템플릿 매개변수를 사용하여 ./views/home.pug 템플릿을 렌더링합니다
        return c.Render("home", fiber.Map{
            "title": "홈페이지",
            "year":  1999,
        })
    })

    log.Fatal(app.Listen(":3000"))
}

Cross-Origin Resource Sharing (CORS) 미들웨어

Fiber의 CORS 미들웨어는 다양한 옵션을 사용하여 CORS 공격을 방지하고 교차 출처 리소스 공유를 활성화할 수 있습니다.

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

func main() {
    app := fiber.New()

    // 기본 CORS 구성
    app.Use(cors.New())

    // 또는 특정 도메인에서의 요청을 허용하기 위해 CORS 매개변수를 사용자 정의할 수 있습니다
    app.Use(cors.New(cors.Config{
        AllowOrigins: "https://www.tizi365.com, https://tizi365.com",
        AllowHeaders:  "Origin, Content-Type, Accept",
    }))

    log.Fatal(app.Listen(":3000"))
}

Origin 헤더에 어떤 도메인이든 전달하여 CORS를 확인합니다:

curl -H "Origin: https://www.tizi365.com" --verbose http://localhost:3000

커스텀 404 응답

func main() {
    app := fiber.New()

    app.Static("/", "./public")

    app.Get("/demo", func(c *fiber.Ctx) error {
        return c.SendString("이것은 데모입니다!")
    })

    app.Post("/register", func(c *fiber.Ctx) error {
        return c.SendString("환영합니다!")
    })

    // 마지막으로 참조된 미들웨어는 404를 포함한 모든 요청과 일치합니다
    app.Use(func(c *fiber.Ctx) error {
        // 기타 처리 논리
        // 404 상태를 반환합니다
        return c.SendStatus(404)
        // => 404 "Not Found"
    })

    log.Fatal(app.Listen(":3000"))
}

JSON 응답

Fiber가 JSON 데이터를 반환하는 예시입니다.

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    app := fiber.New()

    app.Get("/user", func(c *fiber.Ctx) error {
        return c.JSON(&User{"John", 20})
        // => {"name":"John", "age":20}
    })

    app.Get("/json", func(c *fiber.Ctx) error {
        return c.JSON(fiber.Map{
            "success": true,
            "message": "안녕 John!",
        })
        // => {"success":true, "message":"안녕 John!"}
    })

    log.Fatal(app.Listen(":3000"))
}

복구 미들웨어

프로그램 충돌과 종료를 방지하기 위해 패닉 오류를 가로채는 복구 미들웨어입니다.

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

func main() {
    app := fiber.New()
	// 패닉 예외를 가로채기 위해 패닉 미들웨어를 사용합니다
    app.Use(recover.New())

    app.Get("/", func(c *fiber.Ctx) error {
        panic("보통이라면 앱이 충돌할 것입니다")
    })

    log.Fatal(app.Listen(":3000"))
}

벤치마크

[

제한사항

  • Fiber에서 안전하지 않은 기능을 사용하므로 최신 Go 버전과 호환되지 않을 수 있습니다. Fiber 2.40.0은 Go 버전 1.17부터 1.21까지 테스트되었습니다.
  • Fiber는 net/http 인터페이스와 호환되지 않습니다. 이는 gqlgen, go-swagger 또는 net/http 생태계에 속하는 다른 프로젝트와 같은 프로젝트를 직접 사용할 수 없다는 것을 의미합니다.