앱개발

4주차 - 파이어베이스

RAN318 2021. 10. 29. 01:13
728x90
반응형

2021.10.28 - [앱개발] - 4주차 - 앱과 서버

 

4주차 - 앱과 서버

2021.10.21 - [앱개발] - 3주차 - 앱다운 앱기능 3주차 - 앱다운 앱기능 2021.10.19 - [앱개발] - 3주차-앱 필수 기초 지식 3주차-앱 필수 기초 지식 지난 시간까지 자바스크립트 기초체력을 다지고 JSX로 화

ran-318.tistory.com

  • [파이어베이스] 파이어베이스(firebase) 소개
    • 우리의 선택 파이어베이스(firebase)
      👍파이어베이스는 구글에서 만든 서버리스 서비스입니다.

      서버에 대한 지식이 그렇게 깊지 않아도
      서버적인 기능들을 사용할 수 있게끔 도와주는 서비스입니다.
      한 서비스를 만드는데 충분한 많은 서버적 기능들을 제공해줍니다.

      우리가 필요한 데이터베이스, 이미지 파일 서버는 물론
      여러분들이 지금은 몰라도 되는 푸시 알람 기능, 로그인 인증 기능 등등 아주 다양한 기능들이 준비되어 있습니다

      우린 여기서 데이터베이스, 이미지 파일 서버를 사용할 예정입니다

    • [실습 ✍️] 파이어베이스 프로젝트 생성하기

      파이어베이스를 이용하는 절차는, 게임 케릭터를 생성하는 것과 유사합니다.
      육성 게임을 한다 했을 때, 보통 이런 절차로 게임을 하게되죠?

      1) 게임에 가입한다.
      2) 케릭터를 생성한다
      3) 캐릭터에 필요한 장구류를 착용한다.

      파이어베이스에 대입해보면

      1) 게임에 가입한다. → 파이어베이스에 가입한다
      https://firebase.google.com/?hl=ko
      구글 서비스이므로 구글 계정을 준비한다음, 다음 사이트에 접속하여 시작하기를 누르면 파로 프로젝트를 만들 수 있습니다.


      2) 케릭터를 생성한다 → 파이베이스 프로젝트 생성


      3) 캐릭터에 필요한 장구류를 착용한다. → 사용 할 파이어베이스 서비스 활성화

      여기서 1,2번을 진행하고 3번은 차근차근 개발과 함께 해보겠습니다!
  • [파이어베이스] 파이어베이스를 앱에 연결하기
    • firebase 라이브러리 설치 및 연결
      👏프로젝트 생성이 참 쉽죠?
      프로젝트가 생성되었으면, 
      파이어베이스에 iOS를 개발하고 있는지 안드로이드를 개발하고 있는지 웹을 개발하고 있는지 알려줘야 
      개발 중인 앱에 파이어베이스를 코드단에서 연결할 수 있는 연결 정보를 줍니다.

      일단 우린 안드로이드, iOS 앱 전용 개발을 Expo에서 따로 하고 있지 않고 자바스크립트로만 개발을 하고 있기 때문에 웹 SDK를 이용하면 쉽게 파이어베이스 사용이 가능합니다.

      [실습 ✍️] 파이어베이스 프로젝트 내에서 앱 생성하기
      **호스팅 설정은 체크 하지말고 진행!
      이렇게 파이어베이스 프로젝트 내에서 앱을 생성하면, 최종적으로 연결 정보를 줍니다.

      [실습 ✍️] 설치
      1) 파이어베이스 연결 정보 확인
        >> 앱이 완성되면, 콘솔로 이동한다음 설정 버튼을 눌러주세요
       >> 드래그해서 밑을 보면, 우리가 사용할 접속 정보가 코드로 존재합니다
      2) 앱에 파이어베이스 도구 설치 및 연결
       >> 파이어베이스를 이용할 수 있게 도와주는 expo 도구를 설치합니다설치가 완료됐으면,
      firebaseConfig.js
      파일을 하나 생성해주세요. 그리고 다음 코드를 입력해주세요!

      접속 정보엔 여러분들 접속 정보 코드를 넣어야 합니다!
    • expo install firebase​
      • 설치하다 오류가 났다..!!!
        [해결방법👀]
        최근 Node.js의 LTS 버전이 v12에서 v14로 업데이트가 되었습니다. 그래서 v14 버전을 많이 설치하셨는데요, 윈도우 PC에서 Node.js v14 버전과 firebase 라이브러리의 호환성이 맞지 않는 이슈가 확인이 되었습니다. v12에서는 정상적으로 설치가 되는 것을 확인했습니다. v12로 버전을 다운그레이드 하는 방법을 가이드 드리겠습니다.
        1. 제어판의 프로그램 추가/제거로 이동하셔서 현재 설치되어 있는 Node.js 버전을 제거합니다.
        2. https://nodejs.org/download/release/v12.19.1/node-v12.19.1-x64.msi 링크에서 Node.js v12 버전을 다운로드 받아 설치합니다.
        3. 탐색기로 프로젝트 폴더로 이동해, yarn.lock 파일과 node_modules 폴더를 삭제합니다
        4. 터미널로 프로젝트 폴더로 이동 후 yarn을 입력합니다. VS Code로 여셔도 상관 없습니다.
        5. 설치가 완료되었다면, 이제 다시 한 번 expo install firebase를 입력합니다.

      • [🤯firebaseConfig.js 코드 설정시 유의사항!!!]
        최근 파이어베이스에서 프로젝트를 만들면 원래는 설정 코드에 넣어줬던 databaseUrl을 안넣어주고 있습니다. 따라서 다음과 같이 리얼타임 데이터베이스 탭으로 들어가신다음, 데이터베이스 주소를 설정코드에 넣어주세요!

        const firebaseConfig 
        = { apiKey: "@@" 
        authDomain: "@@", 
        databaseURL: "@@", 
        projectId: "@@", 
        storageBucket: "@@", 
        messagingSenderId: "@@", 
        appId: "@@", 
        measurementId: "@@" 
        };​
        [🤯파이어베이스 버전업에 따른 코드 유의사항!!!]
        Firebase 패키지의 버전이 올라가면서 API 사용법이 변경되어서 config파일에 오류가 날 수도 있습니다. 
        이 오류는 파이어베이스 패키지 버전을 낮춰서 해결할 수도 있구요, 아래와 같이 소스 코드를 일부 변경해서 해결할 수도 있어요!

        firebaseConfig.js 의
        import * as firebase from 'firebase/app';
        이거를
        import firebase from 'firebase/app';
        이렇게 바꿔주시면 문제가 해결됩니다!

  • [파이어베이스] 파일 스토리지(storage)
    • 파일 저장소 스토리지(storage)
      가장먼저 사용하게 되는 파이어베이스 서비스는 파일 스토리지입니다. 간단히 파일 저장소라고 여기면 충분합니다.
      멀리 있는 파일 저장소에 이미지 및 사용 할 파일을 올려두고, 필요할 때마다 꺼내 쓰는 용도로 사용하면 됩니다.

    • [실습 ✍️] 이미지 스토리지에 올려보기
      1. 스토리지 시작하기
        스토리지 시작하기 > 설정에서 그냥 다음 클릭 > 서버 위치 asia선택 후 완료!
      2. 폴더만들고 파일 업로드하기

    • [실습 ✍️]이미지 확인하기
      이렇게 파일을 올리기만 해도, 이미지가 저장된 주소를 제공해줍니다!
  • [파이어베이스] 리얼타임 데이터베이스 - 설정
    • 리얼타임 데이터베이스 소개
      우리가 배운 리스트, 딕셔너리 구조, 즉 JSON  형태로 저장/관리되는 데이터베이스 서비스 입니다.

      이 서비스를 사용 할 땐, 파이어베이스에서 제공해주는 함수들을 이용하기만 하면 데이터 저장/수정/삭제가 가능합니다.

      이름이 리얼타임 데이터베이스인 이유는, 플랫폼과 실시간 데이터 주고 받는 것에 특화되어 있어서 그런데요!
       우린 그런 기능까진 필요없으니 이름이 가진 의미정도만 알고 가자구요!

      그럼 언제 파일 저장소 스토리지를 쓰고, 언제 리얼타임 데이터베이스를 사용하나요?

      **이미지 저장 → 파일 저장소 스토리지
      JSON 데이터 → 리얼 타임 데이터베이스**

    • [실습 ✍️] 리얼타임 데이터베이스 생성
      다음 순서로 데이터베이스를 생성하고, 권한을 모두 공개로 바꿔주세요

      ** 만약에 Realtime Database 탭이 왼쪽에서 보이지 않는다면, Cloud Firestore를 선택한다음 진행하세요
    • [실습 ✍️] 데이터 업로드
      찾아오기해서 플젝 폴더의 data.json파일 가져오면 아래처럼 된다

      가져오기 완료


  • [파이어베이스] 리얼타임 데이터베이스 - 전체 데이터 읽기
    • 앱에서 리얼타임 데이터베이스 사용 하기

      👀지금까진 우린,

      1) 앱에 firebaseConfig.js를 설정하여 파이어베이스에 접속 할 수 있게 되었습니다.
      2) 리얼타임 데이터베이스를 생성했습니다.
      3) 데이터베이스에 꿀팁을 업로드 했습니다.

      그럼 이제 앱에서 사용할 일만 남았습니다!
      1. 현재 MainPage.js 코드 리뷰
         
      2. 파이어베이스를 이용해 전체 데이터를 조회 하는 방법은
        전체 데이터를 가져오게끔 해주는 파이어베이스 제공 함수 사용 방법
        가져올 데이터가 어떠한 이름으로 리얼타임 데이터베이스에 저장되어 있는지를 알아야 합니다.
        👌나만의 꿀팁 저장 위치


        ✅전체 데이터 가져오기 함수
        데이터의 저장 위치를 알았다면, 
        파이어베이스의 리얼타임 데이터베이스 전용 함수에 데이터 저장 위치를 알려주면서 데이터를 가져올 수 있습니다.
         👀파이어베이스 API 함수는 그럼 어딨는가?
        firebase_db.ref('/tip').once('value').then((snapshot) => {
           let tip = snapshot.val();
        })
        🤦‍♀️ref('/tip') 이 부분에서 /tip 영역에 가지고 오고 싶은 데이터의 주소를 넣어주면 됩니다. 이 주소 앞부분에는 https://sparta.firebaseio.com/ 과 같은 기본 주소가 생략되어 있습니다.

        firebaseConfig.js에서 이미 파이어베이스 계정을 세팅했기 때문에, 
        기본 주소와 정보들은 앱 내에서 사용하는 파이어베이스 함수들이 알고 있는 상태입니다

        👏firebase_db.ref('/tip').once('value').then((snapshot) => {})

        이 코드는 서버리스를 이용하여 데이터베이스를 조회하기 위해,
        파이어베이스 측에서 정해놓은 API 사용방법입니다. 따라서 우린 공식 문서 그대로 사용 방법을 적용해야 합니다.

        조회한 데이터는 snapshot 부분에 담겨서 {} 내부에서 사용할 수 있는데, 그 중 실제 우리에게 필요한 데이터는 snapshot.val()로 가져와 변수에 담아 사용할 수 있습니다.


        🙌그럼 사용방법을 알았으니 MainPage.js에 적용해보겠습니다

        우리가 사용했던 data.json과 구조가 완전히 동일한 데이터를 리얼타임 데이터베이스에 업로드했고, 그대로 가져와 사용하고 있으므로

        기존에 관리하던 상태에 파이어베이스 데이터를 넣으면 앱이 정상적으로 동작합니다.
        한 가지 달라진 점이 있다면, useEffect에서 setTimeout 함수를 더이상 사용하지 않는 다는 것입니다.

        사용자들 마다 네트워크 상태가 모두 다를 것이기 때문에, 무조건 몇초 뒤에 실행 시키는 setTimeout 함수 기능보다, 파이어베이스 API의 실행 완료 시간에 맡겨두는 편히 더 나아보입니다. 이러한 이유로 setTimeout 함수를 사용하지 더이상 사용하지 않습니다.

        따라서 파이어베이스로부터 즉, 서버로부터 데이터를 가져와 준비할 때까지 로딩 화면을 보여줬다가, 데이터가 준비가되면 실제 본 화면을 보여주는 자연스러운 서비스 환경을 사용자들에게 제공해줄 수 있습니다

        🤢🤢🤢undefined is not an object (evaluating 'firebaseConfing.firebase_db_rdf')오류가 나서 나머지는 차후에 쓸게요 > firebaseConfig.js파일 삭제 후 다시 만들어서 해결했는데,, 
      3. 지금은 undefined is not an object (evaluating '_app.default.apps) <이 오류가 났어요...슬랙즉문즉답에 올려도 답이 없네요 현재..
  • [파이어베이스] 리얼타임 데이터베이스 - 특정 데이터 읽기
    • 특정 데이터 조회하기
      현재 나의 꿀팁앱은, 이렇습니다.
      메인 화면에서 꿀팁을(Card) 누르면 상세 화면으로 이동하죠!

      이 부분을, 이제 전체 데이터를 상세 페이지로 넘겨주는 것이 아닌, 팁 `idx` 번호만 넘겨준다음 `DetailPage.js` 에서 `idx`로 상세 꿀팁 정보를 서버로부터 조회해서 뿌려주려 합니다.


      [실습 ✍️] 적용
      1. card.js 에서 detailpage.js 전달 데이터로 idx넘겨주기
      card.js

      detailpage.js에서 넘겨받은 idx팁상세데이터조회
    • //MainPage로 부터 navigation 속성을 전달받아 Card 컴포넌트 안에서 사용 export default function Card({content,navigation}){ return( //카드 자체가 버튼역할로써 누르게되면 상세페이지로 넘어가게끔 TouchableOpacity를 사용 <TouchableOpacity style={styles.card} onPress={()=>{navigation.navigate('DetailPage',content)}}> <Image style={styles.cardImage} source={{uri:content.image}}/> <View style={styles.cardText}> <Text style={styles.cardTitle} numberOfLines={1}>{content.title}</Text> <Text style={styles.cardDesc} numberOfLines={3}>{content.desc}</Text> <Text style={styles.cardDate}>{content.date}</Text> </View> </TouchableOpacity> ) }​
  • [파이어베이스] 리얼타임 데이터베이스 - 쓰기
    • 나만의 꿀팁 앱에서 데이터를 저장해야하는 상황
      나만의 꿀팁 앱에서 파이어베이스로 데이터를 보내 저장하는 상황이 언제일까요?
      바로 꿀팁 찜! 하기 버튼을 눌렀을 때입니다.

      '특정' 사용자가 여러분이 만든 앱을 이용하다 꿀팁 찜! 버튼을 눌렀다면
      파이어베이스에 어떤 식으로 저장을 해야 할가요?

      이를 유념해서 한번 파이어베이스에 '어떤 구조'로 데이터를 보내 저장(쓰기) 해야 할지 생각해봅시다.

    • 필요한 데이터 구조

      1. 어떠한 꿀 팁을
      2. 누가
        https://docs.expo.dev/versions/latest/sdk/constants/

      3. 누가 new 버전
        https://docs.expo.dev/versions/latest/sdk/application/#api


      4. 실제 디비엔 이렇게 저장이 되어야 할 것 같습니다.
        정리해볼때, '누가', 어떠한 '꿀팁'을 찜 했는 지를 생각하며 최종적으로 데이터 구조를 구성한다면 다음과 같을 것 같습니다. 
    • [실습 ✍️] 파이어베이스 저장 구현하기
      1. 저장하는 시점
        언제 사용자가 누른 꿀팁 내역을 저장해야 할까요?

        디테일 페이지의 꿀팁 찜하기 버튼을 눌렀을 때 저장해야합니다.
        그럼 지금 버튼을 눌렀을 때의 onPress 부분이 어떻게 되어 있나요?
        단순히 팝업이 뜨게끔 간단한 함수가 연결되어 있는데, 이부분에 파이어베이스 기능을 추가하면 될것 같습니다!

      2. 저장해야하는 데이터
        그럼 우린 어떤 찜 데이터를 데이터베이스에 저장해야할까요?
        여러 방안이 있겠지만, 지금은 간단히 DetailPage에서 idx로 조회한 해당 찜의 전체 데이터를 저장해보기로 합니다!

        해당 찜 데이터는 어디에 위치하고 있죠 지금?

        맞습니다! 

        const [tip, setTip] = useState()

        tip 상태에 저장되어 관리 되고 있습니다!
        이 tip을 저장하면 되겠네요!

      3. onPress에 외부 함수 연결하기

        찜 데이터 방 > 사용자 방 > 어떤 찜인지 방 아이디

        그리고 여기에 팁을 저장!

        순으로 차근차근 방에 들어가는 구조입니다.
        그래야 관리가 편하겠죠? 그리고 이렇게 관리하라고 파이어베이스 리얼타임 데이터베이스가 규칙을 정해놨습니다!

        ✅코드리뷰


      4. 저장이 제대로 됐는 지 확인해보기

 

728x90
반응형