ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

gRPC๋Š” ์™œ ์‹ค์šฉ์ ์ผ๊นŒ?

์ด ๊ธ€์€ gRPC๋ฅผ ์ ‘ํ•œ ์ง€ ์–ผ๋งˆ ์•ˆ ๋๊ฑฐ๋‚˜ ์ƒˆ๋กญ๊ฒŒ ์•Œ์•„๋ณด๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์„ ๋Œ€์ƒ์œผ๋กœ go, gRPC ๊ทธ๋ฆฌ๊ณ  MSA ํ™˜๊ฒฝ์—์„œ์˜ ์‹ค๋ฌด ๊ฒฝํ—˜์„ ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” gRPC๋Š” ์ธํ”„๋ผ ๊ตฌ์ถ•์— ์žˆ์–ด ๋‹ค์†Œ ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ์žˆ๋Š” ํŽธ์ด์ง€๋งŒ ๊ต‰์žฅํžˆ ์‹ค์šฉ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์ด์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•ด์š”.

 

๋จผ์ €, gRPC๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

gRPC๋Š” ํ•œ ๋ฌธ์žฅ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gRPC๋Š” Protocol Buffer๋ฅผ IDL(Interface Definition Language)๋กœ ์‚ฌ์šฉํ•˜๋Š”
HTTP/2๊ธฐ๋ฐ˜์˜ RPC ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

์ƒ์†Œํ•œ ๋‹จ์–ด๋“ค์ด ๋งŽ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ์š”! ์ž ๊น ๋ช‡ ๊ฐ€์ง€ ์‚ดํŽด๋ณผ๊นŒ์š”?

  • RPC(Remote Procedure Call)
    • RPC๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์›๊ฒฉ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ธฐ์ˆ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•Œ๊ณ  ์žˆ๋Š” RESTful API์™€ ๋น„์Šทํ•œ๋ฐ, ์˜ˆ์ „๋ถ€ํ„ฐ ์กด์žฌํ•˜๋˜ ๊ฐœ๋…์ด์—์š”.
    • ์ด์ „์—๋Š” RESTful์ด ์ข€ ๋” ์ธ๊ธฐ๊ฐ€ ๋งŽ์•„์„œ RPC๊ฐ€ ๋ฌปํ˜€์กŒ๋‹ค(?)๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์–ด์š”.
  • Protocol Buffer
    • gRPC์—์„œ ํ†ต์‹ ์„ ์œ„ํ•œ interface๋ฅผ ์ •์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•&ํ˜•์‹! ์ž…๋‹ˆ๋‹ค.
    • ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” json๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํ†ต์‹  ํ˜•์‹์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
    • ์šฐ๋ฆฌ๊ฐ€ API๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ, interface๋ฅผ ์ •์˜ํ• ํ…๋ฐ ์ด๋ฅผ gRPC์—์„œ๋Š” Protocol Buffer ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์ •์˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๋ณธ๊ฒฉ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— gRPC์˜ ํŠน์ง•๋“ค์„ ๋ช‡ ๊ฐ€์ง€ ์‚ดํŽด๋ณผ๊นŒ์š”?

gRPC์˜ ํŠน์ง•์„ ๋‚˜์—ดํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค!

 

1. IDL ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ ์–ธ์–ด๋ณ„ client ์ฝ”๋“œ์™€ server ๋ผˆ๋Œ€ ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑ(generate)

Protocol Buffer๋กœ ์ž‘์„ฑ๋œ IDL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ ์–ธ์–ด๋ณ„ client ์ฝ”๋“œ&server ๋ผˆ๋Œ€ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์œผ๋กœ ์ž๋™ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ๊ฐ ์–ธ์–ด๋ณ„๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ด๋Š” gRPC์—์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด์š”!
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

  1. API ์ž‘์—… ์‹œ IDL์„ ๊ฐ€์žฅ ๋จผ์ € ์ž‘์„ฑํ•˜๊ธฐ์— ๋‚˜๋ฆ„ ๊ฒ€์ฆ๋œ API ๋ฌธ์„œํ™”
    • PR ๋ฆฌ๋ทฐ์—์„œ ํ˜‘์—…์ž์™€ payload ์ •์˜์— ์˜๊ฒฌ์„ ์ฃผ๊ณ ๋ฐ›๊ธฐ๋„ ํ•ด์š”(๋„ค์ด๋ฐ ๋“ฑ๋“ฑ)
  2. IDL์„ SSOT(Single Source Of Truth)๋กœ ์‚ฌ์šฉ
    • IDL์€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ๋ฌธ์„œ๋ฅผ ์˜๋ฏธํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์†Œํ†ต ๋น„์šฉ์„ ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

