๐Ÿ”ฅ gRPC๋กœ ์žฅ์• ๋‚ธ ์‚ฌ๋žŒ์ด ์ •๋ฆฌํ•ด ๋ณธ gRPC

neunghiยท2025๋…„ 3์›” 15์ผ
0

NETWORK

๋ชฉ๋ก ๋ณด๊ธฐ
2/6
post-thumbnail

๐Ÿ”ฅ gRPC๋ž€?

gRPC (Google Remote Procedure Call)๋Š” Google์ด ๋งŒ๋“  ์˜คํ”ˆ์†Œ์Šค ์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ(RPC) ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๊ณ ์„ฑ๋Šฅ, ๋‹ค์ค‘ ์–ธ์–ด ์ง€์›, HTTP/2 ๊ธฐ๋ฐ˜์˜ ํ†ต์‹ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด?
๐Ÿ’ก ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋กœ ์›๊ฒฉ์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•˜๋“ฏ์ด ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ!

๐ŸŽฏ gRPC์˜ ์ฃผ์š” ํŠน์ง•

1๏ธโƒฃ HTTP/2 ๊ธฐ๋ฐ˜ โ†’ ๋น ๋ฅด๊ณ  ํšจ์œจ์  ๐Ÿš€

  • ๊ธฐ์กด REST API๋Š” HTTP 1.1์„ ์‚ฌ์šฉ โ†’ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ๋งบ์Œ (๋น„ํšจ์œจ์ , ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ )
  • gRPC๋Š” HTTP/2 ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ ์ง€์› โ†’ ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ์—์„œ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌ

2๏ธโƒฃ Protocol Buffers(ํ”„๋กœํ† ๋ฒ„ํ”„) ์‚ฌ์šฉ ๐Ÿ“ฆ

  • JSON ๋Œ€์‹  ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹(.proto) ์‚ฌ์šฉ โ†’ ๋น ๋ฅด๊ณ  ๊ฐ€๋ณ๋‹ค
  • ์ž๋™ ์ฝ”๋“œ ์ƒ์„ฑ ์ง€์› โ†’ ๋‹ค์–‘ํ•œ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

3๏ธโƒฃ ๋‹ค์–‘ํ•œ ํ†ต์‹  ๋ฐฉ์‹ ์ง€์› ๐Ÿ”„

  • Unary (๊ธฐ๋ณธ ์š”์ฒญ-์‘๋‹ต): ํด๋ผ์ด์–ธํŠธ โ†’ ์„œ๋ฒ„ ์š”์ฒญ ํ›„ ์‘๋‹ต ๋ฐ›์Œ (REST API์™€ ๋™์ผ)
  • Server Streaming: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ์‘๋‹ต์„ ์ŠคํŠธ๋ฆฌ๋ฐ
  • Client Streaming: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์„œ๋ฒ„๊ฐ€ ํ•œ ๋ฒˆ์— ์‘๋‹ต
  • Bidirectional Streaming: ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€๋Šฅ

4๏ธโƒฃ ๋‹ค์ค‘ ์–ธ์–ด ์ง€์› ๐ŸŒŽ

  • Java, Python, Go, Node.js, C++, C#, Rust ๋“ฑ ๋‹ค์–‘ํ•œ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

5๏ธโƒฃ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ & ์ธ์ฆ ์ง€์› ๐Ÿ”

  • NLB, ALB์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ (๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์ง€์›)
  • TLS/SSL์„ ์ด์šฉํ•œ ๋ณด์•ˆ ๊ธฐ๋Šฅ ์ œ๊ณต

gRPC vs REST API ๋น„๊ต

๐Ÿš€ gRPC๋ฅผ ์–ธ์ œ ์จ์•ผ ํ• ๊นŒ?

โœ… ๊ณ ์„ฑ๋Šฅ API๊ฐ€ ํ•„์š”ํ•  ๋•Œ (REST๋ณด๋‹ค ๋น ๋ฆ„)
โœ… ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ํ•„์š”ํ•  ๋•Œ (์˜ˆ: ์ฑ„ํŒ…, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ)
โœ… ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ์„œ๋น„์Šค ๊ฐœ๋ฐœ ์‹œ (๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์›)
โœ… ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹  (๊ฐ€๋ณ๊ณ  ํšจ์œจ์ )

