firebase로 투두리스트 만들기, No관계형 데이터베이스 를 사용하는법 (작성중)

Jaewoong2·2020년 10월 9일
0

참고사항

목록 보기
1/4

작성중 입니다!

export const getTodoListWithDays = async(uid ?:string | null, day?: string) => {
    try {
        if(uid && day) {
            const useDatabaseRef = firebaseDatabase.ref(uid);
            const list : {
                title ?: string;
                description ?: string;
                userInfo ?: userType
                rank ?: number;
            }[] = [];
            await useDatabaseRef.child(day).once('value', (snapshot) => {
                const val = snapshot.val();
                for(let key in val) {
                    list.push({...val[key], day : key })
                }
            },(err) => {
                const error = new Error();
                error.message = '에러 발생'
                if(err) throw error
            })
            return {
                status : true,
                message : '리스트 받아오기 성공',
                lists : list
            }
        }
        const error = new Error();
        error.message = 'uid 또는 잘못된 날짜 입니다.'
        throw error
    } catch(err) {
        return {
            status : false,
            message : err.message
        }
    }
}

export const getTodoList = async (uid ?: string | null, day ?: string) => {
    try {
        if(uid) {
            const userDatabaseRef = firebaseDatabase.ref(uid);
            const list : {
                day ?: any;
                title ?: string;
                description ?: string;
                userInfo ?: userType
                rank ?: number;
            }[] = [];
            await userDatabaseRef.once('value', (snapshot) => {
                const val = snapshot.val();
                for (let day in val) {
                    for(let keys in val[day]) {
                        const valDay = val[day];
                        list.push({...valDay[keys], day : day, key : keys})
                    }
                }
            },(err) => {
                const error = new Error();
                error.message = '에러 발생'
                if(err) throw error
            })
            return {
                status : true,
                message : '리스트 받아오기 성공',
                lists : list
            }
        }
        const error = new Error();
        error.message = 'uid가 업습니다.'
        throw error
    } catch(err) {
        return {
            status : false,
            message : err.message
        }
    }
}

export const createTodoList = async (todo : todoListType) => {
    try {
        const user = auth?.currentUser;
        if(user) {
            const userDatabaseRef = firebaseDatabase.ref(`${todo?.user?.uid}`);
            await userDatabaseRef.child(`${todo.day}`).push({
                title : todo.title,
                description : todo.description,
                userInfo : {
                    photoURL : user?.photoURL,
                    email : user?.email,
                    nickname : user?.displayName,
                    uid : user?.uid
                }
            }, (error) => {
                const err = new Error(error?.message);
                err.message = error?.message || '오류발생';
                if(error) throw err
            });
            return {
                status : true,
                message : '게시 완료!'
            }
        }
        const err = new Error();
        err.message = '유저 정보 불러오기 실패.';
        throw err
    } catch (err) {
        return {
            status : false,
            message : err.message
        }
    }
}

파이어 베이스

  • 데이터 베이스에 들어가는 데이터 하나마다 고유한 key 값이 있다.
  • 유저도 고유한 uid를 갖고 있다.
  • 관계형 데이터베이스에 비해 관계에 따라서 정보를 받아오기도 힘들다.
  • 나는 UserUid / 글쓴 날짜 / (데이터)
    이런식으로 데이터베이스를 넣어주었다. 클라이언트로만 이루어진 (클라이언트로만 개발할 때)
    파이어베이스의 유저정보는 접근하기가 무척 힘들다. (현재 본인이 접속한 유저정보 말고)
    따라서 유저 uid를 데이터베이스에 넣어주기 편하고, 또한 고유한 uid에 맞춰서 데이터를 가져
    올 수 있기 때문에, uid로 먼저 시작하였다.
  • 글쓴 날짜를 넣은 이유는 그냥.. 현재 만들고 있는 것의 글 올리기 정책 인 것이고
  • 데이터베이스의 json 형식으로 createdAt을 따로 넣어주면 될 법하다.
title : todo.title,
description : todo.description,
userInfo : {
    photoURL : user?.photoURL,
    email : user?.email,
    nickname : user?.displayName,
    uid : user?.uid
  }

이제 직접 넣어줄 데이터에로 넣어주는데, 날짜 child 밑 으로 고유 key 값이 생긴다.
그 key 값을 직접 넣어주지 않아도 파이어베이스에서 데이터베이스에 넣어줄 때 자동 생성 되기 때문에 편하다.

for (let day in val) {
    for(let keys in val[day]) {
        const valDay = val[day];
        list.push({...valDay[keys], day : day, key : keys})
    }
}

파이어베이스에서 정보를 받아 올 때, once 함수로 value들을 받아오고 (object 형식),
for - in 반복문을 돌면서 return 에 넣어줄 수 있도록 object에서 값을 찾아서 배열에 넣어준다.

우리가 한 순서는 유저uid -> 날짜 -> 데이터 이다. 그리고 이 각각 이 위의 val object의 key 값이다. 다시 말하자면,
1. val유저uid의 object 즉, key 값은 유저uid value 값은 날짜 를 뜻한다..
2. val 에 있는 key 값은 날짜 를 뜻하고. value 값은 데이터 를 뜻한다.
3. val[day] 의 key 값은 '데이터' 를 뜻하고 value 값은 데이터의 object들을 뜻한다.

profile
DFF (Development For Fun)

0개의 댓글