본문 바로가기
memo

firebase : Cloud Firestore

by 킹차니 2023. 6. 10.

toss payments의 결제 연동을 위해 no sql을 저장해야할 필요가 생겼다. 해서 나느 일단 구현을 위해 firebase를 사용하기로 해서 firebase에 대해 간단히 정리해보려한다.

 

NoSql 사용 이유:

토스 페이먼츠의 API를 호출하면 응답으로 Payment 객체라는 것을 준다. 개발자 센터에서 예시로 제공하는 Payment 응답 객체는 다음과 같다.

{
    "mId": "tosspayments",
    "version": "2022-11-16",
    "transactionKey": null,
    "lastTransactionKey": null,
    "paymentKey": "0jPR7DvYpNk6bJXmgo28e1QkmPjlE8LAnGKWx4qMl91aEwB5",
    "orderId": "a4CWyWY5m89PNh7xJwhk1",
    "orderName": "pattern T shrit",
    "status": "READY",
    "requestedAt": "2022-08-04T23:50:00+09:00",
    "approvedAt": null,
    "useEscrow": null,
    "cultureExpense": false,
    "card": null,
    "virtualAccount": null,
    "transfer": null,
    "mobilePhone": null,
    "giftCertificate": null,
    "cashReceipt": null,
    "cashReceipts": null,
    "discount": null,
    "cancels": null,
    "secret": null,
    "type": "NORMAL",
    "easyPay": null,
    "country": "KR",
    "failure": null,
    "isPartialCancelable": true,
    "receipt": null,
    "checkout": {
        "url": "https://api.tosspayments.com/v1/payments/0jPR7DvYpNk6bJXmgo28e1QkmPjlE8LAnGKWx4qMl91aEwB5/checkout"
    },
    "currency": "KRW",
    "totalAmount": 100,
    "balanceAmount": 100,
    "suppliedAmount": 91,
    "vat": 9,
    "taxFreeAmount": 0,
    "taxExemptionAmount": 0,
    "method": null
}

일단 데이터가 매우 많고 null값인 경우도 매우 많다. 해서 RDB에 저장하기에는 괘나 비효율적이라고 생각했다.

또한 중첩된 데이터도 많이 보였다.

 

firestore 사용이유 : 

일단 무료로 제공하는 크레딧이 있어 이를 사용하고 싶었다. 전에 알람 기능을 추가할때도 fisebase의 서비스를 사용했는데, 이때도 꽤나 만족스럽게 사용했다. 비공개 키를 발급받고 firebase의 문서를 보고 따라만하면 금방 구현할 수 있다.

AWS의 DynamoDB를 사용해볼까도 했지만 일단 AWS에는 이미 너무 많은 돈을 쓰고 있고, 지금 당장 결제 기능을 추가한다고 해도 바로 결제가 발생하지는 않을 것이기 때문이다. 해서 일단 무료로 쉽게 사용할 수 있는 firestore를 사용하기로 했다.

 

 

firestore의 문서에서는 firestore에 대해 다음과 같은 설명을 하고 있다.

Cloud Firestore는 문서 중심의 NoSQL 데이터베이스입니다. SQL 데이터베이스와 달리 테이블이나 행이 없으며, 컬렉션으로 정리되는 문서에 데이터를 저장합니다.
각 문서에는 키-값 쌍이 들어 있습니다. Cloud Firestore는 작은 문서로 이루어진 대규모 컬렉션을 저장하는 데 최적화되어 있습니다. 모든 문서는 컬렉션에 저장되어야 합니다. 문서는 하위 컬렉션 및 중첩된 객체를 포함할 수 있으며, 둘 다 문자열 같은 기본 필드나 목록 같은 복합 객체를 포함할 수 있습니다.
컬렉션과 문서는 Cloud Firestore에서 암시적으로 생성됩니다. 사용자는 컬렉션 내 문서에 데이터를 할당하기만 하면 됩니다. 컬렉션이나 문서가 없으면 Cloud Firestore에서 만듭니다.

일반적인 NoSQL의 특징과 당연히 같다. 

test로 firestore에 넣은 데이터를 보면 위와 같다. 컬렉션은 RDB의 테이블이라고 생각하면 되고, 문서는 RBD의 컬럼이라고 생각하면 쉽다. 이때 문서는 레코드를 식별하는 값이 된다.

 

 

 

 

 

위는 사용자 lol이라는 user를 나타내는 문서이다.

• lol
first : "Ada"
last : "Lovelace"
born : 1815

 

그런데 이때 문서의 복잡한 중첩된 객체를 이라고 한다. 예를 들어 위의 사용자를 아래와 같이 저장할 수 있다.

• lol
name : 
    first : "Ada"
    last : "Lovelace"
born : 1815

firestore에 저장되는 데이터는 json과 매우 유사하다.(물론 다른 nosql도 마찬가지)

 

컬렉션

문서는 단순히 문서의 컨테이너인 컬렉션에 저장된다. 위에서 든 예시처럼 여러 user데이터를 저장하는 users 컬렉션이 있을 수 있다.

users
    • lol
     first : "Ada"
     last : "Lovelace"
     born : 1815

    • aturing
    first : "Alan"
    last : "Turing"
    born : 1912

컬렉션은 단지 문서만을 저장한다. 값이 있는 원시 필드를 직접 포함하거나 다른 컬렉션을 포함할 수 없다.

이때 컬렉션 내에서의 문서 이름은 고유하다. 이때 사용자 ID처럼 고유한 값을 직접 명시하여 저장하거나 Cloud firestore에서 임시적으로 ID를 자동으로 만들도록 할 수 있다.

 

 

 

 

 

 

 

 

'memo' 카테고리의 다른 글

HiKariCP  (0) 2023.08.01
MSA 간 데이터 동기화  (0) 2023.05.24