โœ… ๊ฒฐ๋ก 

  • gRPC๋Š” ๊ณ ์„ฑ๋Šฅ, ๊ฒฝ๋Ÿ‰, ์ŠคํŠธ๋ฆฌ๋ฐ ์ง€์›์ด ๊ฐ•์ 
  • HTTP/2 ๊ธฐ๋ฐ˜์œผ๋กœ REST API๋ณด๋‹ค ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ 
  • ํ•˜์ง€๋งŒ JSON์ด ์•„๋‹ˆ๋ผ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ(ํ”„๋กœํ† ๋ฒ„ํ”„) ์‚ฌ์šฉ โ†’ ๋””๋ฒ„๊น…์ด ์–ด๋ ต๋‹ค

๐Ÿ’ก ํ•œ๋งˆ๋””๋กœ?
โžก REST๋ณด๋‹ค ๋น ๋ฅด๊ณ , ๋‹ค์–‘ํ•œ ์–ธ์–ด์—์„œ ์‰ฝ๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” API ํ”„๋ ˆ์ž„์›Œํฌ! ๐Ÿš€

์—ฌ๊ธฐ๊นŒ์ง€ gRPC์˜ ๊ฐœ๋…๊ณผ ํŠน.์žฅ์ ์„ ์•Œ์•˜๋‹ค.
๊ทธ๋Ÿผ ์œ„์—์„œ ๋ฐฐ์šด ๊ฐœ๋…์„ ์ข€ ๋” ๊นŠ์ด ๋น„๊ต.์ดํ•ดํ•ด๋ณด์ž.

โœ… REST API๊ฐ€ HTTP/1.1์ด๋ผ์„œ ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ์•ˆ ๋˜๋Š”๊ฐ€?

REST API ์ž์ฒด๋Š” HTTP/1.1์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ ์š”์ฒญ-์‘๋‹ต ๋ฐฉ์‹(Req-Res)๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์ด ๊ธฐ๋ณธ ๋™์ž‘์ด๋ฏ€๋กœ, ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ์›ํ™œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐ŸŽฏ 1๏ธโƒฃ HTTP/1.1์˜ ํ•œ๊ณ„: ์—ฐ๊ฒฐ ์œ ์ง€์™€ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฌธ์ œ

  • REST API๋Š” ์š”์ฒญ-์‘๋‹ต ๋ฐฉ์‹ (Request-Response Model)
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต
    • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋จผ์ € ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†์Œ (PUSH ๋ถˆ๊ฐ€)
  • HTTP/1.1์˜ ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์‹
    • ํ•˜๋‚˜์˜ ์š”์ฒญ์ด ๋๋‚˜๋ฉด ์—ฐ๊ฒฐ์ด ๋‹ซํž˜ (Keep-Alive๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ๊ฒฐ ์œ ์ง€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ง€์†์  ์ŠคํŠธ๋ฆฌ๋ฐ์€ ์–ด๋ ค์›€)
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์ง€์†์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ๋ฐ˜๋ณตํ•ด์„œ ์š”์ฒญ(Polling)ํ•ด์•ผ ํ•จ

๐Ÿš€ 2๏ธโƒฃ ๊ทธ๋Ÿฌ๋ฉด HTTP/1.1์—์„œ๋„ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ?

REST API์—์„œ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ํ•„์š”ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์šฐํšŒ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ.

1๏ธโƒฃ Long Polling (๋กฑ ํด๋ง)

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ์ฆ‰์‹œ ์‘๋‹ตํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์‘๋‹ต
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์€ ํ›„ ํด๋ผ์ด์–ธํŠธ๋Š” ๋‹ค์‹œ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•จ (๋ฐ˜๋ณต)
  • ๋‹จ์ : ์ง€์†์ ์ธ HTTP ์—ฐ๊ฒฐ๋กœ ์ธํ•ด ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํผ

