[go] Go 언어를 사용한 RESTful API의 에러 핸들링 및 예외 처리

Go 언어는 빠르고 간결한 문법을 가지며, 안정성과 성능 면에서 우수한 언어로 알려져 있습니다. RESTful API를 개발할 때 에러 핸들링과 예외 처리는 매우 중요한 요소입니다. 이번 글에서는 Go 언어를 사용하여 RESTful API에서 발생 가능한 에러를 어떻게 핸들링하고 예외를 처리할 수 있는지 알아보겠습니다.

1. 에러 핸들링

에러 핸들링은 RESTful API에서 발생한 에러를 적절하게 처리하는 과정입니다. Go 언어에서는 error 타입을 이용하여 에러를 처리합니다. 일반적으로 API 핸들러 함수는 (response, request)를 매개변수로 받으며, 에러 발생 시 error 타입을 반환합니다. 예를 들어, 사용자 정보를 조회하는 API의 핸들러 함수는 다음과 같이 작성할 수 있습니다.

func getUser(w http.ResponseWriter, r *http.Request) {
    userID := r.URL.Query().Get("id")

    user, err := getUserByID(userID)
    if err != nil {
        w.WriteHeader(http.StatusNotFound)
        fmt.Fprintf(w, "User not found")
        return
    }
    
    // user 정보를 반환하는 로직
    // ...
    w.WriteHeader(http.StatusOK)
    json.NewEncoder(w).Encode(user)
}

위 코드에서 getUserByID(userID) 함수의 반환값으로 usererr을 받습니다. err이 nil이 아닌 경우, 즉 에러가 발생한 경우에는 클라이언트에게 http.StatusNotFound와 함께 에러 메시지를 반환하게 됩니다. 이처럼, 핸들러 함수에서 발생한 에러를 적절하게 처리하거나 반환하는 것이 에러 핸들링의 핵심입니다.

2. 예외 처리

에러 핸들링은 예측 가능한 에러를 처리하는 데에 적합한 방식입니다. 그러나 예외 상황은 경우에 따라서는 예측할 수 없는 동작을 일으킬 수도 있습니다. 이런 예외 상황에 대한 처리를 위해 Go 언어에서는 panicrecover를 제공합니다.

panic은 예외를 발생시키는 함수로, 예외가 발생하면 현재 실행 중인 함수가 즉시 종료되고 호출 스택이 언롤되며, 상위 함수로 돌아갑니다. recoverpanic으로부터 복구하기 위한 함수로, defer 문과 함께 사용됩니다.

아래는 예외 상황에서 panicrecover를 사용한 예시입니다.

func divide(a, b int) int {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("Error:", err)
        }
    }()

    if b == 0 {
        panic("Division by zero")
    }
    return a / b
}

func main() {
    result := divide(10, 0)
    fmt.Println(result)
}

위 코드에서 divide 함수를 호출할 때 두 번째 인자로 0을 전달하면 panic이 발생합니다. 이때 recover 함수가 호출되어 예외를 처리하고 에러 메시지를 출력합니다. 따라서 main 함수에서는 예외 처리를 통해 프로그램이 비정상적으로 종료되는 상황을 방지할 수 있습니다.

마무리

Go 언어를 사용한 RESTful API에서 에러 핸들링과 예외 처리는 중요한 요소입니다. 올바른 에러 핸들링과 예외 처리를 통해 안정적이고 신뢰할 수 있는 API를 개발할 수 있습니다. 본 글에서는 Go 언어에서의 에러 핸들링 방법과 예외 처리 방법을 살펴보았습니다. 추가적인 자세한 정보는 Go 언어 공식 문서를 참고하시기 바랍니다.

참고 자료