{"id":90,"date":"2026-05-13T13:44:46","date_gmt":"2026-05-13T04:44:46","guid":{"rendered":"https:\/\/it-blog.kr\/?p=90"},"modified":"2026-06-01T09:52:21","modified_gmt":"2026-06-01T00:52:21","slug":"grpc","status":"publish","type":"post","link":"https:\/\/it-blog.kr\/?p=90","title":{"rendered":"gRPC"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">gRPC\ub780?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Google\uc5d0\uc11c \uac1c\ubc1c\ud55c \uace0\uc131\ub2a5 open source RPC framework \uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc6d0\uaca9 \ud504\ub85c\uc2dc\uc800 \ud638\ucd9c(RPC, Remote Procedure Call)\uc774\ub780 Network \ub108\uba38\uc758 \ud568\uc218\ub97c \ub9c8\uce58 \ub85c\uceec \ud568\uc218\ucc98\ub7fc \ud638\ucd9c\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4. gRPC\ub294 \uc774\uac83\uc744 \ud604\ub300\uc801\uc73c\ub85c \uad6c\ud604\ud55c \uac83.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc8fc\ub85c MicroService Architecture(MSA)\uc5d0\uc11c \uc11c\ube44\uc2a4 \uac04 \ud1b5\uc2e0\uc5d0 \ub110\ub9ac \uc0ac\uc6a9\ub428.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc8fc\uc694 \ud2b9\uc9d5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/it-blog.kr\/?p=218\" data-type=\"link\" data-id=\"https:\/\/it-blog.kr\/?p=218\">Protocol Buffers (protobuf)<\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub370\uc774\ud130\ub97c \uc9c1\ub82c\ud654\ud558\ub294 \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758 \uc5b8\uc5b4(IDL)<\/li>\n\n\n\n<li>JSON\ubcf4\ub2e4 \ud6e8\uc52c \uc791\uace0 \ube60\ub978 \ubc14\uc774\ub108\ub9ac \ud615\uc2dd<\/li>\n\n\n\n<li>.proto \ud30c\uc77c\ub85c \uc11c\ube44\uc2a4\uc640 \uba54\uc2dc\uc9c0\ub97c \uc815\uc758<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">HTTP\/2 \uae30\ubc18<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Multiplexing\uc73c\ub85c \ub2e8\uc77c \uc5f0\uacb0\uc5d0\uc11c \uc5ec\ub7ec \uc694\uccad \ucc98\ub9ac<\/li>\n\n\n\n<li>Header \uc555\ucd95\uc73c\ub85c overhead \uac10\uc18c<\/li>\n\n\n\n<li>\uc591\ubc29\ud5a5 Streaming \uc9c0\uc6d0<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">REST vs gRPC<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">REST\uc640 gRPC\ub97c \ube44\uad50\ud558\uba74 \uc544\ub798\uc640 \uac19\uc74c.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"713\" height=\"294\" loading=\"lazy\" src=\"https:\/\/it-blog.kr\/wp-content\/uploads\/2026\/05\/image-11.png\" alt=\"\" class=\"wp-image-131\" srcset=\"https:\/\/it-blog.kr\/wp-content\/uploads\/2026\/05\/image-11.png 713w, https:\/\/it-blog.kr\/wp-content\/uploads\/2026\/05\/image-11-300x124.png 300w\" sizes=\"auto, (max-width: 713px) 100vw, 713px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">gRPC\uac00 \uc801\ud569\ud55c \uacbd\uc6b0<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Microservice \uac04 \ub0b4\ubd80 \ud1b5\uc2e0<\/li>\n\n\n\n<li>\ub0ae\uc740 \uc9c0\uc5f0\uc2dc\uac04\uc774 \uc911\uc694\ud55c \uacbd\uc6b0<\/li>\n\n\n\n<li>\uc2e4\uc2dc\uac04 streaming\uc774 \ud544\uc694\ud55c \uacbd\uc6b0<\/li>\n\n\n\n<li>Polyglot(\ub2e4\uc911 \uc5b8\uc5b4) \ud658\uacbd<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">gRPC\ub97c \uc0ac\uc6a9\ud558\ub294 \uc774\uc720<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc131\ub2a5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">JSON\uc740 \ud14d\uc2a4\ud2b8\ub77c parsing \ube44\uc6a9\uc774 \ud06c\uace0 \uc6a9\ub7c9\ub3c4 \ud06c\ub2e4. Protobuf\ub294 binary\uc774\ubbc0\ub85c \uc9c1\ub82c\ud654\uac00 \ud6e8\uc52c \ube60\ub974\uace0 payload \ud06c\uae30\ub3c4 \uc791\uc74c. \uc5ec\uae30\uc5d0 HTTP\/2\uc758 multplexing\uacfc header \uc555\ucd95\uc774 \ub354\ud574\uc838, \ud2b9\ud788 traffic\uc774 \ub9ce\uc740 microservice \uac04 \ud1b5\uc2e0\uc5d0\uc11c \uccb4\uac10 \ucc28\uc774\uac00 \ud07c.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud0c0\uc785 \uc548\uc815\uc131<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">REST\/JSON\uc740 field \uc774\ub984 \uc624\ud0c0\ub098 type \ubd88\uc77c\uce58\ub97c runtime\uc5d0\uc11c\uc57c \ubc1c\uacac\ud568. gRPC\ub294 .proto \ud30c\uc77c\uc774 contract \uc5ed\ud560\uc744 \ud558\ubbc0\ub85c, client\uc640 server\uac00 \uc11c\ub85c \ub2e4\ub978 schema\ub97c \uac16\ub294 \uc0c1\ud669 \uc790\uccb4\uac00 compile \ub2e8\uacc4\uc5d0\uc11c \ucc28\ub2e8\ub428.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Streaming<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">REST\ub85c \uc2e4\uc2dc\uac04 data\ub97c \ucc98\ub9ac\ud558\ub824\uba74 websocket\uc774\ub098 SSE\uac19\uc740 \ubcc4\ub3c4 \uae30\uc220\uc744 \uc870\ud569\ud574\uc57c \ud568.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">gRPC\ub294 \ub2e8\ubc29\ud5a5, server streaming, client streaming, \uc591\ubc29\ud5a5 streaming\uc744 \ud558\ub098\uc758 framework \uc548\uc5d0\uc11c \uc77c\uad00\ub418\uac8c \uc9c0\uc6d0\ud568.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub2e4\uc911 \uc5b8\uc5b4 \uc9c0\uc6d0(Polyglot)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">.proto \ud30c\uc77c \ud558\ub098\ub85c Go, Java, Python, Node.js, C++\ub4f1 \uc5ec\ub7ec \uc5b8\uc5b4\uc758 client\/server \ucf54\ub4dc\ub97c \uc790\ub3d9 \uc0dd\uc131\ud560 \uc218 \uc788\uc5b4, \uc11c\ube44\uc2a4\ub9c8\ub2e4 \ub2e4\ub978 \uc5b8\uc5b4\ub97c \uc4f0\ub294 \ud300\uc5d0\uc11c interface \ubd88\uc77c\uce58 \ubb38\uc81c\ub97c \ud06c\uac8c \uc904\uc77c \uc218 \uc788\uc74c.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">gRPC\uc758 \ub3d9\uc791 \ud750\ub984<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">1. \uac1c\ubc1c \ub2e8\uacc4 (Complie time)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">.proto \ud30c\uc77c\uc5d0 service\uc640 message \uad6c\uc870\ub97c \uc815\uc758\ud558\uba74, protoc compiler\uac00 client\uc6a9 stub\uacfc server\uc6a9 \uc2a4\ucf08\ub808\ud1a4 \ucf54\ub4dc\ub97c \uc790\ub3d9 \uc0dd\uc131\ud568. \uac1c\ubc1c\uc790\ub294 \uc774 \ucf54\ub4dc\ub97c \uae30\ubc18\uc73c\ub85c \uad6c\ud604.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. \uc694\uccad \ud750\ub984 (client -&gt; server)<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>client app\uc774 stub\uc758 method\ub97c \uc77c\ubc18 \ud568\uc218\ucc98\ub7fc \ud638\ucd9c<\/li>\n\n\n\n<li>stub\uc774 \uc694\uccad \uac1d\uccb4\ub97c protobuf binary\ub85c \uc9c1\ub82c\ud654<\/li>\n\n\n\n<li>HTTP\/2 stream\uc73c\ub85c \uc11c\ubc84\uc5d0 \uc804\uc1a1 (header \uc555\ucd95 + multiplexing)<\/li>\n\n\n\n<li>server\uac00 binary\ub97c \uc218\uc2e0 \ud6c4 \uc5ed\uc9c1\ub82c\ud654\ud558\uc5ec \uac1d\uccb4\ub85c \ubcf5\uc6d0<\/li>\n\n\n\n<li>server\uc758 business logic \uc2e4\ud589<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">3. \uc751\ub2f5 \ud750\ub984 (server -&gt; client)<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>server\uac00 \uc751\ub2f5 \uac1d\uccb4\ub97c Protobuf\ub85c \uc9c1\ub82c\ud654 \ud6c4 HTTP\/2\ub85c \uc804\uc1a1<\/li>\n\n\n\n<li>client\uac00 \uc218\uc2e0 \ud6c4 \uc5ed\uc9c1\ub82c\ud654<\/li>\n\n\n\n<li>stub\uc774 \uacb0\uacfc\ub97c client app\uc5d0 \ubc18\ud658 &#8211; \ub9c8\uce58 \ub85c\uceec \ud568\uc218\uc758 \ubc18\ud658\uac12\ucc98\ub7fc \uc804\ub2ec\ub428.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">gRPC \uac04\ub2e8 \uad6c\ud604<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">gRPC\ub97c Debian Linux \uc0c1\uc5d0\uc11c \uac04\ub2e8\ud558\uac8c \uad6c\ud604 \ud574 \ubcf4\uc790.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Topology<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"326\" height=\"54\" loading=\"lazy\" src=\"https:\/\/it-blog.kr\/wp-content\/uploads\/2026\/05\/image-13.png\" alt=\"\" class=\"wp-image-143\" srcset=\"https:\/\/it-blog.kr\/wp-content\/uploads\/2026\/05\/image-13.png 326w, https:\/\/it-blog.kr\/wp-content\/uploads\/2026\/05\/image-13-300x50.png 300w\" sizes=\"auto, (max-width: 326px) 100vw, 326px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Common Configuration<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>; Install Packages\n# apt update\n# apt install curl git wget unzip net-tools\n\n; Install Golang\n# wget https:\/\/go.dev\/dl\/go1.26.3.linux-amd64.tar.gz\n# sudo tar -C \/usr\/local -xzf go1.26.3.linux-amd64.tar.gz\n# cat &lt;&lt; EOF &gt;&gt; .bashrc\nexport PATH=$PATH:\/usr\/local\/go\/bin\nexport GOPATH=$HOME\/go\nexport PATH=$PATH:$GOPATH\/bin\nEOF\n\n; Verify Installation\n# go version\ngo version go1.26.3 linux\/amd64\n\n; Install protoc compiler\napt install protobuf-compiler\n\n; Install protoc plugin for Go\ngo install google.golang.org\/protobuf\/cmd\/protoc-gen-go@latest\ngo install google.golang.org\/grpc\/cmd\/protoc-gen-go-grpc@latest\n\n; Make a new project\n# mkdir grpc-demo &amp;&amp; cd grpc-demo\n# mkdir proto server client\n\n# go mod init grpc-demo\n# go get google.golang.org\/grpc\n# go get google.golang.org\/protobuf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">proto \ucf54\ub4dc\ub97c \uc544\ub798\uc640 \uac19\uc774 \uc791\uc131 (vim proto\/hello.proto)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>syntax = \"proto3\";\n\npackage hello;\n\noption go_package = \"grpc-demo\/hello\";\n\n\/\/ \uc694\uccad: \uc774\ub984\uc744 \ubcf4\ub0c4\nmessage HelloRequest {\n  string name = 1;\n}\n\n\/\/ \uc751\ub2f5: \uba54\uc2dc\uc9c0\uc640 \uc11c\ubc84 IP\ub97c \ud568\uaed8 \ubc18\ud658\nmessage HelloResponse {\n  string message   = 1;\n  string server_ip = 2;\n}\n\n\/\/ \ub2e8\ubc29\ud5a5 RPC\nservice Greeter {\n  rpc SayHello (HelloRequest) returns (HelloResponse);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Compile \ubc0f \ud30c\uc77c \uc774\ub3d9<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># protoc \\\n  --go_out=. \\\n  --go_opt=paths=source_relative \\\n  --go-grpc_out=. \\\n  --go-grpc_opt=paths=source_relative \\\n  proto\/hello.proto \\\n  --go_opt=Mproto\/hello.proto=grpc-demo\/hello \\\n  --go-grpc_opt=Mproto\/hello.proto=grpc-demo\/hello\n\n# mkdir hello\n# mv proto\/*.go hello\/<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">grpc-srv Configuration<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84 \ucf54\ub4dc\ub97c \uc544\ub798\uc640 \uac19\uc774 \uc791\uc131 (vim grpc-demo\/server\/main.go)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"log\"\n    \"net\"\n    \"os\"\n\n    pb \"grpc-demo\/hello\"\n    \"google.golang.org\/grpc\"\n    \"google.golang.org\/grpc\/reflection\"\n)\n\ntype server struct {\n    pb.UnimplementedGreeterServer\n}\n\n\/\/ SayHello: \ud074\ub77c\uc774\uc5b8\ud2b8 \uc694\uccad\uc744 \ubc1b\uc544 \uc751\ub2f5 \ubc18\ud658\nfunc (s *server) SayHello(\n    ctx context.Context,\n    req *pb.HelloRequest,\n) (*pb.HelloResponse, error) {\n\n    \/\/ \uc11c\ubc84 \uc790\uc2e0\uc758 IP\ub97c \uc751\ub2f5\uc5d0 \ud3ec\ud568\n    hostname, _ := os.Hostname()\n    addrs, _ := net.LookupHost(hostname)\n    serverIP := \"192.168.10.10\"\n    if len(addrs) &gt; 0 {\n        serverIP = addrs&#91;0]\n    }\n\n    log.Printf(\"&#91;\uc694\uccad \uc218\uc2e0] name=%s, \ud074\ub77c\uc774\uc5b8\ud2b8=%s\",\n        req.GetName(),\n        ctx.Value(\"peer\"),\n    )\n\n    return &amp;pb.HelloResponse{\n        Message:  fmt.Sprintf(\"\uc548\ub155\ud558\uc138\uc694, %s! \u2014 grpc-srv\uc5d0\uc11c \uc751\ub2f5\", req.GetName()),\n        ServerIp: serverIP,\n    }, nil\n}\n\nfunc main() {\n    port := \":50051\"\n    lis, err := net.Listen(\"tcp\", port)\n    if err != nil {\n        log.Fatalf(\"\ub9ac\uc2a8 \uc2e4\ud328: %v\", err)\n    }\n\n    s := grpc.NewServer()\n    pb.RegisterGreeterServer(s, &amp;server{})\n\n    \/\/ grpcurl \uac19\uc740 \ub3c4\uad6c\ub85c \uc11c\ube44\uc2a4 \ubaa9\ub85d \uc870\ud68c \uac00\ub2a5\ud558\uac8c \ud568\n    reflection.Register(s)\n\n    log.Printf(\"gRPC \uc11c\ubc84 \uc2dc\uc791 \u2014 \ud3ec\ud2b8%s\", port)\n    if err := s.Serve(lis); err != nil {\n        log.Fatalf(\"\uc11c\ubc84 \uc885\ub8cc: %v\", err)\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84 \ube4c\ub4dc \ubc0f \uc2e4\ud589<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>; Build\n# cd grpc-demo\n# go mod tidy\n# go build -o bin\/server .\/server\/\n\n; Run (Background)\n# nohup .\/bin\/server &amp;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">grpc-cnt Configuration<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8 \ucf54\ub4dc\ub97c \uc544\ub798\uc640 \uac19\uc774 \uc791\uc131 (vim grpc-demo\/client\/main.go)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"context\"\n    \"flag\"\n    \"log\"\n    \"time\"\n\n    pb \"grpc-demo\/hello\"\n    \"google.golang.org\/grpc\"\n    \"google.golang.org\/grpc\/credentials\/insecure\"\n)\n\nfunc main() {\n    \/\/ \uc2e4\ud589 \uc2dc \uc778\uc790\ub85c \uc11c\ubc84 \uc8fc\uc18c \uc9c0\uc815 \uac00\ub2a5\n    serverAddr := flag.String(\"server\", \"192.168.10.10:50051\", \"gRPC \uc11c\ubc84 \uc8fc\uc18c\")\n    name       := flag.String(\"name\", \"VM2-Client\", \"\uc804\uc1a1\ud560 \uc774\ub984\")\n    flag.Parse()\n\n    \/\/ \uc11c\ubc84 \uc5f0\uacb0 (\ud14c\uc2a4\ud2b8 \ud658\uacbd\uc774\ubbc0\ub85c TLS \uc5c6\uc774)\n    conn, err := grpc.Dial(\n        *serverAddr,\n        grpc.WithTransportCredentials(insecure.NewCredentials()),\n        grpc.WithBlock(),                        \/\/ \uc5f0\uacb0 \uc131\uacf5\uae4c\uc9c0 \ube14\ub85d\n        grpc.WithTimeout(5 * time.Second),       \/\/ 5\ucd08 \ud0c0\uc784\uc544\uc6c3\n    )\n    if err != nil {\n        log.Fatalf(\"\uc11c\ubc84 \uc5f0\uacb0 \uc2e4\ud328: %v\", err)\n    }\n    defer conn.Close()\n\n    log.Printf(\"\uc11c\ubc84 \uc5f0\uacb0 \uc131\uacf5: %s\", *serverAddr)\n\n    client := pb.NewGreeterClient(conn)\n\n    \/\/ RPC \ud638\ucd9c\n    ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)\n    defer cancel()\n\n    res, err := client.SayHello(ctx, &amp;pb.HelloRequest{Name: *name})\n    if err != nil {\n        log.Fatalf(\"RPC \ud638\ucd9c \uc2e4\ud328: %v\", err)\n    }\n\n    log.Printf(\"\uc751\ub2f5 \uba54\uc2dc\uc9c0 : %s\", res.GetMessage())\n    log.Printf(\"\uc11c\ubc84 IP     : %s\", res.GetServerIp())\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8 \ube4c\ub4dc<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>; Build\n# cd grpc-demo\n# go mod tidy\n# go build -o bin\/client .\/client\/<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Test gRPC Demo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Server Port Listen<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@grpc-srv:~\/grpc-demo# ss -lntp | grep 50051\nLISTEN 0      4096               *:50051            *:*    users:((\"server\",pid=4877,fd=4))<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Server Port Scan on Client<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@grpc-cnt:~\/grpc-demo# nc -zvn 192.168.10.10 50051\n(UNKNOWN) &#91;192.168.10.10] 50051 (?) open<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Client API Test (Single)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@grpc-cnt:~\/grpc-demo# .\/bin\/client -server 192.168.10.10:50051 -name \"Debian-Client\"\n2026\/05\/27 15:19:48 \uc11c\ubc84 \uc5f0\uacb0 \uc131\uacf5: 192.168.10.10:50051\n2026\/05\/27 15:19:48 \uc751\ub2f5 \uba54\uc2dc\uc9c0 : \uc548\ub155\ud558\uc138\uc694, Debian-Client! \u2014 grpc-srv\uc5d0\uc11c \uc751\ub2f5\n2026\/05\/27 15:19:48 \uc11c\ubc84 IP     : 192.168.10.10<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Client API Test (Multiple)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@grpc-cnt:~\/grpc-demo# for i in $(seq 1 10); do   .\/bin\/client -server 192.168.10.10:50051 -name \"test-$i\"; done\n2026\/05\/27 15:22:08 \uc11c\ubc84 \uc5f0\uacb0 \uc131\uacf5: 192.168.10.10:50051\n2026\/05\/27 15:22:08 \uc751\ub2f5 \uba54\uc2dc\uc9c0 : \uc548\ub155\ud558\uc138\uc694, test-1! \u2014 grpc-srv\uc5d0\uc11c \uc751\ub2f5\n2026\/05\/27 15:22:08 \uc11c\ubc84 IP     : 192.168.10.10\n2026\/05\/27 15:22:08 \uc11c\ubc84 \uc5f0\uacb0 \uc131\uacf5: 192.168.10.10:50051\n2026\/05\/27 15:22:08 \uc751\ub2f5 \uba54\uc2dc\uc9c0 : \uc548\ub155\ud558\uc138\uc694, test-2! \u2014 grpc-srv\uc5d0\uc11c \uc751\ub2f5\n2026\/05\/27 15:22:08 \uc11c\ubc84 IP     : 192.168.10.10\n2026\/05\/27 15:22:08 \uc11c\ubc84 \uc5f0\uacb0 \uc131\uacf5: 192.168.10.10:50051\n2026\/05\/27 15:22:08 \uc751\ub2f5 \uba54\uc2dc\uc9c0 : \uc548\ub155\ud558\uc138\uc694, test-3! \u2014 grpc-srv\uc5d0\uc11c \uc751\ub2f5\n2026\/05\/27 15:22:08 \uc11c\ubc84 IP     : 192.168.10.10\n2026\/05\/27 15:22:08 \uc11c\ubc84 \uc5f0\uacb0 \uc131\uacf5: 192.168.10.10:50051\n2026\/05\/27 15:22:08 \uc751\ub2f5 \uba54\uc2dc\uc9c0 : \uc548\ub155\ud558\uc138\uc694, test-4! \u2014 grpc-srv\uc5d0\uc11c \uc751\ub2f5\n2026\/05\/27 15:22:08 \uc11c\ubc84 IP     : 192.168.10.10\n2026\/05\/27 15:22:08 \uc11c\ubc84 \uc5f0\uacb0 \uc131\uacf5: 192.168.10.10:50051\n2026\/05\/27 15:22:08 \uc751\ub2f5 \uba54\uc2dc\uc9c0 : \uc548\ub155\ud558\uc138\uc694, test-5! \u2014 grpc-srv\uc5d0\uc11c \uc751\ub2f5\n2026\/05\/27 15:22:08 \uc11c\ubc84 IP     : 192.168.10.10\n2026\/05\/27 15:22:08 \uc11c\ubc84 \uc5f0\uacb0 \uc131\uacf5: 192.168.10.10:50051\n2026\/05\/27 15:22:08 \uc751\ub2f5 \uba54\uc2dc\uc9c0 : \uc548\ub155\ud558\uc138\uc694, test-6! \u2014 grpc-srv\uc5d0\uc11c \uc751\ub2f5\n2026\/05\/27 15:22:08 \uc11c\ubc84 IP     : 192.168.10.10\n2026\/05\/27 15:22:08 \uc11c\ubc84 \uc5f0\uacb0 \uc131\uacf5: 192.168.10.10:50051\n2026\/05\/27 15:22:08 \uc751\ub2f5 \uba54\uc2dc\uc9c0 : \uc548\ub155\ud558\uc138\uc694, test-7! \u2014 grpc-srv\uc5d0\uc11c \uc751\ub2f5\n2026\/05\/27 15:22:08 \uc11c\ubc84 IP     : 192.168.10.10\n2026\/05\/27 15:22:08 \uc11c\ubc84 \uc5f0\uacb0 \uc131\uacf5: 192.168.10.10:50051\n2026\/05\/27 15:22:08 \uc751\ub2f5 \uba54\uc2dc\uc9c0 : \uc548\ub155\ud558\uc138\uc694, test-8! \u2014 grpc-srv\uc5d0\uc11c \uc751\ub2f5\n2026\/05\/27 15:22:08 \uc11c\ubc84 IP     : 192.168.10.10\n2026\/05\/27 15:22:08 \uc11c\ubc84 \uc5f0\uacb0 \uc131\uacf5: 192.168.10.10:50051\n2026\/05\/27 15:22:08 \uc751\ub2f5 \uba54\uc2dc\uc9c0 : \uc548\ub155\ud558\uc138\uc694, test-9! \u2014 grpc-srv\uc5d0\uc11c \uc751\ub2f5\n2026\/05\/27 15:22:08 \uc11c\ubc84 IP     : 192.168.10.10\n2026\/05\/27 15:22:08 \uc11c\ubc84 \uc5f0\uacb0 \uc131\uacf5: 192.168.10.10:50051\n2026\/05\/27 15:22:08 \uc751\ub2f5 \uba54\uc2dc\uc9c0 : \uc548\ub155\ud558\uc138\uc694, test-10! \u2014 grpc-srv\uc5d0\uc11c \uc751\ub2f5\n2026\/05\/27 15:22:08 \uc11c\ubc84 IP     : 192.168.10.10<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\ucd94\uac00\ub85c \uacf5\ubd80\ud560 \uac83<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MSA (MicroService Architecture)<\/li>\n\n\n\n<li>IDL (Interface Description Language)<\/li>\n\n\n\n<li>Multiplexing<\/li>\n\n\n\n<li>Polyglot<\/li>\n\n\n\n<li>contract<\/li>\n\n\n\n<li>HTTP version (<a href=\"https:\/\/namu.wiki\/w\/HTTP\/3\">HTTP\/3 &#8211; \ub098\ubb34\uc704\ud0a4<\/a>)<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>gRPC\ub780? Google\uc5d0\uc11c \uac1c\ubc1c\ud55c \uace0\uc131\ub2a5 open source RPC framework \uc774\ub2e4. \uc6d0\uaca9 \ud504\ub85c\uc2dc\uc800 \ud638\ucd9c(RPC, Remote Procedure Call)\uc774\ub780 Network \ub108\uba38\uc758 \ud568\uc218\ub97c \ub9c8\uce58 \ub85c\uceec \ud568\uc218\ucc98\ub7fc \ud638\ucd9c\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4. gRPC\ub294 \uc774\uac83\uc744 \ud604\ub300\uc801\uc73c\ub85c \uad6c\ud604\ud55c \uac83. \uc8fc\ub85c MicroService&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-90","post","type-post","status-publish","format-standard","hentry","category-study"],"_links":{"self":[{"href":"https:\/\/it-blog.kr\/index.php?rest_route=\/wp\/v2\/posts\/90","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/it-blog.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/it-blog.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/it-blog.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/it-blog.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=90"}],"version-history":[{"count":12,"href":"https:\/\/it-blog.kr\/index.php?rest_route=\/wp\/v2\/posts\/90\/revisions"}],"predecessor-version":[{"id":220,"href":"https:\/\/it-blog.kr\/index.php?rest_route=\/wp\/v2\/posts\/90\/revisions\/220"}],"wp:attachment":[{"href":"https:\/\/it-blog.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=90"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/it-blog.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=90"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/it-blog.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=90"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}