[go] Go 언어를 사용한 RESTful API의 예외 처리

RESTful API는 일반적으로 클라이언트와 서버 간의 통신을 위해 사용되는 중요한 기술입니다. 이러한 API를 개발할 때 예외 처리를 제대로 다루는 것은 매우 중요합니다. Go 언어는 간결하면서도 강력한 예외 처리 기능을 제공하므로 RESTful API 개발에 이상적입니다.

1. 에러 핸들링

Go 언어에서는 errors 패키지를 사용하여 에러를 다룹니다. 에러 핸들링을 위해 다음과 같이 error 타입을 반환하는 함수를 작성할 수 있습니다.

func getInfo(id string) (string, error) {
    // 데이터베이스에서 정보를 가져옴
    result, err := db.Get(id)
    if err != nil {
        return "", errors.New("Failed to get information")
    }
    return result, nil
}

위의 코드에서 db.Get 함수는 데이터베이스에서 정보를 가져오는 함수입니다. 만약 이 함수에서 에러가 발생하면 errors.New 함수를 사용하여 새로운 에러를 생성하고 반환합니다.

2. HTTP 에러 처리

RESTful API에서는 보통 HTTP 상태 코드를 사용하여 클라이언트에게 에러를 전달합니다. Go 언어에서는 net/http 패키지를 사용하여 HTTP 에러를 처리할 수 있습니다.

func getInfoHandler(w http.ResponseWriter, r *http.Request) {
    id := r.URL.Query().Get("id")
    result, err := getInfo(id)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    fmt.Fprint(w, result)
}

위의 코드에서 http.Error 함수를 사용하여 http.StatusInternalServerError 상태 코드와 함께 에러 메시지를 클라이언트에게 전송합니다.

3. 커스텀 에러 타입

Go 언어는 커스텀 에러 타입을 정의할 수 있는 강력한 기능을 제공합니다. 이를 활용하여 더 풍부한 에러 정보를 클라이언트에게 전달할 수 있습니다.

type APIError struct {
    ErrorCode int    `json:"error_code"`
    Message   string `json:"message"`
}

func (e *APIError) Error() string {
    return e.Message
}

func getInfo(id string) (string, error) {
    // 데이터베이스에서 정보를 가져옴
    result, err := db.Get(id)
    if err != nil {
        return "", &APIError{
            ErrorCode: http.StatusInternalServerError,
            Message:   "Failed to get information",
        }
    }
    return result, nil
}

위의 코드에서 APIError 구조체를 정의하고 error 인터페이스를 구현합니다. 이제 getInfo 함수에서는 &APIError 타입의 에러를 반환할 수 있으며, 클라이언트에게 JSON 형식으로 에러 정보를 전송할 수 있습니다.

정리

Go 언어를 사용하여 RESTful API를 개발할 때 예외 처리는 매우 중요한 부분입니다. errors 패키지를 활용하여 기본적인 에러 핸들링을 수행하고, http.Error 함수와 커스텀 에러 타입을 통해 HTTP 에러를 처리할 수 있습니다. 적절한 예외 처리를 통해 안정적인 RESTful API를 구현할 수 있습니다.

참고 자료