2๏ธโƒฃ Server-Sent Events (SSE)

  • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋‹จ๋ฐฉํ–ฅ ํ‘ธ์‹œ ๊ฐ€๋Šฅ
  • HTTP ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์„œ๋ฒ„๊ฐ€ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ
  • ํ•œ๊ณ„: ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์€ ๋ถˆ๊ฐ€๋Šฅ (ํด๋ผ์ด์–ธํŠธ โ†’ ์„œ๋ฒ„ ์ „์†ก ๋ถˆ๊ฐ€)

3๏ธโƒฃ ์›น์†Œ์ผ“ (WebSockets)

  • HTTP ํ•ธ๋“œ์…ฐ์ดํฌ ์ดํ›„, TCP ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ๊ฐ€๋Šฅ
  • REST API์™€ ๋‹ฌ๋ฆฌ ์„œ๋ฒ„๋„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ž์œ ๋กญ๊ฒŒ ๋ฉ”์‹œ์ง€ ์ „์†ก ๊ฐ€๋Šฅ
  • ๋‹จ์ : REST API์™€ ๋‹ค๋ฅธ ๋ฐฉ์‹์ด๋ผ ๊ธฐ์กด ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ตํ•ฉ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ

๐Ÿ”ฅ 3๏ธโƒฃ HTTP/2 ๊ธฐ๋ฐ˜์ด๋ฉด REST API์—์„œ ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ๊ฐ€๋Šฅํ• ๊นŒ?

๊ฐ€๋Šฅํ•จ! HTTP/2๋Š” ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ(Multiplexing)์„ ์ง€์›ํ•˜์—ฌ, ๋‹จ์ผ ์—ฐ๊ฒฐ์—์„œ ์—ฌ๋Ÿฌ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋™์‹œ์— ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
โžก๏ธ gRPC๊ฐ€ HTTP/2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ง€์›ํ•˜๋Š” ์ด์œ 

ํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์ธ REST API๋Š” ์—ฌ์ „ํžˆ HTTP/1.1์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์–ด์„œ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ์–ด๋ ค์›€.
โžก๏ธ REST API์—์„œ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์›ํ•˜๋ฉด ์›น์†Œ์ผ“์ด๋‚˜ HTTP/2 ๊ธฐ๋ฐ˜์˜ gRPC ๊ฐ™์€ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•ด์•ผ ํ•จ

โœ… REST API๋„ HTTP/2๋ฅผ ์“ธ ์ˆ˜ ์žˆ์„๊นŒ?

๋„ค, REST API๋„ HTTP/2๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿš€
ํ•˜์ง€๋งŒ ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด, HTTP/2๋ฅผ ์“ด๋‹ค๊ณ  ํ•ด์„œ REST API๊ฐ€ ์ž๋™์œผ๋กœ gRPC์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

  • REST API๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTTP/1.1 ๊ธฐ๋ฐ˜์ด์ง€๋งŒ, ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP/2๋ฅผ ์ง€์›ํ•˜๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ์›น ์„œ๋ฒ„(Apache, Nginx, AWS API Gateway ๋“ฑ)๋Š” HTTP/2๋ฅผ ์ง€์›
  • ๋ธŒ๋ผ์šฐ์ €๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ HTTP/2๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํŠน๋ณ„ํ•œ ์„ค์ • ์—†์ด๋„ HTTP/2๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
    โžก๏ธ ์ฆ‰, REST API๋„ HTTP/2๋ฅผ ํ†ตํ•ด ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ, ํ—ค๋” ์••์ถ• ๋“ฑ์˜ ์„ฑ๋Šฅ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Œ

๐Ÿš€ 2๏ธโƒฃ HTTP/2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด REST API๊ฐ€ ๋นจ๋ผ์งˆ๊นŒ?

์–ด๋А ์ •๋„ ๋นจ๋ผ์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, gRPC ์ˆ˜์ค€์€ ์•„๋‹˜.

โœ… HTTP/2์˜ ์ฃผ์š” ์ด์ 

