Akashic Records

Protocol buffers vs. JSON 본문

Library

Protocol buffers vs. JSON

Andrew's Akashic Records 2023. 11. 30. 15:26
728x90

Protocol buffers와 JSON은 모두 데이터를 직렬화하고 역직렬화하는 데 사용되는 인기 있는 형식입니다. 두 형식 모두 장단점이 있으므로 프로젝트에 적합한 형식을 선택하는 것이 중요합니다.

 

Protocol buffers는 Google에서 개발한 형식입니다. 바이너리 형식으로 데이터를 직렬화하므로 JSON보다 크기가 작습니다. 또한 Protocol buffers는 데이터 구조를 정의하는 데 사용할 수 있는 스키마를 제공하므로 개발자가 데이터를 더 쉽게 이해하고 사용할 수 있습니다.

 

JSON은 자바스크립트의 표준 데이터 형식입니다. 텍스트 형식으로 데이터를 직렬화하므로 Protocol buffers보다 크기가 큽니다. 그러나 JSON은 더 읽기 쉽고 이해하기 쉬우며 다양한 언어에서 지원됩니다.

특성 Protocol buffers JSON
형식 바이너리 텍스트
크기 작음
스키마 제공됨 없음
읽기 쉬움 어려움 용이함
확장성 어려움 용이함
다양한 언어 지원 어려움 용이함

 

Protocol buffers를 사용하는 것이 좋은 경우

  • 데이터 크기가 중요한 경우
  • 데이터 구조를 정의하는 데 스키마를 사용할 필요가 있는 경우
  • 성능이 중요한 경우

JSON을 사용하는 것이 좋은 경우

  • 데이터 크기가 중요하지 않은 경우
  • 데이터 구조를 정의하는 데 스키마를 사용할 필요가 없는 경우
  • 읽기 용이성과 확장성이 중요한 경우
  • 다양한 언어에서 지원이 중요한 경우

구체적인 예

  • 데이터 크기가 중요한 경우
    • 모바일 장치에서 사용되는 데이터
    • 네트워크를 통해 전송되는 데이터
    • 저장 공간이 제한된 장치에서 사용되는 데이터
  • 데이터 구조를 정의하는 데 스키마를 사용할 필요가 있는 경우
    • 데이터를 교환하는 시스템
    • 데이터를 저장하는 시스템
    • 데이터를 분석하는 시스템
  • 성능이 중요한 경우는 다음과 같은 경우가 있습니다.
    • 실시간으로 데이터를 처리하는 시스템
    • 대규모 데이터를 처리하는 시스템
  • 데이터 크기가 중요하지 않은 경우
    • 데스크톱 또는 서버에서 사용되는 데이터
    • 개발 도구에서 사용되는 데이터
  • 데이터 구조를 정의하는 데 스키마를 사용할 필요가 없는 경우
    • 데이터를 테스트하는 경우
    • 데이터를 임시로 저장하는 경우
  • 읽기 용이성과 확장성이 중요한 경우
    • 개발자가 데이터를 쉽게 이해하고 사용할 필요가 있는 경우
    • 데이터를 다양한 언어에서 사용할 필요가 있는 경우
  • 다양한 언어에서 지원이 중요한 경우
    • 국제적인 프로젝트에서 사용되는 경우
    • 다양한 언어를 사용하는 개발자가 사용하는 경우

예시코드

Protocol buffers

# Person.proto 파일
syntax = "proto3";

package tutorial;

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}

위의 Person.proto 파일은 Protocol buffers의 데이터 구조를 정의하는 파일입니다. message 키워드를 사용하여 데이터 구조를 정의하고, field 키워드를 사용하여 데이터 필드를 정의합니다.

 

# Person.py 파일
from google.protobuf import message


class Person(message.Message):
  name = message.StringField(1)
  id = message.IntegerField(2)
  email = message.StringField(3)


person = Person()
person.name = "John Doe"
person.id = 12345
person.email = "johndoe@example.com"


# Person 데이터를 직렬화
data = person.SerializeToString()


# Person 데이터를 역직렬화
person2 = Person()
person2.ParseFromString(data)


print(person2.name)
# John Doe

print(person2.id)
# 12345

print(person2.email)
# johndoe@example.com

위의 Person.py 파일은 Person.proto 파일을 사용하여 Person 클래스를 정의합니다. person 변수를 사용하여 Person 인스턴스를 생성하고, name, id, email 속성을 설정합니다. 그런 다음, SerializeToString() 메서드를 사용하여 Person 데이터를 직렬화합니다. ParseFromString() 메서드를 사용하여 직렬화된 Person 데이터를 역직렬화합니다.

 

JSON

# person.json 파일
{
  "name": "John Doe",
  "id": 12345,
  "email": "johndoe@example.com"
}

위의 person.json 파일은 JSON 형식으로 된 Person 데이터입니다.

 

# person.py 파일
import json


def load_person(filename):
  with open(filename, "r") as f:
    data = json.load(f)
  return data


