Lorawan-stack: gogo proto ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฏธ๋ž˜ ์กฐ์‚ฌ

์— ๋งŒ๋“  2020๋…„ 06์›” 25์ผ  ยท  15์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: TheThingsNetwork/lorawan-stack

์š”์•ฝ

https://github.com/gogo/protobuf ๋Š” ๋” ์ด์ƒ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://github.com/gogo/protobuf/issues/691 (ํ˜„์žฌ)

์™œ ์ด๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

๋” ๋งŽ์€ ํŒจํ‚ค์ง€๊ฐ€ ์˜์กดํ•˜๋Š” ์ƒˆ๋กœ์šด golang/protobuf ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์šฐ๋ฆฌ์˜ ์ข…์†์„ฑ์ด๋ฏ€๋กœ ์ง์ ‘ ์ข…์†์„ฑ์˜ ์˜ค๋ž˜๋œ ๋ฒ„์ „์— ๋”ฐ๋ผ golang/protobuf ๋ฒ„์ „์„ ๊ต์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ํŒจํ‚ค์ง€ ๊นจ๊ธฐ

์ด๋ฏธ ๊ฑฐ๊ธฐ์— ๋ฌด์—‡์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ ๋ฌด์—‡์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

gogo/protobuf ์ข…์†์„ฑ

์—†์–ด์ง„ ๋ฌผ๊ฑด ์žˆ์–ด์š”? ๋ญ๋ฅผ๋ณด๊ณ  ์‹ถ์œผ์„ธ์š”?

์ด๊ฒƒ์„ ์•Œ์•„๋‚ด์‹ญ์‹œ์˜ค

์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ?

์ƒˆ๋กœ์šด ๋ฉ”์ธํ…Œ์ด๋„ˆ๊ฐ€ ๋‚˜ํƒ€๋‚ ์ง€ ์•„๋‹ˆ๋ฉด ๊ธฐ๋Šฅ ํŒจ๋ฆฌํ‹ฐ๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋‚˜ํƒ€๋‚ ์ง€ ์•Œ์•„๋‚ด์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๋ฐ”๋‹๋ผ protobuf๋งŒ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ?

ํ…Œ์ŠคํŠธ

์ด ์ž‘์—…์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๊ณ  Pull Request๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค

dependencies technical debt

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์˜คํ”„๋ผ์ธ์—์„œ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์Œ ์ฃผ์— ํ†ตํ™”๋ฅผ ๊ณ„ํšํ•˜์„ธ์š”.

์ด ๊ณ ํ†ต์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ 1~2์ฃผ ์•ˆ์— ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋งŽ์€ ๊ฐˆ๋“ฑ์„ ์ผ์œผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์†์„ ๊ฐ€์ง€๋ ค๋ฉด ์–ด๋–ค ๊ฒฝ์šฐ์— ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€ ์ •ํ™•ํžˆ ์•Œ๊ณ , ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์ž‘์—…์„ ๋‚˜๋ˆ„๊ณ , ์ƒ์„ ์ฃผ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  15 ๋Œ“๊ธ€

GoGo์— ๋Œ€ํ•œ ์ง€์› ์ค‘๋‹จ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ
https://github.com/envoyproxy/protoc-gen-validate/pull/340

