[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