: 파이어베이스 데이터베이스 배움 (사용법, 채팅 앱에서 쓰기 좋은 실시간 데이터 베이스, CRUD)
: 트윗을 위한 폼 만들고, 폼에서 전송한 데이터 파이어베이스 DB에 저장
-> firebase의 Database로 이동 후 데이터베이스 만들기
-> 테스트모드를 누르고 다음을 누르자. 테스트모드가 보안은 약하지만 개발이 편함. (누이터 완성되면 프로덕션 모드에서 시작으로 보안모드 설정 바꾸기)
-> 데이터베이스 사용할 준비 끝
: 파이어베이스에서 컬렉션을 수동적으로 등록
: 파이어베이스 DB는 NoSQL 기반
-> 컬렉션(폴더)과 문서(컬렉션 안에 포함되는 텍스트 문서)라는 체계 가지고 있음
-> 컬렉션 시작 누르고 id는 nweet
-> 이렇게 데이터베이스에 샘플 데이터가 저장 완료
-> 각 항목을 눌러 조회, 수정, 삭제도 가능
-> 파이어베이스: CRUD를 이미 구현해놓고, 웹에서 바로 사용할 수 있도록 서비스화까지
-> 우리는 등록과 삭제를 코드로 하기를 원함
-> 따라서 이렇게 서비스 통해서 등록한 컬렉션은 삭제!
--> 우리가 직접 컬렉션 등록할 수 있도록 코드짤 것임
: 파이어베이스 DB에 코드로 작성
: 지금부터 파이어베이스 데이터베이스 파이어스토어
-> 리액트에서 파이어베이스 데이터베이스 사용하려면 fbase.js 수정
: 파이어스토어에 데이터 저장 (CRUD의 Create 구현)
⭕ 정리: fb의 db를 생성하고, 파이어베이스의 데이터베이스(파이어스토어)에 create하는 방법을 배웠다. firebase의 firestore()모듈에 있는 함수들을 이용하였다. collection 함수를 이용해 컬렉션을 생성하고, .add하여 문서를 생성했다.
: 트윗 목록 보여줌 (CRUD의 Read 구현)
-> 파이어스토어의 컬렉션과 그 안의 문서들 읽어오기
-> get함수로 문서 받아오면 됨 (문서가 여러개인 경우에 forEach)
: 콘솔에 데이터 출력되는거 누이터에 반영하기
-> 파이어스토어에서 받은 데이터는 상태로 관리해야 화면에 보여줄 수 있음
-> 빈 배열로 초기화한 nweets을 만들고, forEach 함수와 setNweets으로 파이어스토어의 데이터 저장
-> nweets에 데이터를 쌓고 싶다면, 위와 같이 전개구문을 이용하여! (꼭 이전 데이터 받아와서 해야함- 함수의 인자로 넘어옴)
-> 예전배열 받아와서 data 받은 후 합치고 다시 nweets 만들어줌.
: CRUD의 U, D를 구현의 명령을 위해 필요한 값인 아이디 저장
-> ID: 파이어스토어에서 데이터 구별 시 사용
-> 배열을 Home 컴포넌트에 출력
-> 배열을 순회하면서 jsx 반환 (nweets 배열을 순회하면서 id를 key로 하여 text 출력
-> 누가 쓴 트윗인지 알 수 없음
-> 트윗 수정, 삭제 기능을 위해 필요
-> app.js에서 authService.onAuthStateChanged 함수를 사용해서 로그인한 사람의 정보 받아옴
-> 이 값을 다른 컴포넌트로 전달
⭕ 정리:
여기까지는 생성 시, 데이터베이스에 저장하고, 그 값을 콘솔-> 브라우저에 출력하고 목록을 보여주는 것을 구현 (콘솔-> 브라우저), 누가 쓴 트윗인지 연결까지
: 위에서는 폼과 파이어스토어 이용해서 트윗 목록 출력
-> 트윗 추가해도 새로고침 하지 않으면 새 트윗 반영x
-> get 함수로 파이어스토어의 데이터 받아와서 (처음에 화면 렌더링 시에만 get 함수 실행)
--> 실시간 데이터베이스 이용한 트윗 목록 출력
-> 채팅 애플리케이션 만들 때 유용 (데이터베이스 변화 실시간 감지)
-> 변화감지: 파이어베이스 라이브러리 함수 실행
-> 새 트윗 바로 보여줌
-> 이 방법 도입 시, 데이터베이스와 통신 할 때 async-await 문 쓰지 않아도 됨
-> get 함수 사용 x
-> onSnapShot 함수
-> 함수 하나 교체로 실시간 데이터베이스 도입
-> get함수처럼 스냅샷을 반환 (스냅샷은 문서 스냅샷들 포함)
-> snapshot.docs: 문서 스냅샷 얻기
-> map: 문서 스냅샷에서 원하는 값만 뽑아 다시 배열화 (효율적-순회하며 만든 배열을 반환)
-----> 여기까지는 트윗 등록(콘솔-> 브라우저), 트윗 쓴 사람 반영, 목록 출력, 실시간으로 브라우저에 반영(snapshot함수),
: 트윗 바로 아래 수정, 삭제 버튼 두려면 Home 컴포넌트 너무 복잡해짐
-> 리액트에서 컴포넌트 덩치 효율적으로 줄이는 것 중요
-> 트윗 출력 부분을 컴포넌트 분리
-> 윗 부분을 Nweet 컴포넌트로
-> 수정, 삭제를 위해서 컴포넌트 분리해주었으니, '수정', '삭제' 버튼 추가
-> 이렇게 버튼 생성 완료
: 트윗을 쓴 사람만 트윗을 삭제하거나 수정하도록 (creatorId-트윗 쓴 사람의 id, 현재 로그인한 사람의 uid 비교)
-> 같으면 수정, 삭제 버튼 보여줌
: 파이어베이스 라이브러리 함수 이용
-> 문서의 id 이용해서 삭제 (Home 컴포넌트에서 Nweet 컴포넌트에 props로 넘긴 nweetObj에 문서 아이디)
: 컬렉션의 집합
-> 우리가 사용하는 컬렉션의 이름 nweets이고, 이 컬렉션에는 데이터 (문서)가 들어있음
-> 즉, 우리는 nweets에 데이터(문서)를 추가하고 삭제하고 있는 것임!
Nweet.js
-> 삭제 버튼을 누르면, onDeleteClick 함수 실행하고 '삭제하시겠습니까?' 문구 뜨게 함
-> window.confirm: <확인>-> true/ <취소>-> false
삭제 버튼 누르면 트윗 삭제하도록! (Nweet.js)
-> ok 버튼이 true이면, 트윗 문서 아이디 콘솔에 출력해주고, 삭제할 스냅(문서)를 data에 저장해서, 콘솔에 출력해줌
-> 즉, 문서를 가져오고 있음
*리터럴 문법: 문자열 사이에 변수가 존재할 때 쉽게 나타내는 방법
-> doc함수: 문서 경로를 문자열로 입력 받아서 문서 반환
-> 이렇게 delete 함수만 넣어주면 삭제!
: 기존 트윗이 남아있으면서도 수정할 수 있는 형태로 입력란 변화/ 확인, 취소 버튼
-> 토글할 때 이 구문 기억하기!!! 상태로 true, false 저장해두고, return 문 안에서 그 값에 따라 삼항연산자로 화면에 보일값 구성
-> 기존 트윗 입력된 상태에서 수정 시작 가능!
-> 기존값을 저장해서 value로 넘기기 때문
-> 이렇게 onChange 함수 추가해준다
-> onChange 함수 형태는 외우자 그냥!!!
-> input란이 변경되면, 그 키보드값이 value로 넘어가고, 그 value는 setNewNweet통해서 newNweet에 반영
: form element와 onSubmit 함수 필요
-> 위와 같이 수정 후, 업데이트 버튼 누르면 onSubmit 함수 실행
-> 함수 실행 시: 트윗 아이디, 입력한 텍스트 파이어스토어로
-> 아이디, 텍스트 잘 출력
⭕ 정리:
이번 5장에서는 누이터의 핵심 기능인 트윗의 CRUD를 구현하였다.
1. 트윗 등록 (create)
: 파이어데이터 베이스 사용하기
get함수-> data() : 스냅샷 속에 숨겨진 데이터 가져옴(forEach)
여러개의 트윗 데이터: nweets에 저장(예전 배열 이용)
배열의 데이터들 map함수로 출력
누가 쓴 트윗인지: auth에서 userObj로 받아옴 (Router로 전달해서 필요한 곳에서 사용)-> 파이어스토어에 저장 시 같이 저장
실시간으로 트윗 내용 보여주기 위해서 get 대신 onSnapshot!!
트윗 아이디 저장 (누가 쓴 트윗인지)
----> 등록(add)/조회(get,onSnapshot)/삭제(delete)/수정(update)
-----> 입력란 변경 시에는 onChange함수 무조건
---> 결괏값 반영에는 onSubmit함수 무조건
!!입력란에 테스트 입력해야하는 경우: onChange props, 함수 작업 필수!!
!! 입력란 결괏값 변경하는 경우: for, onSubmit 함수 (async-await으로!!