def save_person(person, filename):
  with open(filename, "w") as f:
    json.dump(person, f)


person = load_person("person.json")


print(person["name"])
# John Doe

print(person["id"])
# 12345

print(person["email"])
# johndoe@example.com


save_person(person, "person.json")

위의 person.py 파일은 person.json 파일을 읽고 쓰는 함수를 정의합니다. load_person() 함수는 person.json 파일을 읽고 Person 데이터를 반환합니다. save_person() 함수는 Person 데이터를 person.json 파일에 씁니다.

 

두 코드의 차이점은 다음과 같습니다.

  • Protocol buffers는 바이너리 형식으로 데이터를 직렬화하므로 JSON보다 크기가 작습니다.
  • Protocol buffers는 데이터 구조를 정의하는 데 스키마를 제공하므로 개발자가 데이터를 더 쉽게 이해하고 사용할 수 있습니다.
  • JSON은 더 읽기 쉽고 이해하기 쉽습니다.
  • JSON은 다양한 언어에서 지원됩니다.

따라서, 프로젝트의 요구 사항에 따라 Protocol buffers 또는 JSON을 선택하면 됩니다.

 

위의 코드에서 다음과 같은 변경 사항을 적용했습니다.

  • Person.proto 파일에서 syntax 키워드를 사용하여 프로토콜 버전 3을 지정했습니다.
  • Person.py 파일에서 message 모듈을 사용하여 Person 클래스를 정의했습니다.
  • SerializeToString() 메서드와 ParseFromString() 메서드를 사용하여 Person 데이터를 직렬화하고 역직렬화했습니다.
  • json 모듈을 사용하여 JSON 데이터를 읽고 썼습니다.

이러한 변경 사항은 최신 Protocol buffers와 Python의 표준 라이브러리를 사용하는 데 필요한 것입니다.

다른 예시코드

Spring Framework에서 Protocol buffers를 적용하려면 다음과 같은 단계를 거칩니다.

  1. protoc 컴파일러를 설치합니다.
  2. proto 파일을 생성합니다.
  3. proto 파일을 컴파일합니다.
  4. protobuf-spring-boot-starter 의존성을 추가합니다.
  5. @Configuration 클래스를 사용하여 ProtobufMapper를 등록합니다.

다음은 Spring Boot에서 Protocol buffers를 적용하는 예시코드입니다.

// Person.proto 파일
syntax = "proto3";

package tutorial;

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}

위의 Person.proto 파일은 Protocol buffers의 데이터 구조를 정의하는 파일입니다.

 

// PersonMapper.java 파일
@Mapper
public interface PersonMapper {
  Person fromProto(PersonProto personProto);
  PersonProto toProto(Person person);
}

위의 PersonMapper 클래스는 PersonPersonProto 간의 매핑을 제공하는 클래스입니다.

 

// Application.java 파일
@SpringBootApplication
public class Application {

  @Bean
  public PersonMapper personMapper() {
    return new PersonMapperImpl();
  }

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

위의 Application 클래스는 PersonMapper 클래스를 @Bean으로 등록합니다.

 

// PersonController.java 파일
@RestController
public class PersonController {

  @Autowired
  private PersonRepository personRepository;

  @GetMapping("/persons")
  public List<Person> getPersons() {
    return personRepository.findAll();
  }

  @PostMapping("/persons")
  public Person createPerson(@RequestBody Person person) {
    return personRepository.save(person);
  }
}

위의 PersonController 클래스는 PersonRepository를 사용하여 Person을 저장하고 조회합니다.

이 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

 

[
  {
    "name": "John Doe",
    "id": 12345,
    "email": "johndoe@example.com"
  },
  {
    "name": "Jane Doe",
    "id": 67890,
    "email": "janedoe@example.com"
  }
]

이 코드를 통해 Spring Boot에서 Protocol buffers를 적용하는 방법을 이해할 수 있습니다.

 

다음은 Spring Boot에서 Protocol buffers를 적용할 때 유용한 팁입니다.

