Skip to content

Firestore를 REST API처럼 사용하기 #

Find similar titles
  • 최초 작성자

Structured data

Category
Programming

Firestore를 REST API처럼 사용하기 #

목차 #

  1. 서론
  2. 개요
  3. Firestore 소개
  4. Retrofit 소개
  5. Firestore와 Retrofit 연동 방법
  6. 장점과 단점
  7. 작성 예시 및 결과
  8. 결론
  9. 참고 자료

서론 #

Firebase Firestore와 Flutter의 Retrofit 라이브러리를 결합하여 Flutter 프로젝트에서 Firestore와 Retrofit을 연동하는 방법에 대해 알아보겠습니다. 이를 통해 Flutter 앱에서 Firestore 데이터베이스를 사용하고, Retrofit을 통해 원격 API와 통신하는 기능을 구현할 수 있습니다.

개요 #

Flutter는 Google에서 개발한 크로스 플랫폼 모바일 앱 개발 프레임워크로, 다양한 플랫폼에서 동작하는 앱을 빠르고 효율적으로 개발할 수 있습니다. Firestore는 Google Cloud의 서버리스 클라우드 데이터베이스 서비스로, NoSQL 데이터베이스로 구조화된 데이터를 저장하고 실시간으로 동기화하는 기능을 제공합니다. Retrofit은 Square에서 개발한 HTTP 클라이언트 라이브러리로, 안드로이드와 Flutter를 포함한 다양한 플랫폼에서 RESTful API 통신을 쉽게 구현할 수 있습니다.

Firestore 소개 #

Firestore는 구조화된 데이터를 저장하고 동기화하는 데 사용되는 클라우드 데이터베이스입니다. NoSQL 데이터베이스로서 JSON 문서 형식으로 데이터를 저장하며, 실시간으로 데이터의 변경 사항을 감지하여 동기화할 수 있습니다. Firestore는 데이터베이스 및 인증, 보안, 호스팅 등의 다양한 기능을 제공하며, Firebase SDK를 통해 쉽게 통합할 수 있습니다.

Image

Retrofit 소개 #

Retrofit은 안드로이드 및 Flutter와 같은 플랫폼에서 RESTful API와 통신하기 위해 사용되는 라이브러리입니다. Retrofit은 간편한 인터페이스 정의를 통해 API 요청 및 응답 처리를 자동화하고, HTTP 요청 메서드, 경로, 쿼리 매개변수, 요청 및 응답 형식 등을 쉽게 설정할 수 있습니다. 또한, Retrofit은 다양한 인터셉터를 사용하여 네트워크 요청을 가로채고 수정할 수 있는 유연성을 제공합니다.

Image

Firestore와 Retrofit 연동 방법 #

Firestore와 Retrofit을 연동하는 방법은 다음과 같습니다.

Firestore 데이터를 가져와서 Retrofit 모델 클래스에 매핑합니다. Retrofit을 사용하여 Firestore 데이터베이스에 데이터를 저장, 수정, 삭제하는 API를 정의합니다. Flutter 앱에서 Retrofit을 통해 API를 호출하여 Firestore 데이터를 조작합니다.

장점과 단점 #

Firestore와 Retrofit 연동의 장단점은 다음과 같습니다.

  • 장점:

Flutter에서 Firestore의 실시간 업데이트를 활용하여 동기화된 데이터를 제공할 수 있습니다. Retrofit을 사용하여 RESTful API와 통신할 때 간편한 인터페이스 정의와 유연한 요청 및 응답 처리를 제공합니다. Firebase SDK와 Retrofit 라이브러리는 개발자들에게 편리한 문서와 예제 코드를 제공하여 개발 속도를 향상합니다.

  • 단점:

Firestore는 Firebase 프로젝트와 밀접하게 연결되어 있어서 Firebase 인증과 같은 추가 구성이 필요할 수 있습니다. Retrofit 패키지에 대한 이해가 필요하며, Firestore의 공식 문서에 대한 레퍼런싱이 필요합니다.

작성 예시 #

아래는 Firestore와 Retrofit을 사용하여 Flutter 프로젝트에서 데이터를 가져오고 업데이트하는 예시 코드입니다.

// Firestore 데이터 모델 클래스
class UserData {
  String name;
  int age;

  UserData({required this.name, required this.age});

  factory UserData.fromJson(Map<String, dynamic> json) {
    return UserData(
      name: json['name'],
      age: json['age'],
    );
  }
}

// Retrofit API 인터페이스
abstract class ApiService {
  @GET("/users/{userId}")
  Future<UserData> getUserData(@Path("userId") String userId);
}

// Firestore와 Retrofit 연동 예시
void fetchUserData() async {
  // Firestore 데이터 가져오기
  DocumentSnapshot<Map<String, dynamic>> snapshot =
      await FirebaseFirestore.instance.collection('users').doc('userId').get();

  if (snapshot.exists) {
    // Firestore 데이터를 Retrofit 모델로 매핑
    UserData userData = UserData.fromJson(snapshot.data());

    // Retrofit을 사용하여 API 호출
    ApiService apiService = RetrofitService().createService(ApiService);
    UserData updatedUserData = await apiService.getUserData('userId');

    // Retrofit을 사용하지 않고 Firestore에 직접 업데이트
    FirebaseFirestore.instance
        .collection('users')
        .doc('userId')
        .update(updatedUserData.toJson());
  }
}

아래는 Firestore와 Retrofit을 사용하여 Flutter 프로젝트에서 외부 데이터를 Get 방식으로 호출하는 모습입니다. Image

결론 #

이 문서에서는 Firestore와 Retrofit을 Flutter 프로젝트에서 연동하는 방법에 대해 살펴보았습니다. 당장 바로 위 코드만 봐도 Retrofit을 사용하지 않는다면 collection을 통한 Firebase 문법으로 접근하여야 하는데, 이는 심각한 유지보수 문제를 초래합니다. 필자는 Firebase의 문법을 모르더라도 RESTful API를 사용할 줄 아는 Flutter 개발자가 Flutter framework로 개발된 Client Application을 유지보수할 수 있어야 한다고 생각하기 때문입니다. 또한, 필자는 Clean Architecture를 적용하여 Firestore뿐 아니라 모든 외부 데이터의 I/O를 Data Layer에서 처리하도록 설계할 것입니다. 외부 데이터의 접근 방법에 대한 일관성은 소프트웨어의 안정성 및 확장성에 도움이 될 것이라 확신하기 때문에 이처럼 시도하였음을 이곳에 남깁니다.

참고 자료 #

0.0.1_20230725_7_v68