๊ธ€ ์ž‘์„ฑ์ž: ๋˜ฅํด๋ฒ .
๋ฐ˜์‘ํ˜•

 ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ •์˜ํ•œ ๋ฉ”์„ธ์ง€๋ฅผ jsonํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ ํ•  ๋•Œ bytes ํ•„๋“œ์— ๋Œ€ํ•ด ์ฃผ์˜ ํ•  ์ ์ด ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ string ํƒ€์ž…์€ ์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด์„ ์šฐ๋ฆฌ๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ json ๋ณ€ํ™˜์‹œ์—๋„ ์œ ์ง€๋ฅผ ํ•˜๊ณ  ์žˆ์ง€๋งŒ,

bytes ํƒ€์ž…์— ์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด์„ json์œผ๋กœ ๋ณ€ํ™˜ ์‹œ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค.

 

 ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด Go์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

[user.proto]

syntax = "proto3";
package message;

message User {
    int64 userId = 1;
    string nickname = 2;
    bytes danmoji = 3;
}

 ๋ฉ”์„ธ์ง€์˜ ํฌ๋งท์€ ์œ„์™€ ๊ฐ™๋‹ค. ์ด์ œ stringํƒ€์ž…์ธ nicknameํ•„๋“œ์™€, bytesํƒ€์ž…์ธ danmojiํ•„๋“œ์— ๋ฌธ์ž์—ด์„ ์ฑ„์›Œ ๋ฉ”์„ธ์ง€๋ฅผ ๋งŒ๋“ค๊ณ  json ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜์„ ํ•ด๋ณด์ž.

 

[์˜ˆ์ œ 1] User ๋ฉ”์„ธ์ง€๋ฅผ json์œผ๋กœ ๋ณ€ํ™˜

import (
	"fmt"
	"github.com/golang/protobuf/jsonpb"
	"testing"
)

func TestMessageToJson(t *testing.T) {
	// User ๋ฉ”์„ธ์ง€ ์ •์˜
	userInfo := &User{
		UserId:               1,
		Nickname:             "test",
		Danmoji:              []byte("test"),
	}

	// json ๋ณ€ํ™˜
	jsonString, _ := (&jsonpb.Marshaler{}).MarshalToString(userInfo)
	fmt.Println(jsonString)
}
=== RUN   TestMessageToJson
{"userId":"1","nickname":"test","danmoji":"dGVzdA=="}
--- PASS: TestMessageToJson (0.00s)
PASS

Process finished with exit code 0

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด nickname์€ ์ •์ƒ์ ์œผ๋กœ ๋ณ€ํ™˜๋˜์—ˆ์ง€๋งŒ, danmoji๋Š” ์ด์ƒํ•œ ๋ฌธ์ž๋“ค๋กœ ์ฑ„์›Œ์ ธ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ jsonํƒ€์ž…์„ ์šฐ๋ฆฌ๊ฐ€ ์ •์˜ํ•œ ๋ฉ”์„ธ์ง€๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ์— ์žˆ์–ด๋„ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž…๋ ฅํ•˜๋ฉด ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

[์˜ˆ์ œ 2] json ๋ฉ”์„ธ์ง€๋ฅผ Userํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜

import (
	"fmt"
	"github.com/golang/protobuf/jsonpb"
	"testing"
)

func TestJsonToMessage(t *testing.T) {
	// json ๋ฉ”์„ธ์ง€ ์ •์˜
	jsonMessage := "{\"userId\":\"1\",\"nickname\":\"test\",\"danmoji\":\"test\"}"

	// ๋ฉ”์„ธ์ง€๋กœ ๋ณ€ํ™˜
	var userInfo User
	_ = jsonpb.UnmarshalString(jsonMessage, &userInfo)
	fmt.Println(userInfo)
	fmt.Println("danmoji: ", string(userInfo.Danmoji))
}
=== RUN   TestJsonToMessage
{1 test [181 235 45] {} [] 0}
danmoji:  ๏ฟฝ๏ฟฝ-
--- PASS: TestJsonToMessage (0.00s)
PASS

