๊ฐœ๋…์ •๋ฆฌ: ๐Ÿ“ฆProtobuf ์™€ ๐Ÿš€gRPC

์—”์ผ€์ดยท2025๋…„ 2์›” 3์ผ
0
post-thumbnail

๐Ÿš€ React ํ”„๋กœ์ ํŠธ์—์„œ Protocol Buffers์™€ gRPC ๊ฐœ๋… ์ •๋ฆฌ

๐Ÿ“ฆ 1. Protocol Buffers (proto)๋ž€?

Protocol Buffers (protobuf)๋Š” Google์—์„œ ๊ฐœ๋ฐœํ•œ ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”(Serialization) ํฌ๋งท์ž…๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ์ด์ง„(Binary) ํ˜•์‹์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  • JSON, XML ๊ฐ™์€ ํฌ๋งท๊ณผ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜์ง€๋งŒ, ๋” ๋น ๋ฅด๊ณ , ๋” ๊ฐ€๋ณ๊ณ , ๋” ํšจ์œจ์ ํ•ฉ๋‹ˆ๋‹ค.

โœ… ์™œ React ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋‚˜?

1๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ํšจ์œจ์„ฑ

  • ์ด์ง„ ๋ฐ์ดํ„ฐ๋กœ ์ง๋ ฌํ™”๋˜์–ด ์ „์†ก ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ค„์ž…๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋ช…ํ™•ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ (Type Safety)

  • ์ •์  ํƒ€์ž…์„ ๋ณด์žฅํ•˜๊ณ , ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒ€์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ gRPC ํ†ต์‹  ์ง€์›

  • proto๋Š” gRPC์˜ ํ•ต์‹ฌ ๊ธฐ์ˆ ๋กœ, ํšจ์œจ์ ์ธ API ํ†ต์‹ ์„ ์œ„ํ•ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

๐Ÿ“„ ์‚ฌ์šฉ ์˜ˆ์ œ

syntax = "proto3";

message User {
  string id = 1;
  string name = 2;
  int32 age = 3;
}
import { User } from './message_pb';

const user = new User();
user.setId('123');
user.setName('Alice');
user.setAge(30);

const binaryData = user.serializeBinary();
const receivedUser = User.deserializeBinary(binaryData);
console.log(receivedUser.getName()); // "Alice"

๐Ÿš€ 2. gRPC๋ž€?

gRPC๋Š” Google์—์„œ ๊ฐœ๋ฐœํ•œ ๊ณ ์„ฑ๋Šฅ, ๋ฒ”์šฉ ์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ(Remote Procedure Call, RPC) ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

  • HTTP/2 ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ํ†ต์‹ ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

โœ… ์ฃผ์š” ํŠน์ง•

1๏ธโƒฃ HTTP/2 ๊ธฐ๋ฐ˜

  • ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ, ํ—ค๋” ์••์ถ• ๋“ฑ์„ ํ†ตํ•ด ๋‚ฎ์€ ์ง€์—ฐ ์‹œ๊ฐ„๊ณผ ๋น ๋ฅธ ์ „์†ก ์†๋„ ์ œ๊ณต.

2๏ธโƒฃ Protocol Buffers ์‚ฌ์šฉ

  • ์ด์ง„ ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”๋กœ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ , ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.

3๏ธโƒฃ ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ ์ง€์›

  • ๋‹จ์ˆœํ•œ ์š”์ฒญ-์‘๋‹ต๋ฟ ์•„๋‹ˆ๋ผ ์„œ๋ฒ„ ์ŠคํŠธ๋ฆฌ๋ฐ, ํด๋ผ์ด์–ธํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ, ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ€๋Šฅ.

๐Ÿ“Š REST API์™€ gRPC ๋น„๊ต

ํŠน์ง•REST APIgRPC
์ „์†ก ํ”„๋กœํ† ์ฝœHTTP/1.1HTTP/2
๋ฐ์ดํ„ฐ ํฌ๋งทJSONProtocol Buffers (์ด์ง„)
์ŠคํŠธ๋ฆฌ๋ฐ ์ง€์›์ œํ•œ์ ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ ์ง€์›
์„ฑ๋Šฅ์ผ๋ฐ˜์ ๋” ๋น ๋ฆ„
ํƒ€์ž… ๊ฒ€์ฆ์—†์Œ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ

โš™๏ธ gRPC ์‚ฌ์šฉ ์˜ˆ์ œ

๐Ÿ“„ Proto ํŒŒ์ผ

syntax = "proto3";

service UserService {
  rpc GetUser (UserRequest) returns (UserResponse);
}

message UserRequest {
  int32 id = 1;
}

message UserResponse {
  int32 id = 1;
  string name = 2;
  int32 age = 3;
}

๐Ÿ–ฅ๏ธ ์„œ๋ฒ„ ๊ตฌํ˜„ (Node.js)

const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');

const packageDefinition = protoLoader.loadSync('user.proto');
const userProto = grpc.loadPackageDefinition(packageDefinition).UserService;

const server = new grpc.Server();

server.addService(userProto.service, {
  GetUser: (call, callback) => {
    const user = { id: call.request.id, name: 'Alice', age: 30 };
    callback(null, user);
  },
});

server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
  server.start();
});

๐ŸŒ ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„ (React)

const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');

const packageDefinition = protoLoader.loadSync('user.proto');
const UserService = grpc.loadPackageDefinition(packageDefinition).UserService;

const client = new UserService('localhost:50051', grpc.credentials.createInsecure());

client.GetUser({ id: 1 }, (error, response) => {
  if (!error) {
    console.log(response); // { id: 1, name: 'Alice', age: 30 }
  }
});

๐Ÿ’ก ์š”์•ฝ

  • Protocol Buffers: ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™” ํฌ๋งท
  • gRPC: HTTP/2 ๊ธฐ๋ฐ˜์˜ ๊ณ ์„ฑ๋Šฅ ์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ ํ”„๋ ˆ์ž„์›Œํฌ
  • React ํ”„๋กœ์ ํŠธ์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”, ํƒ€์ž… ์•ˆ์ •์„ฑ, ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ ์„ฑ๋Šฅ + ํ™•์žฅ์„ฑ + ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด gRPC์™€ Protocol Buffers๋ฅผ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”!

profile
FE ๊ฐœ๋ฐœ์ž

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