
Go 언어에서 에러는 단순한 문자열이 아닌 인터페이스로 구성되어 있습니다.
그래서 단순히 에러의 유무만을 판단하는 단계를 넘어,
에러의 타입이나 정보들을 확인하고 값을 직접 꺼내서 사용하는 방법을 알아보겠습니다.
1. Sentinel Error
"Sentinel Error" 는 특정 상태를 나타내기 위해 미리 정의해둔 고정 에러 변수이며 ,
뜻에서 알 수 있듯 '파수꾼'이라는 이름처럼 코드 곳곳에 발생하는 에러들과 비교하는 기준점이 됩니다.
특징으로는 패키지 레벨 전역 변수로 선언되며, 주로 에러의 상세 내용보다는 어떤 에러가 발생했는지, 그 종류를 구분할 때 사용합니다.
- 특징
- 전역변수 선언
- 에러 종류 구분에 사용됨
// Example
var ErrInvalidInput = errors.New("invalid input")
2. Typed Error
단순 "에러가 발생했다" 는 사실을 넘어서 어떤 필드에서,
그 에러가 왜 발생했는지에 대한 상세 정보가 필요할 경우가 있습니다.
이때 에러를 구조체로 정의해서 사용하게 되는데, 이러한 것을 "Typed Error" 라고 합니다.
// Example
type ValidationError struct {
Field string // 에러 필드
Msg string // 메시지
Err error // 에러
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("validation: field=%s msg=%s: %v", e.Field, e.Msg, e.Err)
}
func (e *ValidationError) Unwrap() error { return e.Err }
3. 예제 코드
package main
import (
"errors"
"fmt"
)
func main() {
err := doThing()
fmt.Println("err:", err)
var vErr *ValidationError
// 에러 데이터 추출 (ValidationError -> vErr 할당)
if errors.As(err, &vErr) {
fmt.Println("as ValidationError:", "field=", vErr.Field, "msg=", vErr.Msg)
}
// 2. 에러 확인
if errors.Is(err, ErrInvalidInput) {
fmt.Println("is ErrInvalidInput: true")
}
}
var ErrInvalidInput = errors.New("invalid input")
type ValidationError struct {
Field string
Msg string
Err error
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("validation: field=%s msg=%s: %v", e.Field, e.Msg, e.Err)
}
func doThing() error {
return &ValidationError{
Field: "email",
Msg: "missing @",
Err: ErrInvalidInput,
}
}
4. 비교
| 종류 | errors.Is(err, target) | errors.As(err, &target) |
| 목적 | 에러 비교 | 에러 추출 (형 변환) |
5. 전체 코드 보기
https://github.com/reochoi109/go-handbook/blob/main/error/advanced/typed_as/main.go
go-handbook/error/advanced/typed_as/main.go at main · reochoi109/go-handbook
A personal handbook of Go patterns and best practices. Lightweight, practical code snippets for real-world backend development. - reochoi109/go-handbook
github.com
'프로그래밍 > golang' 카테고리의 다른 글
| [Golang] Close() 에러를 무시하면 안 되는 이유 (0) | 2026.03.18 |
|---|---|
| [Golang] 에러 분류를 통한 Retry 구현 (0) | 2026.03.18 |
| [Golang] Slog를 활용한 로그 라우팅 설계 (0) | 2026.03.18 |
| [Golang] Slog를 활용한 로그 샘플링 구현하기 (0) | 2026.03.18 |
| [Golang] Slog를 활용한 마스킹 핸들러 구현 (0) | 2026.03.18 |