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 생태계에 속하는 다른 프로젝트와 같은 프로젝트를 직접 사용할 수 없다는 것을 의미합니다.