โœ” ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ (Multiplexing) โ†’ ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์ฒญ/์‘๋‹ต ๊ฐ€๋Šฅ
โœ” ํ—ค๋” ์••์ถ• (HPACK) โ†’ HTTP ํ—ค๋” ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ์„œ ๋„คํŠธ์›Œํฌ ํšจ์œจ ์ฆ๊ฐ€
โœ” ์„œ๋ฒ„ ํ‘ธ์‹œ (Server Push) โ†’ ์„œ๋ฒ„๊ฐ€ ๋ฏธ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ

โžก๏ธ ์ฆ‰, HTTP/2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด REST API๋„ ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Œ!

๐Ÿ”„ 3๏ธโƒฃ HTTP/2๋ฅผ ์“ด๋‹ค๊ณ  REST API๊ฐ€ gRPC์ฒ˜๋Ÿผ ๋˜์ง€๋Š” ์•Š์Œ

REST API๊ฐ€ HTTP/2๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋‹ค์Œ ํ•œ๊ณ„๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ

  1. JSON ๊ธฐ๋ฐ˜์ด๋ผ ์—ฌ์ „ํžˆ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ณด๋‹ค ๋ฌด๊ฒ๋‹ค (gRPC์˜ ํ”„๋กœํ† ๋ฒ„ํ”„๋ณด๋‹ค ์†๋„โ†“)
  2. RPC ์Šคํƒ€์ผ์ด ์•„๋‹ˆ๋ผ HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT ๋“ฑ) ๊ธฐ๋ฐ˜์ด๋‹ค
  3. โญ๏ธ ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค (์›น์†Œ์ผ“ ๋“ฑ ๋‹ค๋ฅธ ๋ฐฉ์‹ ํ•„์š”)

โžก๏ธ HTTP/2๋ฅผ ์“ด๋‹ค๊ณ  REST API๊ฐ€ gRPC์ฒ˜๋Ÿผ ๋˜๋Š” ๊ฑด ์•„๋‹ˆ๊ณ , ์ผ๋ถ€ ์„ฑ๋Šฅ ๊ฐœ์„ ๋งŒ ๊ฐ€๋Šฅ!

โš–๏ธ ์ •๋ฆฌ: REST API์—์„œ HTTP/2๋ฅผ ์“ฐ๋Š” ๊ฒƒ vs gRPC

๐ŸŽฏ ๊ฒฐ๋ก 

โœ” REST API๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTTP/1.1์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹จ๋ฐฉํ–ฅ ์š”์ฒญ-์‘๋‹ต ๋ชจ๋ธ
โœ” HTTP/1.1 ๊ธฐ๋ฐ˜์˜ ์ŠคํŠธ๋ฆฌ๋ฐ์€ ๋กฑ ํด๋ง, SSE, ์›น์†Œ์ผ“ ๋“ฑ์˜ ์šฐํšŒ ๋ฐฉ๋ฒ• ํ•„์š”
โœ” REST API๋„ HTTP/2๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, gRPC์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€๋Š” ์•Š์Œ
โœ” HTTP/2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ๊ณผ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, JSON ๊ธฐ๋ฐ˜์ด๋ผ gRPC๋งŒํผ ํšจ์œจ์ ์ด์ง€ ์•Š์Œ
โœ” ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ gRPC๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•จ (HTTP/2 ๊ธฐ๋ฐ˜์˜ gRPC๋Š” ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ๊ธฐ๋ณธ ์ง€์›)

๐Ÿ’ก ํ•œ๋งˆ๋””๋กœ?
REST API๋Š” HTTP/1.1์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ์–ด๋ ค์›€.
โžก๏ธ ์ง„์งœ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ํ•„์š”ํ•˜๋ฉด ์›น์†Œ์ผ“์ด๋‚˜ gRPC๋ฅผ ์“ฐ๋Š” ๊ฒŒ ๋” ์ ์ ˆํ•จ! ๐Ÿš€

โ“ gRPC๊ฐ€ ๋” ์ข‹์•„ ๋ณด์ด๋Š”๋ฐ, ์™œ REST API๊ฐ€ ๋” ๋งŽ์ด ์“ฐ์ผ๊นŒ?