  • @Configuration 클래스를 사용하여 ProtobufMapper를 등록하면 ProtobufMapper가 스프링 컨테이너에 자동으로 등록됩니다.
  • @Mapper 어노테이션을 사용하여 PersonMapper 클래스에 ProtobufMapper 인터페이스를 구현합니다.
  • fromProto() 메서드를 사용하여 PersonProtoPerson으로 변환합니다.
  • toProto() 메서드를 사용하여 PersonPersonProto로 변환합니다.

이러한 팁을 사용하여 Spring Boot에서 Protocol buffers를 효과적으로 적용할 수 있습니다.

 

다음은 REST API로 전달받은 데이터를 처리하는 Javascript 코드의 예시입니다.

const url = "https://api.example.com/persons";

fetch(url)
  .then((response) => response.json())
  .then((data) => {
    // data는 JSON 형식의 데이터입니다.
    console.log(data);
  });

위의 코드는 https://api.example.com/persons URL의 REST API를 호출합니다. response.json() 메서드를 사용하여 응답 데이터를 JSON 형식으로 변환합니다. 그런 다음, console.log() 함수를 사용하여 JSON 형식의 데이터를 출력합니다.

 

이 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

[
  {
    "name": "John Doe",
    "id": 12345,
    "email": "johndoe@example.com"
  },
  {
    "name": "Jane Doe",
    "id": 67890,
    "email": "janedoe@example.com"
  }
]

 

REST API로 전달받은 데이터가 Protocol buffers 형식인 경우 다음과 같이 처리할 수 있습니다.

const url = "https://api.example.com/persons";

fetch(url)
  .then((response) => response.arrayBuffer())
  .then((data) => {
    // data는 Protocol buffers 형식의 데이터입니다.
    const person = new PersonProto();
    person.ParseFromString(data);

    console.log(person.name);
  });

위의 코드는 https://api.example.com/persons URL의 REST API를 호출합니다. response.arrayBuffer() 메서드를 사용하여 응답 데이터를 ArrayBuffer 형식으로 변환합니다. 그런 다음, new PersonProto() 생성자를 사용하여 PersonProto 인스턴스를 생성합니다. ParseFromString() 메서드를 사용하여 ArrayBuffer 형식의 데이터를 역직렬화합니다. 마지막으로, console.log() 함수를 사용하여 PersonProto 인스턴스의 name 속성을 출력합니다.

 

이 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

John Doe

결론

Protocol buffers는 Google에서 개발한 데이터 직렬화 형식입니다. 바이너리 형식으로 데이터를 직렬화하므로 JSON보다 크기가 작습니다. 또한 Protocol buffers는 데이터 구조를 정의하는 데 스키마를 제공하므로 개발자가 데이터를 더 쉽게 이해하고 사용할 수 있습니다.

 

Protocol buffers는 Google의 다양한 제품과 서비스에서 사용되고 있습니다. 예를 들어, Google Cloud Platform의 RPC 프레임워크인 gRPC는 Protocol buffers를 사용하여 데이터를 직렬화합니다. 또한, Android와 iOS의 네트워킹 라이브러리도 Protocol buffers를 지원합니다.

 

Protocol buffers의 사용 트렌드는 계속해서 증가하고 있습니다. 특히, 모바일 장치와 IoT 기기에서 Protocol buffers의 사용이 증가하고 있습니다. 이는 이러한 장치에서 데이터 크기가 중요한 요소이기 때문입니다.

 

Protocol buffers의 발전성은 Google의 지속적인 지원으로 인해 높습니다. Google은 Protocol buffers를 지속적으로 개선하고 새로운 기능을 추가하고 있습니다. 또한, Protocol buffers는 다양한 언어와 플랫폼에서 지원되므로 개발자가 쉽게 사용할 수 있습니다.

 

JSON은 자바스크립트의 표준 데이터 형식입니다. 텍스트 형식으로 데이터를 직렬화하므로 Protocol buffers보다 크기가 큽니다. 그러나 JSON은 더 읽기 쉽고 이해하기 쉽습니다. 또한 JSON은 다양한 언어에서 지원됩니다.

 

JSON는 다양한 분야에서 사용되고 있습니다. 예를 들어, 웹 개발에서 JSON은 HTTP 응답과 요청의 데이터를 전송하는 데 사용됩니다. 또한, 데이터베이스에서 JSON을 사용하여 데이터를 저장하고 조회할 수 있습니다.

 

JSON의 사용 트렌드는 계속해서 증가하고 있습니다. 이는 JSON이 다양한 분야에서 사용될 수 있는 유연한 형식이기 때문입니다.

 

JSON의 발전성은 표준 언어이기 때문에 높습니다. JSON은 지속적으로 개선되고 새로운 기능이 추가되고 있습니다. 또한, JSON은 다양한 언어와 플랫폼에서 지원되므로 개발자가 쉽게 사용할 수 있습니다.

특성 Protocol buffers JSON
사용 트렌드 증가 증가
발전성 높음 높음
장점 데이터 크기가 작음, 스키마 지원 읽기 쉬움, 이해 쉬움, 다양한 언어 지원
단점 데이터 크기가 크다, 스키마가 필요하지 않음 데이터 크기가 크다, 스키마가 필요하지 않음

Protocol buffers와 JSON의 사용 트렌드와 발전성 비교

 

따라서, 프로젝트의 요구 사항에 따라 Protocol buffers 또는 JSON을 선택하면 됩니다. 데이터 크기가 중요한 경우 Protocol buffers를 선택하는 것이 좋습니다. 데이터 크기가 중요하지 않은 경우 JSON을 선택하는 것이 좋습니다.

728x90

'Library' 카테고리의 다른 글

개발자의 행복을 파괴하는 10가지 방법  (0) 2024.01.09
Deno(Next-generation JavaScript runtime)  (1) 2023.12.01
CPU와 GPU  (0) 2023.11.10
The best open source software of 2023  (0) 2023.11.06
HTMX(Hypertext Markup X)  (0) 2023.10.20
Comments