flutter REST api통신과 gRPC통신

su.log·2022년 5월 23일
0

작년 초, 개발 인턴으로 첫회사에 근무했을 때 api로 서버통신을 하였다. 대부분의 회사가 rest api를 사용한다고 알고 있었고 입사하기 전에도 api를 이용하여 앱을 구현해 보았기에 큰 어려움 없이 통신할 수 있었다.
그리고 두번째 회사인 현 회사로 이직을 하게 되었다. 현 회사는 통신방법으로 gRPC를 이용한다. 입사 전에 gRPC에 대하여 많이 찾아보았지만 실무에 적용하는 것은 역시 달랐다. 처음에는 좀 해메기도 했었고 어렵다는 생각도 들었지만 1년이 다 되어가는 지금은 gRPC통신의 장점도 많다고 생각한다.

그래서 gRPC와 api의 차이점이 무엇이 있는지 각각의 사용법은 어떻게 다른지에 대해 정리도 할 겸 포스팅을 작성해 보려고 한다.

REST api란 무엇일까?

REST api는 rest의 원리를 따르는 api(프로그램이 서로 상호작용을 하도록 도와주는 매개체)를 의미한다.
우선적으로 이 REST란 HTTP프로토콜 자원의 표현중 하나로 구체적으로 HTTP URI로 자원을 명시하고 HTTP. Method(POST, GET, PUT, DELETE)를 통해 자원에 대한 CRUD를 적용한다. 웹의 기존기술과 HTTP프로토콜을 그대로 쓰기 때문에 웹의 장점을 최대한 활용가능하다.

Flutter에서의 api사용방법

REST api는 HTTP를 사용하니 pub.dev에서 HTTP 패키지를 검색하여 Pubspec.yaml 파일에 패키지를 추가해준다.
아래가 현재 버전이다.

dependencies:
  http: ^0.13.4

그리고 api를 불러올 file에 import를 해준다.

import 'package:http/http.dart' as http;

api로 통신하려면 중요한 포인트가 있는데 그것은 json데이터의 가공이다.
api는 클라이언트가 콜을 하면 json이라는 약속된 데이터로 Map<key, value> 형식을 반환해 준다.

 var response = await http.get(Uri.parse(url),
        headers: {"Content-Type": "application/json", 'X-User-Email': userEmail, 'X-User-Token': userToken});
    var locationsJson = json.decode(response.body);

Flutter에서는 그 json 데이터를 class로 만들어 파싱해서 사용할 수 있다.

class Banner {
  String title;
  String url;
  BannerImage image;
  String shape;
  String notice;

  Banner({this.title, this.url, this.image, this.shape, this.notice});

  Banner.fromJson(Map<String, dynamic> json) {
    title = json['title'];
    url = json['url'];
    image = json['image'] != null ? new BannerImage.fromJson(json['image']) : null;
    shape = json['shape'];
    notice = json['notice'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['title'] = this.title;
    data['url'] = this.url;
    if (this.image != null) {
      data['image'] = this.image.toJson();
    }
    return data;
  }
}

만약 규모가 큰 서비스라면 json_serializable이라는 패키지로 좀 더 정확도 높게 파싱할 수도 있다.

이렇게 REST api는 model로 파싱을 해서 사용해줘야 하지만 사용법이 어렵지않고 보편적으로 사용되는 방법이다.

그렇다면 gRPC란 무엇일까?

RPC(Remote Procedure Calls)란 마이크로서비스 아키텍쳐(MSA)에서 사용하는 프로세스간 통신 기술이였고 기존에도 클라이언트 - 서버 앱을 구축하는데 사용되던 프로세스 통신 기술이였다.
gRPC는 구글에서 만들었으며 프로토콜 버퍼라는 언어로 구현을 한다. gRPC는 구글 사내에서 서버간 통신을 위해 사용하던 RPC를 오픈 소스로 공개한 것.
SSL/TLS를 사용하여 서버를 인증하고 클라이언트와 서버간에 교환되는 모든 데이터를 암호화한다.

gRPC의 사용법

medium의 글인데 proto에서 dart파일을 생성하는 방법과 gRPC를 클라이언트에서 사용하는 방식을 잘 정리해두었다.
https://towardsdev.com/flutter-grpc-9c6029662dcc

REST api와 gRPC의 비교

REST api는 보내주는 내용물의 값이 json으로 구성되어 있고 gRPC는 protobuf로 구성되어 있다.
protobuf는 서버와 클라이언트에서 빠른 속도로 직렬화 되어 latency가 적고 api 통신에 비해 가볍고 빠르다는 장점이 있다.

또한 gRPC는 proto파일의 규약이 있어 그 규약에 맞게 소스코드를 작성하게 됨으로 규격화된 데이터를 클라이언트에게 제공해준다. 반면 REST api는 자율성이 높다.

gRPC는 proto파일을 dart로 자동 변환해주고 가져오면 되므로 따로 직렬화가 필요없다는 장점이 있다.

0개의 댓글