클론 프로젝트를 진행하게 되면서 백단은 golang
을 이용한 gin
으로 restful을 활용하기로 정했는데, 역시 여러명이 하는거다보니 db를 무엇으로할지 고민이 되었다
- rdbms는 익숙하니까
nosql
로 해볼까- 여러명이 쉽게 공유할수있는 db없나
결론 : google에서 지원하는 firebase
의 firestore
사용해보자!
firebase에는 여러 서비스가 있는데, 그중 firestore는 nosql기반으로 비교적 쉽게 데이터를 관리할 수 있다.
무엇보다 golang
지원이 잘된다! 같은 회사라 그런걸까..
처음엔 realtimeDB연결하다가 firestore 함수쓰려니까 안돼서 이게뭐냐 했었지만.. 결론은 잘 연결했다.
잊지않기위해 기록을 해본다~!
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파일에 넣어 관리하는 식으로 권장되고 있다.
여기까지 따라했다면 인증을 무리없이 뚫을 수 있다.
환경변수 관리를 위해 패키지를 다운받았다.
.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
처리도 해줘야한다고해서 아직 미완성인 코드지만 이렇게하면 우선 연결은 잘된다!!!