[go] 에러 처리와 디자인 패턴

에러 처리는 모든 소프트웨어 시스템에서 중요한 측면이다. 올바른 에러 처리는 안정적이고 견고한 애플리케이션을 만드는데 중요한 요소이다. 이번에는 Go 언어에서의 에러 처리와 에러 처리에 유용한 디자인 패턴들을 살펴보겠다.

에러 처리 기본

Go 언어에서 에러 처리는 간단하면서도 효율적이다. 일반적으로 함수의 반환 값으로 에러를 반환하여 처리한다.

아래는 간단한 함수에서 에러를 반환하는 예시이다.

func divide(x, y int) (int, error) {
    if y == 0 {
        return 0, errors.New("division by zero")
    }
    return x / y, nil
}

함수는 반환 값으로 에러를 반환하고, 호출자는 이 에러를 확인하여 적절한 처리를 할 수 있다.

에러 처리 디자인 패턴

에러 래핑

에러 래핑은 여러 단계의 함수 호출을 거친 후 발생한 에러를 보다 명확하게 전달하기 위한 패턴이다. Go에서는 errors 패키지의 Wrap 함수를 사용하여 에러를 래핑할 수 있다.

아래는 에러 래핑의 예시이다.

func readFile() error {
    _, err := os.Open("filename.txt")
    if err != nil {
        return errors.Wrap(err, "readFile failed")
    }
    return nil
}

에러 타입 단언

Go에서는 타입 단언을 사용하여 특정 타입의 에러를 처리하는 것이 가능하다.

아래는 타입 단언을 사용한 예시이다.

_, err := someFunction()
if err != nil {
    if httpErr, ok := err.(*HTTPError); ok {
        // HTTPError 타입의 에러를 처리
    } else {
        // 기타 타입의 에러를 처리
    }
}

커스텀 에러 타입

복잡한 애플리케이션에서는 커스텀 에러 타입을 정의하여 의미 있는 에러를 정의할 수 있다.

아래는 커스텀 에러 타입을 정의한 예시이다.

type CustomError struct {
    Code    int
    Message string
}

func (e *CustomError) Error() string {
    return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
}

마치며

Go 언어는 간단하면서도 효율적인 에러 처리를 제공한다. 에러 처리를 위한 다양한 디자인 패턴과 기능들을 최대한 활용하여 안정적이고 견고한 애플리케이션을 개발하는데 유용하게 활용할 수 있다.

에러 처리와 디자인 패턴에 대한 내용은 Go 언어 공식 문서에서 더 자세히 확인할 수 있다.