[gRPC] proto (protocol buffer) ๋ฌธ๋ฒ•

proto๋ž€?

grpc์—์„œ ํ†ต์‹  ๊ทœ๊ฒฉ์„ ์ •์˜ํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„๋‹ค.
grpc๋Š” ์‚ฌ์‹ค ๋˜๋‹ค๋ฅธ ๊ตฌ๊ธ€์˜ ์ž์ฒด ํฌ๋งท์ธ protobuf๋ผ๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋ฐ, ๊ทธ ํ˜•ํƒœ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

.proto ํŒŒ์ผ์„ ํ•œ๋ฒˆ๋งŒ ์ž˜ ๋งŒ๋“ค์–ด๋‘๋ฉด, ์ฃผ๋Š” ์ชฝ์ด๋‚˜ ๋ฐ›๋Š” ์ชฝ์ด๋‚˜ ์•ฝ์†๋œ๋Œ€๋กœ ํ†ต์‹ ์„ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.




๋ฒ„์ „ ๋ฌธ์ œ

ํŠน๋ณ„ํ•œ ์ผ์ด ์—†๋‹ค๋ฉด ๋ณดํ†ต ์ตœ์‹  ํ‘œ์ค€์ธ proto3์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ํ…๋ฐ, ๊ทธ๋Ÿฌ๋ ค๋ฉด ํ•ญ์ƒ ์ƒ๋‹จ์—

syntax = "proto3";

์ •์˜๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค.

์ด๊ฒŒ ์—†์œผ๋ฉด ์ด์ „๋ฒ„์ „์ธ proto2๋กœ ์ธ์‹ํ•ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.




ํƒ€์ž…

grpc๋Š” ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ƒ๊ธฐํ•œ protobuf๋ผ๋Š” ํฌ๋งท์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์••์ถ•ํ•ด ์ „๋‹ฌํ•œ๋‹ค.

๊ธฐ์กด์— ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋˜ json ๋“ฑ์˜ ํฌ๋งท์€ ๋Œ€์ถฉ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ์ฝ๊ธฐ๋„ ํŽธํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฅผ ์Œฉ ๋ฌธ์ž์—ด๋กœ ์˜์•„๋ณด๋‚ด๋Š” ํ˜•ํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๋ž˜๋„ ๋น„ํšจ์œจ์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ํŽธ์ด๋‹ค.

๊ทธ์™€ ๋‹ค๋ฅด๊ฒŒ protobuf๋Š” ์—„๊ฒฉํ•œ ํƒ€์ž… ์ •์˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ฐ€๊ณตํ•ด์„œ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ํ›จ์”ฌ ๊ฐ€๋ฒผ์›Œ์ง€๋Š” ๊ฒƒ์ด๋‹ค.

protobuf์˜ ๊ธฐ๋ณธ ํƒ€์ž…๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
์ผ๋ฐ˜์ ์ธ ์–ธ์–ด๋“ค์™€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€๋Š” ์•Š๋‹ค.
๋ถ€๋™์†Œ์ˆ˜์ , ์ •์ˆ˜, ๋ถˆ๋ฆฐ, ๋ฌธ์ž์—ด ๋“ฑ์ด ์ œ๊ณต๋œ๋‹ค.




๋ฉ”์„ธ์ง€ ํƒ€์ž…

๊ทธ๋Ÿผ ์ด์ œ ์ € ํƒ€์ž…๋“ค๋กœ ์ฃผ๊ณ ๋ฐ›์„ ๋ฉ”์„ธ์ง€ ํƒ€์ž…์„ ์ •์˜ํ•ด๋ณด์ž.
๊ทธ๋ƒฅ ์ผ์ข…์˜ ๊ตฌ์กฐ์ฒด์™€ ๊ฐ™๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

๋ฉ”์„ธ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

message ๋ฉ”์„ธ์ง€ํƒ€์ž…๋ช… {
  ํƒ€์ž…1 ํ•„๋“œ๋ช…1 = ์ˆœ์„œ;
  ํƒ€์ž…2 ํ•„๋“œ๋ช…2 = ์ˆœ์„œ;
}