์•ž์œผ๋กœ ๊ฐ€๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ƒํƒœ๊ณ„๋ฅผ ๋”ฐ๋ฅด๊ณ  gogo/protobuf์—์„œ ๋ฉ€๋ฆฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋‹ค๋ฅธ ์ข…์†์„ฑ์ด ์ ์  ๋” gogo์—์„œ ๋ฉ€์–ด์ง์— ๋”ฐ๋ผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์ ์  ๋” ์–ด๋ ค์›Œ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๋ฉด ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๊ฒฝ์šฐ ์ข‹์€ ๊ณ„ํš์„ ์„ธ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@rvolosatovs๋Š” ์•„๋งˆ๋„ ์šฐ๋ฆฌ์˜ gogottn ์ƒ์„ฑ๊ธฐ์— ์„ค์ •๋œ ์‚ฌ์šฉ์ž ์ง€์ • ์˜ต์…˜์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ proto ํŒŒ์ผ์—์„œ ๋ช…์‹œ์  ์˜ต์…˜์— ๋Œ€ํ•ด ์ฐพ์€ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • gogoproto.customname , gogoproto.stdtime ๋ฐ gogoproto.stdduration ๋ฐ goproto_enum_prefix ์˜ต์…˜์„ ์ œ๊ฑฐํ•˜์—ฌ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฒฐ๊ณผ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ฆ‰์‹œ ๋ถˆํ‰ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฑฐํ•˜๊ธฐ๊ฐ€ ๋น„๊ต์  ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • gogoproto.embed ์˜ต์…˜์„ ์ œ๊ฑฐํ•˜๋ฉด ํฌํ•จ๋œ ํ•„๋“œ์— ๋” ์ด์ƒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์œผ๋ฉฐ(Go ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋จ) ๋ฉ”์‹œ์ง€๊ฐ€ ๋” ์ด์ƒ ์ผ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถฉ์กฑํ•˜์ง€ ์•Š์Œ(์ด๋Š” ๋” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ)์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • gogoproto.nullable ์˜ต์…˜์€ ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด getter ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ•˜๊ณ  nil-checks๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ๋ฌธ์ œ๋Š” Go ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ๋น„๊ณต๊ฐœ๋กœ ๋งŒ๋“  ๋‹ค์Œ getter/setter๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•„๋“œ๋ฅผ ๋‹ค์‹œ ๊ณต๊ฐœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ƒ๋‹นํžˆ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ gogoproto.customtype ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•„๋“œ์™€ gogoproto.enum_stringer ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ์—ด๊ฑฐํ˜•์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด JSON์œผ๋กœ ๋งˆ์ƒฌ๋ง/๋น„์ •๋ ฌํ™”๋˜๋Š” ๋ฐฉ์‹์„ ์ž์ฃผ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. EUI, DevAddr ๋“ฑ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ •์˜ bytes ํ•„๋“œ์˜ ๊ฒฝ์šฐ ์œ ํ˜•(ํ”„๋กœํ†  ๋ฉ”์‹œ์ง€์—์„œ)์„ string (๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜ธํ™˜ ๊ฐ€๋Šฅ)๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ œ (UnmarshalJSON์—์„œ) ๋ฌธ์ž์—ด๊ณผ ์ •์ˆ˜๋กœ ๋ชจ๋‘ ํ—ˆ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— JSON API๊ฐ€ ๊นจ์งˆ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์–ด์ฉŒ๋ฉด ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์˜ v4 API์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ์— ์ข‹์€ ์‹œ๊ฐ„์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋” ๋งŽ์€ (API ๊นจ๋Š”) ๋†€๋ผ์›€์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋จผ์ € https://github.com/alta/protopatch๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๋Š” ๊ฒƒ

  • ์šฐ๋ฆฌ์˜ ๋ชจ๋“  ์š”๊ตฌ ์‚ฌํ•ญ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ -> ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ณ  ์ด์— ๋Œ€ํ•ด ์žŠ์–ด๋ฒ„๋ฆฌ์‹ญ์‹œ์˜ค( api ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰ ๋ฐ ๋ฐ”๊พธ๊ธฐ
  • ์šฐ๋ฆฌ์˜ ์š”๊ตฌ ์‚ฌํ•ญ ์ค‘ ์ผ๋ถ€๋งŒ ํฌํ•จ๋˜๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์˜ต์…˜์ด ์žˆ๋Š” ๊ฒฝ์šฐ -> ์˜ต์…˜๋ณ„๋กœ ํ‰๊ฐ€ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์˜ต์…˜์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์•„๋งˆ๋„ protopatch ๊ธฐ์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋ ฅ์ด ์ ์€ ๊ธฐ๋Šฅ. ์ด๊ฒƒ์€ ์˜ต์…˜์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ - customtype ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ IMO๋Š” ํ™•์‹คํžˆ ๊ธฐ์—ฌ๋ฅผ ์ •๋‹นํ™”ํ•˜์ง€๋งŒ stdtime ์™€ ๊ฐ™์€ ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ๋Š” ๋Ÿฐํƒ€์ž„์— ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๊ธฐ๋ณธ protobuf protos๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์˜ค๋Š˜ ์ œ๊ณต๋œ protobuf ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ).
