오류 처리

라우트 핸들러 및 미들웨어를 실행하는 동안 발생하는 모든 오류를 Fiber가 캡처하고 처리할 수 있도록 하는 것이 중요합니다. 이를 위해 발생한 오류를 핸들러 함수로 반환해야 합니다.

  • 예시
app.Get("/", func(c *fiber.Ctx) error {
    // 오류를 Fiber에 전달함
    return c.SendFile("file-does-not-exist")
})

기본적으로 Fiber는 패닉 오류를 처리하지 않습니다. 스택 내의 핸들러에서 발생한 모든 패닉을 복구하고 Go 프로그램을 충돌시키지 않으려면 아래와 같이 Recover 미들웨어를 포함해야 합니다.

  • 예시
package main

import (
    "log"

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

func main() {
    app := fiber.New()
	
	// Recover 미들웨어를 사용하여 패닉 오류를 잡음
    app.Use(recover.New())

    app.Get("/", func(c *fiber.Ctx) error {
        panic("This panic is caught by fiber")
    })

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

fiber.NewError()를 사용하여 Fiber의 사용자 정의 오류 구조체를 사용하여 추가적인 상태 코드를 전달할 수 있습니다. 메시지를 전달하는 것은 선택 사항이며 비어 두면 상태 코드 메시지로 기본 설정됩니다. (예: 404Not Found로 설정됨)

  • 예시
app.Get("/", func(c *fiber.Ctx) error {
    // 503 Service Unavailable
    return fiber.ErrServiceUnavailable

    // 503 On vacation!
    return fiber.NewError(fiber.StatusServiceUnavailable, "On vacation!")
})

기본 오류 처리기

Fiber는 기본 오류 처리기를 제공합니다. 표준 오류의 경우, 응답은 500 Internal Server Error로 전송됩니다. 오류 유형이 fiber.Error인 경우, 제공된 상태 코드와 메시지를 사용하여 응답이 전송됩니다.

  • 예시
// 기본 오류 처리기
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
    // 기본 상태 코드는 500
    code := fiber.StatusInternalServerError

    // *fiber.Error인 경우, 사용자 정의 상태 코드를 가져옴
    var e *fiber.Error
    if errors.As(err, &e) {
        code = e.Code
    }

    // Content-Type을 설정함: text/plain; charset=utf-8
    c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)

    // 상태 코드와 오류 메시지를 반환함
    return c.Status(code).SendString(err.Error())
}

사용자 정의 오류 처리기

Fiber를 초기화할 때 Config를 사용하여 사용자 정의 오류 처리기를 설정할 수 있습니다.

대부분의 경우, 기본 오류 처리기가 충분할 것입니다. 그러나 다른 유형의 오류를 잡고 해당 조치를 취하려는 경우(예: 알림 이메일 보내기 또는 오류를 중앙 시스템에 기록하기), 그렇다면 사용자 정의 오류 처리기가 매우 유용할 것입니다. 클라이언트에게 사용자 정의 응답을 보내거나(예: 오류 페이지 또는 JSON 응답), 다른 유형의 오류에 대한 오류 페이지를 표시하는 등의 작업이 가능합니다.

다음 예시는 다른 유형의 오류에 대한 오류 페이지를 표시하는 방법을 보여줍니다.

  • 예시
// 사용자 정의 구성으로 새로운 Fiber 인스턴스를 생성함
app := fiber.New(fiber.Config{
    // 기본 오류 처리기를 덮어씀
    ErrorHandler: func(ctx *fiber.Ctx, err error) error {
        // 기본 상태 코드는 500
        code := fiber.StatusInternalServerError

        // *fiber.Error인 경우, 사용자 정의 상태 코드를 가져옴
        var e *fiber.Error
        if errors.As(err, &e) {
            code = e.Code
        }

        // 사용자 정의 오류 페이지를 전송함
        err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
        if err != nil {
            // SendFile이 실패하는 경우
            return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
        }

        // 핸들러에서 반환함
        return nil
    },
})

// ...