๐ฅ 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๋ฅผ ์ฌ์ฉํด๋ ๋ค์ ํ๊ณ๋ ๊ทธ๋๋ก ์ ์ง๋จ
- JSON ๊ธฐ๋ฐ์ด๋ผ ์ฌ์ ํ ๋ฐ์ด๋๋ฆฌ๋ณด๋ค ๋ฌด๊ฒ๋ค (gRPC์ ํ๋กํ ๋ฒํ๋ณด๋ค ์๋โ)
- RPC ์คํ์ผ์ด ์๋๋ผ HTTP ๋ฉ์๋(GET, POST, PUT ๋ฑ) ๊ธฐ๋ฐ์ด๋ค
- โญ๏ธ ์๋ฐฉํฅ ์คํธ๋ฆฌ๋ฐ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ๋ค (์น์์ผ ๋ฑ ๋ค๋ฅธ ๋ฐฉ์ ํ์)
โก๏ธ 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์ ์ฌ๊ธฐ๋ ์ ์ฐ๊ฒฐ์ ๋ํ ์ฐจ์ด์
- HTTP ์์ฒญ-์๋ต
REST API๋ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ๋ ๋จ๊ธฐ์ ์ธ ์ฐ๊ฒฐ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๋ฐ๋ผ์, ํ ๋ฒ์ HTTP ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ์ฐ๊ฒฐ์ด ์ข
๋ฃ๋ฉ๋๋ค.
์ด ๋ฐฉ์์์๋ ์ฐ๊ฒฐ ๋๊น์ด ๋ฐ์ํ๋๋ผ๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ก์ด ์์ฒญ์ ๋ณด๋ด๋ฉด ์ฌ์ฐ๊ฒฐ๋ฉ๋๋ค.
- gRPC
๋ฐ๋ฉด, gRPC๋ ์ง์์ ์ธ ์ฐ๊ฒฐ์ ์ ์งํ๋ฉฐ ์์ฒญ๊ณผ ์๋ต์ ์ฃผ๊ณ ๋ฐ์ต๋๋ค. NGINX๊ฐ gRPC๋ฅผ ์ฌ์ฉํ ๋๋ ์ฐ๊ฒฐ์ ์ ์งํ ์ฑ๋ก ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ผ, NGINX ์ฌ๊ธฐ๋ ์ ๊ธฐ์กด์ ์ง์์ ์ธ ์ฐ๊ฒฐ์ด ๋์ด์ง๊ฒ ๋ฉ๋๋ค.
์ฌ๋ฐ ๋ฐฉ์ง๋ ์ด๋ป๊ฒ?
- Connection persistence
NGINX์์ connection์ ์ ์งํ๋๋ก ์ค์ ํ๊ฑฐ๋, ์ธ์
์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ํด๋ผ์ด์ธํธ ์ธก์์ ์ฌ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- Zero downtime deployment
NGINX๋ฅผ ์ฌ๊ธฐ๋ํ ๋, ์๋ก์ด ํ๋ก์ธ์ค๊ฐ ์ค๋น๋์์ ๋ ๊ธฐ์กด ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ๋๋ก ์ค์ ํ์ฌ, ์์ ํ ๋ค์ดํ์ ์์ด ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
- gRPC ์ฐ๊ฒฐ ์ ์ง
NGINX์ proxy ์ค์ ์ ํตํด keepalive ์ต์
์ ์ ์ ํ ์ค์ ํ์ฌ ์ฐ๊ฒฐ์ ์ ์งํ๋๋ก ํ ์ ์์ต๋๋ค.