(์—ญ)์ง๋ ฌํ™”๋ฅผ ์œ„ํ•ด์„œ๋งŒ protobuf๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๋ถ€์ ์œผ๋กœ ์ผ๋ฐ˜ ๋ฐ”๋‹๋ผ ์ƒ์„ฑ Go ํ”„๋กœํ† ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด NS:

  1. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ *ttnpb.EndDevice (๋ฐ”๋‹๋ผ ์ƒ์„ฑ Go ์œ ํ˜•) ๊ฐ€์ ธ์˜ค๊ธฐ, ์ €์žฅ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ์—์„œ ์—ญ์ง๋ ฌํ™”
  2. *ttnpb.EndDevice ๋ฅผ T_device . (์ฐธ๊ณ : ์•„๋งˆ๋„ ์ฒ˜์Œ์— ๋˜๋Š” ์˜์›ํžˆ ๋ž˜ํผ์ผ ์ˆ˜ ์žˆ์Œ)
  3. NS์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ T_device
  4. T_device ์„ *ttnpb.EndDevice (์ฐธ๊ณ : ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์ž‘์—…์€ ๊ฐ„๋‹จํ•˜๊ณ  ๋งค์šฐ ๋น ๋ฅธ ์ž‘์—…์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋œ ํ•„๋“œ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๊ณ  ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ง์ ‘)
  5. *ttnpb.EndDevice , ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ ์ง๋ ฌํ™”

์ฐธ์กฐ https://github.com/TheThingsNetwork/lorawan-stack/issues/342 (์ƒ์„ฑ๋œ ์ธ๊ตฌ)

๋‚˜๋Š” gogo์— ๋Œ€ํ•œ (์ž‘์€) ๋Œ€์•ˆ์— ์ฐฌ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์บ”์„ ๋ฐ€์–ด๋‚ด๋Š” ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์ธ์ง€ ๋‹ค์‹œ ๊ฒฐ์ •ํ•ด์•ผ ํ•  ๋•Œ ๊ฐ€๋Šฅํ•œ ํ•œ ๋ฐ”๋‹๋ผ๋กœ ์œ ์ง€ํ•ฉ์‹œ๋‹ค.

์ƒ์„ฑ๋œ ํ”„๋กœํ† ์Šค์— ๋ชจ๋“  ๊ณณ์—์„œ ์˜์กดํ•˜๋Š” ๋Œ€์‹  ์ผ๋ถ€ ์žฅ์†Œ์—์„œ ์ค‘๊ฐœ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ฐœ์ฒด(DAO: ์‚ฌ์šฉ ๋ฐฉ๋ฒ•)์—์„œ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐœ์ฒด(DTO: proto, ์ €์žฅ์šฉ)๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ฃผ๋กœ ์ฝ๊ธฐ๋ผ๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•˜๊ณ  ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, T_device ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ „์ฒด NS ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ํŠน์ • ๊ตฌ์กฐ์ฒด ๋ฐ/๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์„ 11์›”๋กœ ์˜ฎ๊ธฐ์ž