ํƒ€์ž…๊ณผ ํ•„๋“œ๋ช… ์™ธ์— ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ๊ฝค ํŠน์ดํ•œ ์ ์ธ๋ฐ, ์ด๋ ‡๊ฒŒ ํ•ด์•ผ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ํ•œ๋ฒˆ ์ •ํ•ด๋†“๊ณ  ์‚ฌ์šฉ์ค‘์ธ ์ˆœ์„œ๋Š” ๋ฐ”๊พธ๋ฉด ์•ˆ๋œ๋‹ค. ํ˜ธํ™˜์„ฑ์ด ๊นจ์ง„๋‹ค.
์ •ํ™•ํžˆ๋Š” field number๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋งŒ์•ฝ ์–ด๋–ค ์‚ฌ๋žŒ์˜ ์ด๋ฆ„๊ณผ ๋‚˜์ด๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

syntax = "proto3";

message PersonInfo {
  string name = 1;
  int32 age = 2;
}



์—ด๊ฑฐ ํƒ€์ž…

๋Œ€๋‹ค์ˆ˜์˜ ์–ธ์–ด์—์„œ ์ œ๊ณตํ•˜๋Š” ์—ด๊ฑฐํ˜•๊ณผ ๋™๋“ฑํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

์—ด๊ฑฐ๋Š” ๋‹ค์Œ ํ˜•ํƒœ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

enum ์—ด๊ฑฐ๋ช… {
    ํ•„๋“œ๋ช… = 0;
    ํ•„๋“œ๋ช…2 = 1;
    ...
}

๋งŒ์•ฝ ์ƒ‰์ƒ์„ ์˜๋ฏธํ•˜๋Š” ์—ด๊ฑฐ๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

syntax = "proto3";

enum Color {
    RED = 0;
    BLUE = 1;
    GREEN = 2;
}

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ”์„ธ์ง€์— ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

syntax = "proto3";

message Product {
  string name = 1;

  enum Color {
    RED = 0;
    BLUE = 1;
    GREEN = 2;
  }
  Color color = 2;

  int64 price = 3;
}



๋ฐฐ์—ด ์ฒ˜๋ฆฌ

๋ฐฐ์—ด์˜ ํ‘œํ˜„์€ repeated๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ์ƒํ’ˆ์ •๋ณด์— ์นดํ…Œ๊ณ ๋ฆฌ ๋ฌธ์ž์—ด ๋ชฉ๋ก์„ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

syntax = "proto3";

message Product {
  string name = 1;
  int64 price = 2;
  repeated string categoryList = 3
}



๋ฉ”์„ธ์ง€ ์ค‘์ฒฉ

๋ฉ”์„ธ์ง€๋กœ ํ•˜๋‚˜์˜ ํƒ€์ž…์œผ๋กœ ์ทจ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž…์ฒ˜๋Ÿผ ๋ฉ”์„ธ์ง€์— ๋ฉ”์„ธ์ง€๋ฅผ ๋˜ ์ค‘์ฒฉํ•ด๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

syntax = "proto3";

message WishList {
   int32 customerCode = 1;

   message Product {
     string name = 1;
     int64 price = 2;
     repeated string categoryList = 3
   }
   repeated Product productList = 2
}

๋ณดํ†ต 2-3์ค‘์ฒฉ ์ •๋„๋Š” ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.




์„œ๋น„์Šค

๊ทผ๋ฐ ํƒ€์ž…๋งŒ ์ฃผ๊ตฌ์žฅ์ฐฝ ๋งŒ๋“ค๋ฉด ๋ญํ•˜๊ฒ ๋Š”๊ฐ€? ์‹ค์ œ๋กœ ๋ญ˜ ์ฃผ๊ณ ๋ฐ›์„์ง€๋„ ์ •ํ•ด์•ผ์ง€.
๊ทธ๊ฒŒ ๋ฐ”๋กœ ์„œ๋น„์Šค๋‹ค.

์„œ๋น„์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด, ํ•จ์ˆ˜์˜ ๋ฌถ์Œ์œผ๋กœ ์ •์˜๋œ๋‹ค.

service ์„œ๋น„์Šค๋ช… {
  rpc ํ•จ์ˆ˜๋ช…(์š”์ฒญ๋ฉ”์„ธ์ง€) returns (์‘๋‹ต๋ฉ”์„ธ์ง€);
  rpc ํ•จ์ˆ˜๋ช…2(์š”์ฒญ๋ฉ”์„ธ์ง€2) returns (์‘๋‹ต๋ฉ”์„ธ์ง€2);
  ...
}
service SearchService {
  rpc Search(SearchRequest) returns (SearchResponse);
}

๊ทธ๋ ‡๊ฒŒ ํŠน๋ณ„ํ•  ๊ฒƒ์€ ์—†๋‹ค. ๊ฐ„๋‹จํ•˜๋‹ค.



์ฐธ์กฐ
https://developers.google.com/protocol-buffers/docs/proto3