2. payload ์••์ถ•๋ฅ ์ด ๋†’์€ Protocol Buffer๋ฅผ ์‚ฌ์šฉ

gRPC์—์„œ๋Š” ์••์ถ•๋ฅ ์ด ๋†’์€ Protocol Buffer๋ฅผ IDL(Interface Definition Language)๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

Protocol Buffer์—๋Š” ์„ฑ๋Šฅ์„ ์œ„ํ•œ ๊ณ ๋ฏผ๋“ค์ด ๋…น์•„์ ธ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์กฐ๊ธˆ ๋’ค์— ์•Œ์•„๋ณด์ฃ !

์ž ์ด์ œ ์œ„์— ๋‚˜์—ดํ•œ ํŠน์ง•๋“ค์„ ํ•œ ๋ฒˆ ํ†บ์•„๋ณด๋„๋กœ์˜ค์˜ค์˜ค์˜ฅ~~ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!!

 

IDL

์œ„์—์„œ ๊ณ„์† ์ด์•ผ๊ธฐํ–ˆ๋˜ IDL์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ์‚ดํŽด๋ด…์‹œ๋‹ค.
๋จผ์ € gRPC์—์„œ IDL ๋ฌธ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Protocol Buffer์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ , ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ํ™œ์šฉ๋˜๋Š”์ง€ ์‚ดํŽด๋ณผ๊ฒŒ์š”!

 

Protocol Buffer์™€ ๊ทธ์˜ ์••์ถ•๋ฅ 

MSA ํ™˜๊ฒฝ์—์„œ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์•„์‹œ๋‹ค์‹œํ”ผ payload ์••์ถ•์€ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ• ์ค‘์—๋Š” ํ•˜๋‚˜์ฃ .

gRPC์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” Protocol Buffer์™€ HTTP/2์—๋Š” ์ด๋Ÿฐ ์••์ถ•๊ณผ ๊ด€๋ จ๋œ ๊ณ ๋ฏผ๋“ค์ด ๋งŽ์ด ๋…น์•„์ ธ ์žˆ๋Š”๋ฐ์š”, ๋จผ์ € Protocol Buffer๊ฐ€ payload๋ฅผ ์–ด๋–ป๊ฒŒ ์••์ถ•ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

Protocol Buffer ๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

  • JSON/XML๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํ˜•์‹์ด๋ฉฐ
  • .proto ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ์— ๊ธฐ๋ก๋˜๊ณ 
  • binary format(์ด์ง„ ํฌ๋งท)์œผ๋กœ ์ €์žฅ๋˜์–ด ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์—†๊ณ 
    (์‚ฌ์‹ค ์ด๋ฅผ ์—ญ์ง๋ ฌํ™”(Unmarshaling)ํ•˜๋ฉด ์ฝ์„ ์ˆ˜ ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค.)
  • ์••์ถ•๋ฅ ์ด ๋†’์•„ JSON/XML์— ๋น„ํ•ด ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

Protocol Buffer์—์„œ๋Š” payload๋ฅผ message ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”, ๋‹ค์Œ๊ณผ ๊ฐ™์ด Person์ด๋ผ๋Š” message๋ฅผ ์ •์˜ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๋„ค์ด๋ฐ ๊ด€๋ จํ•œ ์ปจ๋ฒค์…˜์€ ์—ฌ๊ธฐ์„œ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค)

๊ทธ๋ฆฌ๊ณ  ์œ„ Person ๋ฉ”์‹œ์ง€๋ฅผ Protocol Buffer ํ˜•์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์ด ์กฐ๊ธˆ ๋ณต์žกํ•œ๋ฐ.. ๋ˆˆ์น˜์ฑ„์‹  ๋ถ„๋“ค๋„ ์žˆ๊ฒ ์ง€๋งŒ ์œ„์—์„œ message๋ฅผ ์ •์˜ํ•  ๋•Œ ๊ฐ ํ•„๋“œ์˜ ์˜†์— ์ˆซ์ž๋“ค์ด ๋ณด์ด์‹œ๋‚˜์š”?

์œ„ ์ด๋ฏธ์ง€์˜ ์ขŒ์ธก์„ ์‚ดํŽด๋ณด๋ฉด, field tag์™€ type์„ ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋‘” ์ด์ง„ ํฌ๋งท์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๊ณง payload key๊ฐ’์˜ ์••์ถ•์„ ์˜๋ฏธํ•˜๋Š”๋ฐ์š”! ๋‹ค์Œ jsonํ˜•์‹๊ณผ ๋น„๊ตํ•˜๋ฉฐ ์ดํ•ดํ•ด๋ณด์ฃ 