@rvolosatovs ์‚ฌ์šฉ์ž ์ง€์ • JSON ๋งˆ์ƒฌ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”๋‹๋ผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ฐ˜๋Œ€ ์˜๊ฒฌ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ฐ”๋‹๋ผ ํ”„๋กœํ† ์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ง‰๋Œ€ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ถ€๋‹ด๊ณผ ์ƒ์šฉ๊ตฌ์˜ ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ €๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋จผ์ € ๊ฐ„๋‹จํ•˜๊ณ  ๋ฐฉํ•ด๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋Œ€์•ˆ์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๋ฉด ์ด ๋ชจ๋“  ๊ฒƒ์„ ์žฌ์ž‘์—…ํ•˜๋Š” ๋ฐ ์˜์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์˜์กดํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์–ด๋Š ์‹œ์ ์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ์ƒํƒœ๋กœ ๋๋‚ ๊นŒ๋ด ๋‘๋ ต์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•ด์„œ, ๋‚˜๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋ฐ”๋‹๋ผ์— ๊ฐ€๊น๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์— ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด nil ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ž์ฃผ ํ™•์ธํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ์ดˆ๊ธฐํ™”๋œ ๊ตฌ์กฐ์ฒด ๋Œ€์‹  ์„ค์ •๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ์ ์—์„œ ์œ ๋ฆฌํ•˜๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•˜๋“  ๊ณ ํ†ต์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ (gogo ์ƒ์„ฑ) proto ๊ตฌ์กฐ์ฒด๋Š” ์ง€๊ธˆ ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(gRPC API, HTTP API, ์ด๋ฒคํŠธ, ์˜ค๋ฅ˜, ๋‚ด๋ถ€์ ์œผ๋กœ, Redis DB ๋“ฑ). ์šฐ๋ฆฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ๊ณผ ํ˜„์žฌ์˜ ๋ชจ์Šต์„ ๋™์‹œ์— ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋ ค์šด ์š”๊ตฌ ์‚ฌํ•ญ์€ v3 API์˜ ํ˜ธํ™˜์„ฑ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ƒํ™ฉ์„ v4 API(์ ์–ด๋„ ๋‚ด๋ถ€์ ์œผ๋กœ) ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ์ˆœ๊ฐ„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋”๋ผ๋„ ๊ธฐ์กด ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ํ•ด๋‹น v3 API๋ฅผ ๊ณ„์† ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์žฅ๊ธฐ์ ์œผ๋กœ (๋ฒ„์ „์ด ์žˆ๋Š”, ์ฃผ์š” ๋‚ด ์•ˆ์ •) ์™ธ๋ถ€ API๋ฅผ ๋‚ด๋ถ€(๋ฒ„์ „์ด ์ง€์ •๋˜์ง€ ์•Š์€, ๋ถ€ ๋‚ด ์•ˆ์ •) API์™€ (๋ฒ„์ „์ด ์ง€์ •๋œ, ์•ˆ์ •์ ์ธ) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฌธ์„œ์—์„œ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ์šฐ๋ฆฌ ์Šค์Šค๋กœ์—๊ฒŒ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. . ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚ด๋ถ€ API์™€ ๋‹ค๋ฅธ API ๊ฐ„์— ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹จ๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

JSON

v3 JSON API ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฒซ ๋ฒˆ์งธ TODO๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์œ ํ˜•์„ ๋งˆ์ƒฌ๋ง/๋งˆ์ƒฌ๋ง ํ•ด์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๋Š” JSON ๋งˆ์ƒฌ๋Ÿฌ ๋ฐ ์–ธ๋งˆ์ƒฌ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Go์˜ ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ์šฉ JSON ํ˜•์‹ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์•ˆ์ •์„ฑ ์•ฝ์†์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ grpc-gateway ๋Ÿฐํƒ€์ž„์—์„œ ์ฝ”๋ฑ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ {gogo,golang}/protobuf์˜ jsonpb ๋Œ€์‹  ์ž์ฒด (์ƒ์„ฑ๋œ) (un) ๋งˆ์ƒฌ๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋ฑ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ํ”„๋กœํ† ํƒ€์ž… _์˜†์—_ ์ƒˆ ํ”„๋กœํ† ํƒ€์ž… ์ƒ์„ฑ

๋‚˜๋Š” ์ด๋ฏธ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๋‹ค: https://github.com/TheThingsNetwork/lorawan-stack/commit/a41f62d98ae7ee719b576e6fcd2009a79cd38f4c

์ด๊ฒƒ์€ protobuf๊ฐ€ ์œ ํ˜• ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฏ€๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ด์ „ proto์—์„œ golang_proto.RegisterType ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์ž ์žฌ์ ์œผ๋กœ google.protobuf.Any ํ•ด๊ฒฐ์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ค๋ฅ˜ ๋ฐ ์ด๋ฒคํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํŠน์ • ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ํ”„๋กœํ† ํƒ€์ž…๊ณผ ์ƒˆ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ„์— ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ

์ด๊ฒƒ์€ ์ „ํ™˜ ๊ธฐ๊ฐ„ ๋™์•ˆ์—๋งŒ ํ•ด๋‹น๋˜์ง€๋งŒ ์žฅ๊ธฐ์  ์†”๋ฃจ์…˜์„ ์œ„ํ•ด ์œ ์‚ฌํ•œ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜์”ฉ ์—…๋ฐ์ดํŠธ