gRPC๋Š” ๊ณ ์„ฑ๋Šฅ, ์ŠคํŠธ๋ฆฌ๋ฐ ์ง€์›, ๋‹ค์ค‘ ์–ธ์–ด ์ง€์› ๋“ฑ ์—ฌ๋Ÿฌ ์žฅ์ ์ด ์žˆ์ง€๋งŒ,
๊ทธ๋Ÿผ์—๋„ REST API๊ฐ€ ๋” ๋„๋ฆฌ ์“ฐ์ด๋Š” ์ด์œ ๋Š” ํ˜ธํ™˜์„ฑ, ์‚ฌ์šฉ ํŽธ์˜์„ฑ, ๋ธŒ๋ผ์šฐ์ € ์ง€์› ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๐Ÿš€ 1๏ธโƒฃ REST API๋Š” ์›น ์นœํ™”์  (๋ธŒ๋ผ์šฐ์ € ์ง€์›)

  • REST API๋Š” HTTP ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ์š”์ฒญ ๊ฐ€๋Šฅ
    • ์˜ˆ: curl์ด๋‚˜ Postman์—์„œ ์‰ฝ๊ฒŒ ์š”์ฒญ ๊ฐ€๋Šฅ
  • gRPC๋Š” HTTP/2์™€ Protocol Buffers ์‚ฌ์šฉ โ†’ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์š”์ฒญํ•  ์ˆ˜ ์—†์Œ
    • ๋ธŒ๋ผ์šฐ์ €์—์„œ gRPC๋ฅผ ์“ฐ๋ ค๋ฉด ๋ณ„๋„์˜ ํ”„๋ก์‹œ(gRPC-Web) ํ•„์š”

โžก๏ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” REST API๊ฐ€ ํ›จ์”ฌ ์‰ฝ๊ณ  ์ง๊ด€์ 

๐ŸŽฏ 2๏ธโƒฃ REST API๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ์ง๊ด€์ 

  • REST API๋Š” GET, POST, PUT, DELETE ๊ฐ™์€ HTTP ๋ฉ”์„œ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง๊ด€์ 
  • JSON ๋ฐ์ดํ„ฐ ํฌ๋งท ์‚ฌ์šฉ โ†’ ์‚ฌ๋žŒ์ด ์ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›€
  • gRPC๋Š” Protocol Buffers (๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋งท) ์‚ฌ์šฉ โ†’ ๋””๋ฒ„๊น… & ๋กœ๊น…์ด ์–ด๋ ค์›€

โžก๏ธ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์ด REST API๊ฐ€ ๋” ์ข‹๊ณ , ํ•™์Šต ๊ณก์„ ์ด ๋‚ฎ์Œ

๐Ÿ”Œ 3๏ธโƒฃ REST API๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ํ˜ธํ™˜์„ฑ๊ณผ ์ง€์›

  • REST API๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ HTTP ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ธฐ๋ณธ ์ง€์›
  • gRPC๋Š” HTTP/2 ๊ธฐ๋ฐ˜์ด๋ผ ์ผ๋ถ€ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ ์ œํ•œ๋  ์ˆ˜ ์žˆ์Œ
    • ์˜ˆ: ๋ฐฉํ™”๋ฒฝ์ด๋‚˜ ํ”„๋ก์‹œ์—์„œ HTTP/2 ํŠธ๋ž˜ํ”ฝ์ด ์ฐจ๋‹จ๋  ์ˆ˜๋„ ์žˆ์Œ
    • HTTP/2๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ์ด๋ผ, ๋ฐฉํ™”๋ฒฝ์ด๋‚˜ ํ”„๋ก์‹œ๊ฐ€ ๊ธฐ์กด ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ์„ ๋ถ„์„ํ•˜๊ธฐ ์–ด๋ ค์›€
    • ์ผ๋ถ€ ๋ณด์•ˆ ์‹œ์Šคํ…œ์€ HTTP/2 ํŠธ๋ž˜ํ”ฝ์„ ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Œ
    • HTTP/2๋Š” ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ์—์„œ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑํ•จ โ†’ ์–ด๋–ค ์š”์ฒญ์ด ์–ด๋–ค ๋ฐ์ดํ„ฐ์ธ์ง€ ์‹๋ณ„์ด ์–ด๋ ค์›Œ ์œ„ํ—˜ํ•œ ํ”„๋กœํ† ์ฝœ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Œ
  • REST๋Š” ์ฟ ํ‚ค, ์ธ์ฆ ํ† ํฐ, ์บ์‹œ ๋“ฑ ์›น ํ‘œ์ค€ ๊ธฐ๋Šฅ๊ณผ ์‰ฝ๊ฒŒ ์—ฐ๋™ ๊ฐ€๋Šฅ

