PHpullh
학습 라이브러리/Go/검증 에러 패턴

GO · 에러처리

검증 에러 패턴

입력 검증 에러를 구조화하여 여러 필드의 에러를 한 번에 수집하고 반환합니다.

에러처리중급validationfield-errorcollectuser-input

핵심 설명

입력 검증 에러를 구조화하여 여러 필드의 에러를 한 번에 수집하고 반환합니다.

Go code

package main

import (
	"fmt"
	"strings"
)

type FieldError struct {
	Field   string
	Message string
}

type ValidationErrors []FieldError

func (ve ValidationErrors) Error() string {
	msgs := make([]string, len(ve))
	for i, e := range ve {
		msgs[i] = fmt.Sprintf("%s: %s", e.Field, e.Message)
	}
	return strings.Join(msgs, "; ")
}

func (ve ValidationErrors) HasErrors() bool { return len(ve) > 0 }

type UserInput struct {
	Name  string
	Email string
	Age   int
}

func (u UserInput) Validate() error {
	var errs ValidationErrors
	if u.Name == "" {
		errs = append(errs, FieldError{"name", "필수 항목입니다"})
	}
	if !strings.Contains(u.Email, "@") {
		errs = append(errs, FieldError{"email", "유효한 이메일이 아닙니다"})
	}
	if u.Age < 0 || u.Age > 150 {
		errs = append(errs, FieldError{"age", "0~150 범위여야 합니다"})
	}
	if errs.HasErrors() { return errs }
	return nil
}

func main() {
	input := UserInput{Name: "", Email: "invalid", Age: -1}
	if err := input.Validate(); err != nil {
		fmt.Println(err)
		if ve, ok := err.(ValidationErrors); ok {
			for _, e := range ve {
				fmt.Printf("  필드 '%s': %s\n", e.Field, e.Message)
			}
		}
	}
}

학습 팁

검증 에러를 슬라이스로 수집하면 API 응답에서 모든 에러를 한 번에 보여줄 수 있어 UX가 좋습니다.

주의할 점

첫 번째 에러에서 바로 반환하면 사용자가 에러를 하나씩 수정해야 합니다. 가능하면 모든 에러를 한 번에 수집하세요.

자주 묻는 질문

검증 에러 패턴란 무엇인가요?

입력 검증 에러를 구조화하여 여러 필드의 에러를 한 번에 수집하고 반환합니다.

검증 에러 패턴 학습 시 주의할 점은 무엇인가요?

첫 번째 에러에서 바로 반환하면 사용자가 에러를 하나씩 수정해야 합니다. 가능하면 모든 에러를 한 번에 수집하세요.