firebase 삽질

2019-04-22

요즘 핫한 firebase를 Spring에 한번 연동을 시켜보려고 했다. 그런데 사용하다보니 Mysql에서 사용하는 auto_increment도 안되있어서 firebase에서 제공해주는 ID 값을 넣어야하고, DB테이블을 lookup 하는 과정도 많이 번거로웠다.

그래서 교수님한테 여쭤보니 앱이나 node.js에서 웹을 만들때 많이 사용한다고 한다. (백엔드를 쉽게 구축하기위해서)

원래 목적은 cloue firebase와 구글의 인증서버를 사용해서 웹을 빠르게 만들려고 했으나, 더 시간이 많이 걸리는걸 깨닫게되었다.

firebase은 앱이나 node.js에서 사용하세요!

Dao 작업했던 소스도 같이 올리겠습니다.

package com.www.homedoc.dao;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutionException;

import com.google.api.core.ApiFuture;
import com.google.cloud.firestore.CollectionReference;
import com.google.cloud.firestore.DocumentReference;
import com.google.cloud.firestore.DocumentSnapshot;
import com.google.cloud.firestore.Firestore;
import com.google.cloud.firestore.QueryDocumentSnapshot;
import com.google.cloud.firestore.QuerySnapshot;
import com.google.cloud.firestore.Transaction;

public abstract class CRUDDaoImpl<T, PK> implements CRUDDao<T, PK> {

    private Firestore db;

    private DocumentReference docRef;

    private CollectionReference pointedRef;

    private String collectionName;

    public CRUDDaoImpl(String collectionName) throws IOException {
        this.collectionName = collectionName;
        System.out.println("Firebase 생성자 호출");
        db = FirebaseCreator.CreateConnection();
        System.out.println("CRUDDaoImpl db :" + db);

        System.out.println(collectionName);
        docRef = db.collection("users").document();
        System.out.println(docRef);

        // collectionName으로 받아서 하는걸로 수정할것
        pointedRef = db.collection("users");

    }

    @Override
    public int insert(final T dto) {
        ApiFuture<String> transaction = db.runTransaction(new Transaction.Function<String>() {
            @Override
            public String updateCallback(Transaction transaction) throws Exception {

                transaction.set(docRef, dto);

                transaction.update(pointedRef.document(docRef.getId()), "no", docRef.getId());
                return "insert 완료";
            }
        });
        try {
            transaction.get();
        } catch (InterruptedException e) {
            // TODO Auto-generat3SsXed catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return 1;
    }

    @Override
    public int update(T dto, PK no) {

        System.out.println("-- update() --");
        ApiFuture<Integer> transaction = db.runTransaction(new Transaction.Function<Integer>() {
            @Override
            public Integer updateCallback(Transaction transaction) throws Exception {
                // dto no을 문서의 이름과 동일하게 하는 작업
                transaction.update(pointedRef.document((String) no), "pw", "!234");
                ;

                return 1;
            }
        });
        try {
            transaction.get();
        } catch (InterruptedException e) {
            // TODO Auto-generat3SsXed catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return 0;

    }

    public int deleteByNo(PK no) {

        ApiFuture<String> transaction = db.runTransaction(new Transaction.Function<String>() {
            @Override
            public String updateCallback(Transaction transaction) throws Exception {
                transaction.delete(pointedRef.document((String) no));
                return null;
            }
        });

        try {
            transaction.get();
        } catch (InterruptedException e) {
            // TODO Auto-generat3SsXed catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return 1;
    }


}