์œ„ protocol buffer๋กœ ํ‘œํ˜„ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋˜‘๊ฐ™์ด json์œผ๋กœ ํ‘œํ˜„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

// 82bytes
{
    "userName": "Martin",
    "favouriteNumber": 1337,
    "interests": ["daydreaming", "hacking"]
}

์ด ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด 82bytes์ž…๋‹ˆ๋‹ค
๊ทธ๋ฆฌ๊ณ  ์œ„ protocol buffer๋กœ ํ‘œํ˜„๋œ ๊ฒƒ์€ ์ด๋ฏธ์ง€์˜ ์šฐ์ธก ํ•˜๋‹จ ๋ณด๋ฉด 33bytes๋ผ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์–ด์š”.

๋ฐ”๋กœ “userName”, “favouriteNumber”, “interests” ์ด๋Ÿฐ key ๊ฐ’๋“ค์ด ์••์ถ•๋œ ๊ฒƒ์ด์ฃ 

์กฐ๊ธˆ ๊ณผ์žฅ ๋ณดํƒœ์„œ ๋ฌด๋ ค 248% ์••์ถ•๋ฅ ์„ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค..! (82Bytes → 33Bytes)

RESTful์—์„œ๋„ gzip๊ณผ ๊ฐ™์€ ์••์ถ•์„ ์ด์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€? ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์ง€๋งŒ
gRPC๋„ gzip๊ณผ ๊ฐ™์€ ์••์ถ•์„ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ gRPC๋ฅผ ๊ธฐ์ˆ ์ ์œผ๋กœ ์„ ํƒํ•˜๋Š” ์ด์œ ๋Š” ์ด๋Ÿฐ ์••์ถ•๋ฅ ๋ณด๋‹ค IDL์„ ํ™œ์šฉํ•œ ์‹ค์šฉ์„ฑ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

์ด์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์—์„œ ์ข€ ๋” ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

IDL ๊ธฐ๋ฐ˜์˜ Client-Server ์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ

gPRC๋Š” ๊ฐ ์–ธ์–ด๋ณ„๋กœ Client-Server ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ด์ฃผ๋Š” protoc๋ผ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์ž๋™ ์ƒ์„ฑํ•œ Client-Server๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๊ตฌ์กฐ๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๊ณ  ์–ด๋–ค ๊ฒŒ ํšจ์œจ์ ์ธ ๊ฑธ๊นŒ์š”? ๐Ÿค”

์ œ ์ƒ๊ฐ์€ ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

  1. protoc๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ์œผ๋กœ ๊ธฐ์กด Client ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•ด์ค๋‹ˆ๋‹ค.
    ์ด๋Š” ํ•ด๋‹น api๋ฅผ ์‚ฌ์šฉํ•˜๋Š” client service๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์†Œ์œ„ ๋งํ•˜๋Š” N๋ฐฐ์˜ ํšจ์œจ์„ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ฃ .
  1. IDL์„ ๊ธฐ๋ฐ˜์œผ๋กœ Server-Client ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— IDL์ด SSOT(Single Source Of Truth)๊ฐ€ ๋˜์–ด ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋น„์šฉ์„ ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.
    ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ํ•ญ์ƒ API ๋ฌธ์„œํ™”๋Š” API๋ฅผ ๊ฐœ๋ฐœํ•œ ์ดํ›„์— ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์ง€๋งŒ,
    gRPC๋Š” ๊ตฌ์กฐ์ ์œผ๋กœ IDL์„ ๋จผ์ € ์ž‘์„ฑํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์–ด๋Š ์ •๋„ ๊ฒ€์ฆ๋œ API ๋ฌธ์„œํ™”๋ฅผ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.
    ์ €๋Š” ์ด๋Ÿฐ ๊ตฌ์กฐ์  ๊ฐœ์„ ์„ ์ข‹์•„ํ•˜๋Š”๋ฐ์š”, ์ด๋Ÿฐ ๋ฉด์—์„œ gRPC๋Š” ๊ต‰์žฅํžˆ ๊ธ์ •์ ์ž…๋‹ˆ๋‹ค.

 

golang ๊ธฐ์ค€์œผ๋กœ protoc ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์ฝ”๋“œ๋“ค์ด ์ƒ์„ฑ๋˜๋Š”์ง€ ์ž ๊น ์‚ดํŽด๋ณผ๊นŒ์š”?
์—ฌ๊ธฐ ์˜ˆ์‹œ๋กœ content service๋ฅผ ์ •์˜ํ•œ content.protoํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด content.proto ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ protoc ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด

์•„๋ž˜์™€ ๊ฐ™์ด content.pb.go , content_grpc.pb.go ํŒŒ์ผ์ด ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

์ด์ œ ์ด ํŒŒ์ผ๋“ค์—๋Š” ์–ด๋–ค ์ฝ”๋“œ๋“ค์ด ๋“ค์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋ฉด..?

์ด๋ ‡๊ฒŒ ์œ„ content.proto ํŒŒ์ผ์—์„œ ์ •์˜ํ•œ ๋‚ด์šฉ ๊ธฐ๋ฐ˜์œผ๋กœ message์˜ struct์™€ ListContents rpc interface๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

 

์ด๋ ‡๋“ฏ IDL์„ SSOT๋กœ Server-Client ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ golang ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋“ค์„ ์ง€์›ํ•˜๊ณ  ์žˆ์–ด์š”.
(go, java, kotlin, python, swagger, swift, typescript…)

 

 

SSOT์ธ IDL ๊ทธ๋ฆฌ๊ณ  MSA

์†Œ์œ„ ๋งํ•˜๋Š” MSA ํ™˜๊ฒฝ์—์„œ IDL์„ SSOT๋กœ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์žฅ์ ์€ ๊ทน๋Œ€ํ™”๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์„œ๋น„์Šค๊ฐ€ SSOT์ธ IDL์„ ๋ฐ”๋ผ๋ณด๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋‹ˆ

  • ์ •๋ง๋กœ ๋‹ค๋ฅธ ์„œ๋น„์Šค ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌํ˜„์€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๊ณ 
  • ๊ฐ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ตœ์‹ ํ™”๋ฅผ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ณ ๋ฏผํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
    ์ด๊ฑด ์ตœ์‹ ํ™”๋œ IDL์„ generateํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ํ•ด๊ฒฐ๋  ํ…Œ๋‹ˆ๊นŒ์š”.

์ด๋ ‡๊ฒŒ IDL์ด๋ผ๋Š” ๊ทœ์น™์„ ๋งŒ๋“ค์–ด์„œ ๊ตฌ์กฐ์ ์œผ๋กœ ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ ๋˜ํ•œ ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์‹ค์šฉ์  ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

 

์„œ๋“œํŒŒํ‹ฐ API์™€ IDL

์„œ๋“œํŒŒํ‹ฐ API(์™ธ๋ถ€ API)๋ฅผ ์ด์šฉํ•  ๋•Œ๋„ IDL์„ ์ด์šฉํ•˜๋ฉด ๋ฌธ์„œํ™”๋ฅผ ์ฑ™๊ฒจ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IDL option ์ค‘์—์„œ [json_name] option์„ ์ด์šฉํ•˜๋ฉด ์„œ๋“œํŒŒํ‹ฐ API์˜ ํ•„๋“œ๋ช…์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ปค์Šคํ…€ํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”!

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์—…์ž๋“ฑ๋ก๋ฒˆํ˜ธ์™€ ๊ตญ๋ฌธ๋ช…์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ์„œ๋“œํŒŒํ‹ฐ API์˜ Company message๋ฅผ ์ •์˜ํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ํŒ€ ๋‚ด ์ปจ๋ฒค์…˜์— ๋งž๊ฒŒ ๋„ค์ด๋ฐ์„ ๋ณ€๊ฒฝํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

HTTP/2์˜ ์‹ค์šฉ์„ฑ

์—ฌ๊ธฐ์„œ ์ž์„ธํžˆ ๋‹ค๋ฃจ์ง„ ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ,
HTTP/2์—๋„ ๋„คํŠธ์›Œํฌ ๋น„์šฉ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๊ณ ๋ฏผ๋“ค์ด ๋…น์•„์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€์‹ฌ ์žˆ๋Š” ๋ถ„๋“ค์€ ์ฐพ์•„๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„ ํ‚ค์›Œ๋“œ๋“ค ๋ช‡ ๊ฐœ๋ฅผ ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค!

  • ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋ ˆ์ด๋ฐ
  • ํ—ค๋” ์••์ถ•
  • ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ(Multiplexing)
  • TLS ์œ„์—์„œ ๋™์ž‘
  • ๋“ฑ๋“ฑ..

Summary

