<클론받은 프로젝트를 함께 봐주세요>

.proto 파일은 Protocol Buffers(줄여서 Protobuf)라는 직렬화 형식을 정의하기 위해 사용되는 스키마 파일이다.

Protobuf는 데이터를 효율적으로직렬화/역직렬화하는 데 사용되는 Google의 데이터 포맷인데, 이 .proto 파일은 그 데이터 구조와 RPC(Service)를 정의하는 데 쓰인다.

쉽게 말해, 서버와 클라이언트 간 통신에서"데이터를 어떻게 보낼지"와"어떤 메서드를 호출할지"를 설계하는 설계도 같은 역할이다.

🎇 두가지 구성 요소

  1. 메시지 (Message) : 교환되는 데이터 구조 정의

  2. 서비스(Service) : 클라이언트가 호출할 수 있는 원격 메서드 정의

🎆 .proto 파일 코드

syntax = "proto3";

package com.test.member.grpc;

// 여기에 내가 원하는 패키지명을 적는다. 아래는 예시이며 실제 프로젝트 패키지를 잘 보면서 수정하자.
//option java_multiple_files = true;
option java_package = "com.test.member.grpc";
option java_outer_classname = "MemberProto";

**service MemberService {
  // gRPC의 스트리밍 기능을 통해 다수의 요청과 응답을 효율적으로 처리하는 방식
  rpc StreamCreateMember (stream MemberRequest) returns (stream MemberCreateResponse);

  // 단일 회원 ID로 조회
  rpc GetMemberById (MemberIdRequest) returns (MemberResponse);

  // 이메일로 회원 조회
  rpc GetMemberByEmail (MemberEmailRequest) returns (MemberResponse);
}**

**// 회원 ID로 조회 요청
message MemberIdRequest {
  int64 id = 1;
}**

**// 이메일로 조회 요청**
message MemberEmailRequest {
  string email = 1;
}

**// 주소 정보
message Address {
  string street = 1;
  string city = 2;
  string country = 3;
  string postal_code = 4;
  map<string, string> additional_info = 5;
}**

// 연락처 정보
message Contact {
  string phone = 1;
  string mobile = 2;
  string work_phone = 3;
  repeated string emails = 4;
  map<string, string> social_media = 5;
}

**// 회원 정보 응답
message MemberResponse {
  int64 id = 1;
  string email = 2;
  string name = 3;
  string profile_image_base64 = 4;
  Address address = 5;
  Contact contact = 6;
  repeated string interests = 7;
  repeated string skills = 8;
  string metadata = 9;
}**

// 멤버 생성 요청 객체
message MemberRequest {
  int64 id = 1;
  string email = 2;
  string password = 3;
  string name = 4;
  // 대용량 필드
  string profileImageBase64 = 5;
  string etcInfo = 6;
}

// 멤버 생성 응답
message MemberCreateResponse {
  int64 id = 1;
  string email = 2;
  string password = 3;
  string name = 4;
  string profileImageBase64 = 5;
  string etcInfo = 6;
}

위와 같이 작성된 proto 파일은 단순히 설계도의 역할만 하는 것이 아니다.