โžก๏ธ ํ˜ธํ™˜์„ฑ ์ธก๋ฉด์—์„œ REST API๊ฐ€ ๋” ์œ ์—ฐํ•˜๊ณ  ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๐Ÿ”ฅ 4๏ธโƒฃ REST API๋Š” ์„ฑ์ˆ™ํ•œ ์ƒํƒœ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

  • REST๋Š” ์˜ค๋žœ ๊ธฐ๊ฐ„ ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ๋จ โ†’ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋„๊ตฌ ์ง€์›
  • gRPC๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์‹ ๊ธฐ์ˆ ์ด๋ผ ๊ธฐ์กด ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ตํ•ฉ์ด ์–ด๋ ต๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”

โžก๏ธ ๊ธฐ์—…์—์„œ๋Š” ๊ธฐ์กด REST API ์‹œ์Šคํ…œ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒˆ ๊ธฐ์ˆ  ๋„์ž…์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ฒ€ํ† ํ•จ

โš–๏ธ ์ •๋ฆฌ: gRPC vs REST API

โœ… ๊ฒฐ๋ก : REST API๊ฐ€ ๋” ๋งŽ์ด ์“ฐ์ด๋Š” ์ด์œ 

  • ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • JSON ๊ธฐ๋ฐ˜์ด๋ผ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฝ๊ณ , ๋””๋ฒ„๊น… & ๋กœ๊น…์ด ์‰ฌ์›€
  • ๊ฑฐ์˜ ๋ชจ๋“  ์–ธ์–ด์™€ ํ™˜๊ฒฝ์—์„œ ์ง€์› (๋ฐฉํ™”๋ฒฝ/๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ์—†์Œ)
  • ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‚ฌ์šฉ๋˜๋ฉด์„œ ๊ฐ•๋ ฅํ•œ ์ƒํƒœ๊ณ„๋ฅผ ํ˜•์„ฑํ•จ

โžก๏ธ gRPC๋Š” ์†๋„์™€ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜์ง€๋งŒ, REST API๊ฐ€ ๋” ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•จ!
โžก๏ธ ๊ทธ๋ž˜์„œ ๋Œ€๋ถ€๋ถ„์˜ ์ผ๋ฐ˜์ ์ธ API๋Š” REST API๋กœ ์ œ๊ณตํ•˜๊ณ , ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ gRPC๋ฅผ ์„ ํƒ! ๐Ÿš€

๊ทธ๋ž˜์„œ ๊ธ€์“ด์ด๊ฐ€ ๋‚ธ ์žฅ์• ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€

๋‚˜์˜ ๊ฐœ๋ฐœ ์„œ๋น„์Šค๋Š” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋กœ NGINX๋ฅผ ์“ฐ๊ณ  ์žˆ๋Š”๋ฐ ์ผ๋ถ€ ์„œ๋น„์Šค๊ฐ€ gRPC ํ†ต์‹ ์„ ํ•˜๊ณ  ์žˆ๋‹ค.

gRPC ๋™์ž‘ ๋ฐฉ์‹์„ ์ž˜ ๋ชฐ๋ž๋˜ ๋‚˜๋Š”.. Nginx config ๋ณ€๊ฒฝ ํ›„ ๋‹น์ฐจ๊ฒŒ ์žฌ๊ธฐ๋™์„ ํ•˜์˜€๋‹ค.
๊ทธ๋ฆฌ๊ณ .. ์žฌ๊ธฐ๋™ ๋™์•ˆ ์ผ๋ถ€ ํŠธ๋ž˜ํ”ฝ ์œ ์ž… ๋ถˆ๊ฐ€ ์žฅ์• ๋ฅผ ๋‚ด์–ด๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค.

