gin과 firestore 연동하기

리알테·2022년 4월 19일
0

golang

목록 보기
3/3
post-custom-banner

왜 두개를 연결하게 되었나요

클론 프로젝트를 진행하게 되면서 백단은 golang을 이용한 gin으로 restful을 활용하기로 정했는데, 역시 여러명이 하는거다보니 db를 무엇으로할지 고민이 되었다

  • rdbms는 익숙하니까 nosql로 해볼까
  • 여러명이 쉽게 공유할수있는 db없나

결론 : google에서 지원하는 firebasefirestore사용해보자!


firestore DB

firebase에는 여러 서비스가 있는데, 그중 firestore는 nosql기반으로 비교적 쉽게 데이터를 관리할 수 있다.
무엇보다 golang 지원이 잘된다! 같은 회사라 그런걸까..

연동

처음엔 realtimeDB연결하다가 firestore 함수쓰려니까 안돼서 이게뭐냐 했었지만.. 결론은 잘 연결했다.
잊지않기위해 기록을 해본다~!

1. firebase 프로젝트 생성 후 admin sdk 넣고 초기화하기

https://console.firebase.google.com/?hl=ko
에서 프로젝트를 생성한다.

추가를 하고나면, 사진의 clone처럼 프로젝트가 생기고, 하단에 프로젝트명-uid식으로 된 게 projectId이다.
클릭해서 들어가게 되면 console이 나오는데, 여기서 모든 게 이루어진다. 좌측 메뉴 중 firestore를 클릭한다.


이런식으로 프로젝트를 만들기만 하면, firestore를 사용할 수 있다!
이제 남은 건 gin과의 연동뿐!!!!
auth 문제때문에 꼭 해줘야하는 게 있는데, 권장하는 방법인 admin sdk를 통해 연결하는 게 낫다.
https://firebase.google.com/docs/admin/setup?hl=ko#go
이 사이트에서 A to Z를 설명해줘서 연동이 쉬웠다.
우선, go get을 통해 firebase 패키지를 추가한다.

그다음, 연동을 위한 를 발급받아야한다

링크를 클릭해서 들어가면,

서비스키를 생성하면된다! 그러면 json파일을 받을 수 있는데, 안내서에서는 json파일의 경로를 지정해서 그 경로를 env파일에 넣어 관리하는 식으로 권장되고 있다.

여기까지 따라했다면 인증을 무리없이 뚫을 수 있다.

2. firestore 연결

환경변수 관리를 위해 패키지를 다운받았다.

.env파일에 환경변수를 선언한다.

그리고나서.. 문제가 있었다.. 예제대로했더니 firebase를 연결해서 쓰고있자니 firestore 관련 예제가 자꾸 함수가 없다고 뜨는것이다!!!
그래서.. 결국 firestore 패키지를 다시 다운받았다(....)
https://pkg.go.dev/cloud.google.com/go/firestore#section-documentation
연동방법은 비슷하다. newApp을 하지 않고 바로 newClient한다는 점 정도..

ctx := context.Background()
client, err := firestore.NewClient(ctx, "projectID")
if err != nil {
	// TODO: Handle error.
}

projectID부분에 자신의 것을 넣어주면,,, 연동끝이다,.,,
정말 쉽다...

package config

import (
	"cloud.google.com/go/firestore"
	"context"
	"fmt"
	"log"
	"os"
	"sync"
)

type FirestoreDB struct {
	client *firestore.Client
	url    string
}

var dbInstance *FirestoreDB
var once sync.Once

func DBClient() *firestore.Client {
	once.Do(func() {
		fmt.Println("DB 연결 시작 --- FIREBASE ---")
		dbInstance = new(FirestoreDB)
		makeDBClient(dbInstance)
		fmt.Println("DB 연결 완료 --- FIREBASE ---")
	})
	return dbInstance.client
}

// makeDBClient Client 주입
func makeDBClient(rtb *FirestoreDB) {

	fmt.Println("dbstore name : " + os.Getenv("FIREBASE_FIRESTORE_DATABASE_PRODUCT_ID"))
	ctx := context.Background()

	client, err := firestore.NewClient(ctx, os.Getenv("FIREBASE_FIRESTORE_DATABASE_PRODUCT_ID"))
	if err != nil {
		log.Fatal(err)
	}

	rtb.client = client
}

클라이언트를 얻어서,, 사용하면된다 ! Once를 사용해서 싱글톤을 사용하고자했는데 defer처리도 해줘야한다고해서 아직 미완성인 코드지만 이렇게하면 우선 연결은 잘된다!!!

profile
꾸준히 성실하게
post-custom-banner

0개의 댓글