[go] Go 언어를 사용한 RESTful API의 데이터 검증

RESTful API를 개발할 때 클라이언트로부터 전달받은 데이터의 유효성 검증은 중요한 부분입니다. 이를 위해 Go 언어에서는 다양한 방법을 제공하고 있습니다. 이번 포스트에서는 Go 언어를 사용하여 RESTful API의 데이터 검증을 어떻게 구현할 수 있는지 알아보겠습니다.

1. 데이터 유효성 검증 라이브러리

Go 언어에서는 다양한 데이터 유효성 검증 라이브러리가 제공됩니다. 예를 들어, go-playground/validator 라이브러리는 구조체 필드 태그를 사용하여 데이터의 유효성을 검증할 수 있습니다. 이 라이브러리는 필드 태그에 다양한 규칙을 지정하여 데이터의 유효성을 검증할 수 있는 기능을 제공합니다.

다음은 go-playground/validator 라이브러리를 사용하여 구조체 필드의 유효성을 검증하는 예제입니다.

package main

import (
	"fmt"
	"github.com/go-playground/validator/v10"
)

type User struct {
	Name  string `validate:"required"`
	Email string `validate:"required,email"`
	Age   int    `validate:"required,gte=18"`
}

func main() {
	user := User{
		Name:  "test",
		Email: "test@example.com",
		Age:   20,
	}

	validate := validator.New()
	err := validate.Struct(user)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("유효성 검증 통과")
	}
}

위의 코드에서는 User 구조체의 필드에 필수값과 이메일 형식, 나이가 18 이상인지 여부를 검증하는 필드 태그를 지정하였습니다. validate.Struct() 함수를 호출하여 구조체의 유효성을 검증할 수 있습니다.

2. 커스텀 유효성 검증 함수

때로는 기본 제공되는 유효성 검증 규칙으로는 충분하지 않을 수 있습니다. 이런 경우에는 커스텀 유효성 검증 함수를 구현하여 사용할 수 있습니다.

다음은 커스텀 유효성 검증 함수를 사용하는 예제입니다.

package main

import (
	"fmt"
	"github.com/go-playground/validator/v10"
)

type User struct {
	Password string `validate:"required,strongPassword"`
}

func strongPassword(fl validator.FieldLevel) bool {
	password := fl.Field().String()
	// 패스워드의 강도를 검증하는 로직을 구현합니다.
	// 예를 들어, 최소한 6자리 이상이어야 하고, 숫자와 특수문자가 포함되어야 한다고 가정합니다.
	if len(password) >= 6 && containsNumber(password) && containsSpecialChar(password) {
		return true
	}
	return false
}

func containsNumber(s string) bool {
	// 문자열에 숫자가 포함되어 있는지 검증하는 로직을 구현합니다.
	return false
}

func containsSpecialChar(s string) bool {
	// 문자열에 특수문자가 포함되어 있는지 검증하는 로직을 구현합니다.
	return false
}

func main() {
	user := User{
		Password: "Abc123!",
	}

	validate := validator.New()
	validate.RegisterValidation("strongPassword", strongPassword)

	err := validate.Struct(user)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("유효성 검증 통과")
	}
}

위의 코드에서는 User 구조체의 Password 필드에서 사용자 정의한 strongPassword 유효성 검증 함수를 사용하고 있습니다. 커스텀 유효성 검증 함수는 validator.RegisterValidation() 함수를 호출하여 등록할 수 있습니다.

커스텀 유효성 검증 함수에서는 필드의 값을 확인하고, 필드 값이 유효한지 여부를 반환하는 로직을 구현할 수 있습니다. 이 예제에서는 최소한 6자리 이상이고, 숫자와 특수문자가 포함되어 있어야 유효하다고 가정하였습니다. 실제로는 강도 있는 패스워드 검증 로직을 구현해야 합니다.

3. 결론

Go 언어를 사용하여 RESTful API의 데이터 검증은 go-playground/validator 라이브러리를 활용하거나 커스텀 유효성 검증 함수를 구현하여 간편하게 처리할 수 있습니다. 데이터의 유효성 검증을 통해 클라이언트로부터 전달되는 데이터의 신뢰성을 확보할 수 있고, 예상치 못한 오류를 방지할 수 있습니다. 따라서 RESTful API를 개발할 때는 데이터의 검증을 적절히 수행하는 것이 좋습니다.

4. 참고자료