์™œ ํŠธ๋ž˜ํ”ฝ ์œ ์ž…์ด ์•ˆ๋˜์—ˆ๋‚˜

NGINX๊ฐ€ ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ์‹œ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ธฐ๋™๋˜๋ฉด์„œ gRPC ์†Œ์ผ“์ด ๋ฆฌ์…‹๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

gRPC๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTTP/2 ๊ธฐ๋ฐ˜์˜ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ณ , ์ด๋ฅผ NGINX์™€ ํ†ตํ•ฉํ•  ๋•Œ์—๋Š” NGINX๊ฐ€ ํ”„๋ก์‹œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. NGINX๋ฅผ ์žฌ๊ธฐ๋™ํ•˜๋ฉด, ํ”„๋ก์‹œ๋กœ์„œ์˜ ์—ฐ๊ฒฐ๋„ ์ข…๋ฃŒ๋˜๊ณ  ๋‹ค์‹œ ์„ค์ •๋˜๋Š” ๊ณผ์ •์—์„œ gRPC ์—ฐ๊ฒฐ๋„ ์žฌ์„ค์ •๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, REST API ํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜๋Š” NGINX๋Š” ์žฌ๊ธฐ๋™ ์‹œ์—๋„ ๋ฐ˜๋“œ์‹œ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€์ง€ ์•Š๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
NGINX๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, NGINX ์žฌ๊ธฐ๋™ ์‹œ์—๋„ ์ผ์‹œ์ ์ธ ์—ฐ๊ฒฐ ๋Š๊น€์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋งŒ, REST API ํ†ต์‹ ์€ HTTP/1.x ๋˜๋Š” HTTP/2๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ธ๋ฐ, ์ด ๋ฐฉ์‹์€ gRPC์™€ ๋‹ค๋ฅด๊ฒŒ ์š”์ฒญ-์‘๋‹ต ๊ธฐ๋ฐ˜์˜ ๋‹จ๊ธฐ์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

REST API์™€ NGINX์˜ ์žฌ๊ธฐ๋™ ์‹œ ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์ฐจ์ด์ 

  1. HTTP ์š”์ฒญ-์‘๋‹ต
    REST API๋Š” ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›๋Š” ๋‹จ๊ธฐ์ ์ธ ์—ฐ๊ฒฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํ•œ ๋ฒˆ์˜ HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
    ์ด ๋ฐฉ์‹์—์„œ๋Š” ์—ฐ๊ฒฐ ๋Š๊น€์ด ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์žฌ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  2. gRPC
    ๋ฐ˜๋ฉด, gRPC๋Š” ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋ฉฐ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฃผ๊ณ ๋ฐ›์Šต๋‹ˆ๋‹ค. NGINX๊ฐ€ gRPC๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•œ ์ฑ„๋กœ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ, NGINX ์žฌ๊ธฐ๋™ ์‹œ ๊ธฐ์กด์˜ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์žฌ๋ฐœ ๋ฐฉ์ง€๋Š” ์–ด๋–ป๊ฒŒ?

  1. Connection persistence
    NGINX์—์„œ connection์„ ์œ ์ง€ํ•˜๋„๋ก ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ์„ธ์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์žฌ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Zero downtime deployment
    NGINX๋ฅผ ์žฌ๊ธฐ๋™ํ•  ๋•Œ, ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค€๋น„๋˜์—ˆ์„ ๋•Œ ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋„๋ก ์„ค์ •ํ•˜์—ฌ, ์™„์ „ํ•œ ๋‹ค์šดํƒ€์ž„ ์—†์ด ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. gRPC ์—ฐ๊ฒฐ ์œ ์ง€
    NGINX์˜ proxy ์„ค์ •์„ ํ†ตํ•ด keepalive ์˜ต์…˜์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
profile
๋‚˜๋Š” ๋Šฅํžˆ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„์„ฏ์ด๋‹ค! ๐Ÿ„โ€๐ŸŸซ

0๊ฐœ์˜ ๋Œ“๊ธ€