๊ฒฐ๊ณผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด danmoji๋ฅผ string์œผ๋กœ ๋ณ€ํ™˜ํ–ˆ๋Š”๋ฐ ์ด์ƒํ•œ ๊ฐ’์ด ์ฐํžˆ๊ณ  ์žˆ๋‹ค.

 

๊ฒฐ๋ก ์„ ๋งํ•˜์ž๋ฉด,

  • json -> protobuf message, protobuf message -> json ์œผ๋กœ ๋ณ€ํ™˜ ์‹œ bytes ํ•„๋“œ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ parsing ๋œ๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ base64 encoding๋ฅผ ๊ฑฐ์ณ ๋ณ€ํ™˜๋œ๋‹ค.

 

[์˜ˆ์ œ 3] Base64 Encoding์„ ํ†ตํ•ด json ๋ฉ”์„ธ์ง€๋ฅผ Userํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜

import (
	"fmt"
	"github.com/golang/protobuf/jsonpb"
	"testing"
)

func TestJsonToMessageBase64(t *testing.T) {
	// json ๋ฉ”์„ธ์ง€ ์ •์˜
	dmj := base64.StdEncoding.EncodeToString([]byte("test"))
	jsonMessage := "{\"userId\":\"1\",\"nickname\":\"test\",\"danmoji\":\"" + dmj +"\"}"

	// ๋ฉ”์„ธ์ง€๋กœ ๋ณ€ํ™˜
	var userInfo User
	_ = jsonpb.UnmarshalString(jsonMessage, &userInfo)
	fmt.Println(userInfo)
	fmt.Println("danmoji: ", string(userInfo.Danmoji))
}
=== RUN   TestJsonToMessageBase64
{1 test [116 101 115 116] {} [] 0}
danmoji:  test
--- PASS: TestJsonToMessageBase64 (0.00s)
PASS

 

protobuf message -> json์œผ๋กœ ๋ณ€ํ™˜ ์‹œ, bytesํ•„๋“œ๋Š” base64 encoding๋˜์–ด ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ณ  

๋ฐ˜๋Œ€๋กœ, json -> protobuf message๋กœ ๋ณ€ํ™˜ ์‹œ base64 decoding๋˜์–ด ๋ฉ”์„ธ์ง€ ํ•„๋“œ์— ๋“ค์–ด๊ฐ„๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด json ๋ฉ”์„ธ์ง€๋ฅผ ์„œ๋ฒ„์— ๋ณด๋‚ด๊ณ  ์„œ๋ฒ„์—์„œ json ๋ฉ”์„ธ์ง€๋ฅผ ์ •์ƒ์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

  • json ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ bytesํ•„๋“œ๋งŒ base64 encoding์„ ํ•ด์„œ ๋ณด๋‚ธ๋‹ค.
  • ํ˜น์€ ์‚ฌ์šฉ์ž๋Š” ๊ทธ๋Œ€๋กœ json ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋˜,  json ๋ฉ”์„ธ์ง€์˜ bytesํ•„๋“œ๋งŒ ์„œ๋ฒ„์—์„œ base64 encoding์„ ํ•œ ๋ฒˆ ํ•˜๊ณ , protobuf ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ „์ฒด์ ์œผ๋กœ Unmarshalingํ•œ๋‹ค.

 

์‚ฌ์šฉ์ž๊ฐ€ ์ผ์ผํžˆ bytes ํ•„๋“œ์—๋งŒ base64 encoding์„ ํ•ด์„œ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ์—๋Š” ๋ฒˆ๊ฑฐ๋กญ๋‹ค.

๋”ฐ๋ผ์„œ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š”์ชฝ์ด ๋” ํŽธ๋ฆฌํ•˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐ๋œ๋‹ค.

๋ฐ˜์‘ํ˜•