https://github.com/TheThingsNetwork/lorawan-stack/commit/cd7d75c8b42ad15eee1ac594ff6d0f2d5a75eb67 ์—์„œ ๊ฐ„๋‹จํ•œ ์„œ๋น„์Šค๋กœ ์ด๋ฏธ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋” ๋ณต์žกํ•œ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ ํ™•์‹คํžˆ ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ grpc ์„œ๋น„์Šค ์ž์ฒด๋งŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. grpc-gateway๋Š” ์—ฌ์ „ํžˆ JSON ์ธก์—์„œ ์ด์ „ gogo ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‚ด๋ถ€ gRPC ์„œ๋ฒ„๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ์ƒˆ ๊ตฌํ˜„์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ผ๋ถ€ ์ดˆ๊ธฐ ์ข…์†์„ฑ ์—…๋ฐ์ดํŠธ ๋ฐ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ํ‘ธ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/TheThingsNetwork/lorawan-stack/compare/issue/2798-codec

์ ์  ๋” ๋งŽ์€ ์ข…์†์„ฑ์ด protobuf 1.4 ๋ฐ V2 API๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ๋” ์˜ค๋ž˜ ์œ ์ง€ํ• ์ˆ˜๋ก ์ข…์†์„ฑ์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์ œ์— ๋” ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ผ์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜คํ”„๋ผ์ธ์—์„œ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์Œ ์ฃผ์— ํ†ตํ™”๋ฅผ ๊ณ„ํšํ•˜์„ธ์š”.

์ด ๊ณ ํ†ต์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ 1~2์ฃผ ์•ˆ์— ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋งŽ์€ ๊ฐˆ๋“ฑ์„ ์ผ์œผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์†์„ ๊ฐ€์ง€๋ ค๋ฉด ์–ด๋–ค ๊ฒฝ์šฐ์— ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€ ์ •ํ™•ํžˆ ์•Œ๊ณ , ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์ž‘์—…์„ ๋‚˜๋ˆ„๊ณ , ์ƒ์„ ์ฃผ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„:

  1. @rvolosatovs ๋Š” ๋„๊ตฌ๋ฅผ "๋ฐ”๋‹๋ผ"์— ์ตœ๋Œ€ํ•œ ๊ฐ€๊น๊ฒŒ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    • unconvert , gofumpt ๋ฐ protoc ์œ„์—์„œ ์ˆ˜ํ–‰ ์ค‘์ธ ๊ธฐํƒ€ ์ž‘์—…์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    • protoc-gen-gogottn ์—์„œ protoc-gen-gofast (๋˜๋Š” ๋ฐ”๋‹๋ผ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ)์œผ๋กœ ์ „ํ™˜

    • proto ํŒŒ์ผ์— (gogoproto.*) ์˜ต์…˜์„ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ ํ˜„์žฌ์™€ ๋™์ผํ•˜๊ฒŒ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

  2. ์ง์ ‘ ํ•„๋“œ ์•ก์„ธ์Šค ๋Œ€์‹  Getters๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. gopls ๋ฐ rf ์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. (gogoproto.*) ์˜ต์…˜์„ ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. gopls ๋ฐ rf ์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • gogoproto.populate ์ œ๊ฑฐ ๋ฐ ํ…Œ์ŠคํŠธ ์—…๋ฐ์ดํŠธ (https://github.com/TheThingsNetwork/lorawan-stack/issues/342)

    • gogoproto.customname ์ œ๊ฑฐ ๋ฐ EUI -> Eui ๋“ฑ

    • gogoproto.embed ์ œ๊ฑฐ . ๋ฉ”์‹œ์ง€๊ฐ€ ValidateContext(context.Context) error ๋ฐ ExtractRequestFields(m map[string]interface{}) ์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ณ„์† ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • gogoproto.nullable ์ œ๊ฑฐํ•˜๊ณ  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ Getters๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด nil ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • ...

@rvolosatovs v3.11.3 ์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์™„๋ฃŒ๋˜๋ฉด ๋‹ค๋ฅธ ๋‹ด๋‹น์ž๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์‹œ ๋…ผ์˜ํ•ฉ์‹œ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