์—ฌ๊ธฐ๊นŒ์ง€ gRPC๋Š” ์™œ ์‹ค์šฉ์ ์ผ๊นŒ?์— ๋Œ€ํ•ด์„œ ์งง๊ฒŒ ์•Œ์•„๋ดค๋Š”๋ฐ์š” ์ •๋ฆฌํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. IDL(Protocol Buffer)์„ ์ด์šฉํ•ด ๋‚˜๋ฆ„ ๊ฒ€์ฆ๋œ API์™€ ๋ฌธ์„œํ™”๋ฅผ ๊ฐ•์ œ
    IDL์ •์˜ → ๊ฐœ๋ฐœ ์˜ ๊ณผ์ •์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ์— API ์š”์ฒญ-์‘๋‹ต์ด ๊ฒ€์ฆ๋˜์–ด ์žˆ๊ณ 
    API ๋ฌธ์„œํ™”๊ฐ€ ๊ตฌ์กฐ์ ์œผ๋กœ ๊ฐ•์ œ๋จ.
    SSOT(Single Source Of Truth)๋กœ ์ด์šฉํ•˜์—ฌ ์†Œํ†ต ๋น„์šฉ ์ ˆ์•ฝ
  1. Client-Server ์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ์œผ๋กœ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ
    ๊ฐ ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ protoc!! ์ด๊ฑด ํžˆํŠธ๋‹ค..
    golang์€ gomock์„ ์ด์šฉํ•˜๋ฉด mock code๊นŒ์ง€ ์ž๋™ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•ด์š”!
  1. ๊ณ ์„ฑ๋Šฅ ํ†ต์‹ ์œผ๋กœ ๋„คํŠธ์›Œํฌ ๋น„์šฉ ์ ˆ์•ฝ
    ์‹ค์ „ ๊ฒฝํ—˜์ƒ client ํ†ต์‹ ์ด ๋งŽ์•„ ์ด๊ฑด ์ข€ ๋Š๋ฆฐ ๊ฒƒ ๊ฐ™์€๋ฐ? ์‹ถ์€ ๊ฒƒ๋„ ๋น ๋ฅด๊ณ 
    ์—ฌ๊ธฐ์„œ ์ž์„ธํžˆ ๋‹ค๋ฃจ์ง€ ์•Š์•˜์ง€๋งŒ HTTP/2์— ๋…น์•„์ ธ ์žˆ๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ณ ๋ฏผ๋“ค๋„ ํ•œ๋ชซํ•ฉ๋‹ˆ๋‹ค
    (+ golang์˜ goroutine์„ ์ด์šฉํ•œ ๊ณ ์„ฑ๋Šฅ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋Š” ๋ค!)

๋งˆ์น˜๋ฉฐ

์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ์ด ๊ธ€์„ ์ฝ๊ณ  gRPC์— ํฅ๋ฏธ๊ฐ€ ์ƒ๊ธฐ์…จ๋‚˜์š”?

์ด ๊ธ€์— ๋‹ด๊ณ  ์žˆ๋Š” ๋‚ด์šฉ๋“ค์„ ๋ณด๋ฉด MSA ํ™˜๊ฒฝ์—์„œ gRPC์˜ ํšจ์œจ์ด ๊ทน๋Œ€ํ™”๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„ ๋ฌผ๋ก  MSA ํ™˜๊ฒฝ์ด๋ผ๋ฉด gRPC๋ฅผ ๋ฌด์กฐ๊ฑด ์‚ฌ์šฉํ•ด๋ผ! ๋ผ๋Š” ๊ฑด ์•„๋‹™๋‹ˆ๋‹ค.
gRPC๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ”„๋ผ ๋“ฑ ํ’€์–ด์•ผ ํ•  ๋ฌธ์ œ๋“ค์ด ๋ช‡ ๊ฐ€์ง€ ์กด์žฌํ•˜๊ณ , ์•„์ง ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋งŽ์ด ์—†๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ gRPC๋ฅผ ๋„์ž…ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด์žˆ๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด ์ €์˜ ๋Œ€๋‹ต์€ Wht Not? ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฌด์—‡๋ณด๋‹ค ์šด์˜์—์„œ ๊ฐ ์ƒํ™ฉ์— ๋งž๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ํ•ญ์ƒ ํ•„์š”ํ•˜๊ธฐ์—
์—”์ง€๋‹ˆ์–ด๋กœ์„œ ์ ์ ˆํ•œ ์„ ํƒ์„ ๊ทธ๋ฆฌ๊ณ , ์ž์ฃผ ์„ ํƒํ•˜์…จ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ธด ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ™

๋ฐ˜์‘ํ˜•