이번 팀 프로젝트를 시행하면서 나는 댓글 부분을 맡았는데 제일 어려웠던 부분인 각각의 피드에 댓글을 달 수 있는 기능을 구현하는 것이었다.
이번 프로젝트에는 파이어베이스를 사용했는데 파이어베이스만의 데이터 코드가 따로 있는 부분이 있어서 혹시 그런 코드가 따로 있나 찾아보았다.
처음엔 "댓글 기능은 단순히 useParams로 id를 받아와서 그 아이디마다 컬렉션이나 필드를 나눠주면 되겠다고 단순히 생각만 하고있었는데, 이게 생각보다 오래걸릴지 몰랐다.
단순히 내가 생각만했던 부분을 코드로 실현하고자 했던 부분이라 사용자가 늘어나고 데이터가 커지면 좀 비효율적일수도 있겠다는 생각이 들었다.
feed의 id를 가져오려고하니 파이어베이스에서는 Realtime Database와 firestore를 고민하다가 NoSQL 데이터베이스로 실시간 업데이트를 지원하는 데이터 베이스였다.
변경사항이 발생할 때 실시간으로 업데이트된다고해서 우리는 수정도 같이 구현해야하기에 firestore를 사용했다.
또한 컬렉션안에 하위로 필드를 생성해줄 수 있었지만 아직 페이지가 만들어지기 전이여서 가장 쉬운방법인 하나하나의 페이지 마다의 id값들을 가져오는것이 더 빠르겠다는 생각이 들었다.
댓글 id를 가져오기 위해 Router에 먼저 써놓고
<Route path="/comment/:id" element={<Comment />} />
이렇게 postId를 설정해서 map을 돌리니 feed하나하나의 아이디값을 받아올 때 이 코드를 썼어야했다.
<CommentStyle to={`/comment/${e.postId}`}>
addDoc 함수는 newComment를 전달해 Firestore에 새로운 댓글을 추가하는 함수인데 이 작업이 완료되면 docRef 에 새로 추가된 문서에 대한 참조가 포함된다.
const docRef = await addDoc(collection(db, "comments"), id);
처음엔 useParam을 적고나서 밑에 이렇게 적었었는데 안되서 어떻게할까 찾아보니 템플릿 리터럴을 사용해 동적으로 collection 이름을 생성해준다고 했다.
comments로 만들어서 db에 넣었었는데 이 postId를 어떻게 적을까 하다가
try {
const docRef = await addDoc(collection(db, `comments-${postId}`), newComment);
setEditCommentId(docRef.id);
console.log("이 comment의 아이디는 : ", docRef.id);
이렇게 comments-${postId} 로 하니까 url에 찍히는 postId값에 따라서 다르게 들어왔다.
setEditCommentId(docRef.id)는 댓글이 새로 추가될 때 Id가 설정되는 것이다.
이렇게해서 새로 추가된 댓글의 데이터를 Firestore에 추가할 수 있고, 추가된 댓글에도 id가 부여됐다.
firestore를 확인해보니
이렇게 comments뒤에 postId값들이 잘 들어온것을 볼 수 있었다.
이렇게하니 확실히 수정할때와 삭제할때 진짜 편리했고, 아직 만들어지지 않은 코드에서 가장 빠르게(?) 가져올 수 있었다.
하지만 게시물 하나가 생길때마다 하나씩 데이터가 늘어나서 DB를 많이 차지할 수 있겠다는 생각이 어렴풋이 들었다.
지금은 프로젝트이지만 나중에 사용자들이 많아지는 경우에는 이 경우보다는 필드안에 하위로 추가하는것이 더 좋겠다는 생각이 들었다.
'TIL > 기록' 카테고리의 다른 글
[TIL] Axios 설치/기본 (0) | 2024.02.19 |
---|---|
[TIL] (0) | 2024.02.16 |
[TIL] redux 문제 (1) | 2024.02.08 |
[TIL] Tab 활성화 (0) | 2024.02.05 |
[TIL] Context API (0) | 2024.02.03 |