PHpullh
학습 라이브러리/Go/프로토콜 버퍼 패턴

GO · 패턴

프로토콜 버퍼 패턴

Protocol Buffers의 Go 사용 패턴. 메시지 정의, 직렬화, 검증을 다룹니다.

패턴고급protobufserializationvalidationgrpc

핵심 설명

Protocol Buffers의 Go 사용 패턴. 메시지 정의, 직렬화, 검증을 다룹니다.

Go code

package main

import (
	"encoding/json"
	"fmt"
)

// protobuf가 생성하는 Go 코드와 유사한 구조
type UserProto struct {
	ID    int32  `json:"id"`
	Name  string `json:"name"`
	Email string `json:"email"`
}

// 검증 메서드 (protoc-gen-validate 스타일)
func (u *UserProto) Validate() error {
	if u.Name == "" {
		return fmt.Errorf("name은 필수입니다")
	}
	if len(u.Name) > 100 {
		return fmt.Errorf("name은 100자 이하여야 합니다")
	}
	return nil
}

// JSON ↔ Proto 변환
func (u *UserProto) ToJSON() ([]byte, error) {
	return json.Marshal(u)
}

func UserFromJSON(data []byte) (*UserProto, error) {
	var u UserProto
	if err := json.Unmarshal(data, &u); err != nil {
		return nil, err
	}
	if err := u.Validate(); err != nil {
		return nil, err
	}
	return &u, nil
}

func main() {
	user := &UserProto{ID: 1, Name: "Gopher", Email: "go@dev"}
	data, _ := user.ToJSON()
	fmt.Println(string(data))

	u2, err := UserFromJSON([]byte(`{"id":2,"name":"","email":"test"}`))
	if err != nil {
		fmt.Println("에러:", err) // name은 필수입니다
	}
	_ = u2
}

학습 팁

buf 도구를 사용하면 protobuf 빌드, 린팅, 호환성 검사를 자동화할 수 있습니다.

주의할 점

protobuf 필드 번호를 변경하면 이전 버전과 호환되지 않습니다. 필드를 삭제할 때는 번호를 reserved로 표시하세요.

자주 묻는 질문

프로토콜 버퍼 패턴란 무엇인가요?

Protocol Buffers의 Go 사용 패턴. 메시지 정의, 직렬화, 검증을 다룹니다.

프로토콜 버퍼 패턴 학습 시 주의할 점은 무엇인가요?

protobuf 필드 번호를 변경하면 이전 버전과 호환되지 않습니다. 필드를 삭제할 때는 번호를 reserved 로 표시하세요.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.