앱개발

3주차 - 앱다운 앱기능

RAN318 2021. 10. 21. 23:41
728x90
반응형

2021.10.19 - [앱개발] - 3주차-앱 필수 기초 지식

 

3주차-앱 필수 기초 지식

지난 시간까지 자바스크립트 기초체력을 다지고 JSX로 화면을 그리는 방법 까지 배워봤습니다. 오늘 배울 내용이 두 가지는 앞으로도 계속~ 반복 숙달합니다 🙂 **참고로 지난 시간 숙제로 Ab

ran-318.tistory.com

이어서 쓰겠습니다 (❁´◡`❁)

  • [Expo 앱다운 앱기능] 앱 상태 바(Status Bar) 관리
    • Expo에서 제공해주는 앱다운 앱 기능들
      1. Expo SDK. 일명 Expo에서 제공해주는 앱 기능 도구들을 개발할 때 아래 링크에서 확인 할 수 있습니다.
        필요한 기능들이 있는지 목록을 쭉 보고, 원하는 기능을 선택해서 적용하면 끝!

        https://docs.expo.dev/versions/v38.0.0/
    • 상태 바란?
      앱이 앱에 따라 모바일 맨 위 상태 바가 변하는 앱이 있습니다. 상태바란 이런 겁니다.

      배터리가 충분한지, 몇시인지 매일 보시죠? 이부분도 우리가 처리를 해야합니다^^

    • StatusBar
      1. 본격적으로 라이브러리 설치 시작!
        이제 본격적으로 라이브러리들을 설치합니다. vscode에서 터미널을 이렇게 변경해주세요
         
        터미널 우측 버튼중에 분할이란 버튼이 있습니다.

        여러분들 터미널 왼편은 서버를 켜고 끄고를 담당하고(expo start)
        터미널 우측은 필요한 라이브러리들을 설치할 때 명령어를 치는 장소로 분할해서 사용하면 편리합니다!

      2. [코드스니펫] Expo 상태 바 설치
        expo install expo-status-bar
        https://docs.expo.io/versions/latest/sdk/status-bar/
      3. [실습 ✍️] 적용
        컴포넌트마다 다르게 적용할 수도 있고, 앱 전체에 공통적으로 적용할 수 있습니다.
        StatusBar를 컴포넌트 각각 다르게 둘 수 있습니다 우린 MainPage.js에 달아볼거에요!
        expo statusbar 도구 설치

        StatusBar를 ScrollView 사이에 넣어놓고 style을 black으로 주어서 색을 표시하게끔 해놨다!


        style이 light일 때와, black일 때가 다릅니다.
        우린 앱 화면 배경색을 검은색으로 설정했기 떄문에, 상태바를 black으로 하면 보이지 않습니다.


        상태 바 속성은 공식문서에 다양하게 존재하니, 살펴보면서 앱에 적합한 상태 바를 적용해보세요!
        https://docs.expo.dev/versions/latest/sdk/status-bar/
  • [앱 페이지 적용] 네비게이터란?
    • 네비게이션이란?
      앱에 페이지 개념을 입혀주고! 웹 사이트를 이용하듯, 앱에서 여러분들이 만든 컴포넌트들을 페이지화 시켜주고,
      해당 페이지끼리 이동을 가능하게 해주는 라이브러리입니다
      물론 이것 또한 쉽게 페이징을 도와주는 외부 라이브러리를 가져다가 사용합니다.
      react-navigation 공식문서 보러가기 —> [(링크)](https://reactnavigation.org/)
      결국 이 라이브러리도 Expo에서 지원하고 있는 도구로써, 앱을 만들기 위해 사용 중인 Expo와 궁합이 아주 잘 맞습니다.
      이번 강의에선 앱 내의 페이지 구성 및 이동까지 직접 적용해볼 텐데요, 이 라이브러리는 다양한 기능들을 가지고 있습니다. 가령 아래에 있는 화면과 같이, 앱 하단에 탭 버튼을 두고 해당 버튼을 누르면~ 연결되어 있는 페이지로 바로바로 이동할 수 있게 해주는 기능(열 앱에서 많이 보셨죠?)도 가지고 있습니다.

      따라서 이번시간에 같이 공부한 다음 틈틈히 다른 기능들도 적용해보세요!

    • 현재 갖추고 있는 페이지 구성 확인!
      페이지 구성은 보통 pages 폴더 안에 생성해둔 컴포넌트로 구성합니다.
      우리는 이미, 1. MainPage.js 메인 페이지  2. DetailPage.js 상세 화면 페이지  3. AboutPage.js 소개화면 페이지 까지
      3 페이지를 가지고 있습니다.
    • 기본 설치 코드
      리액트 네이티브에서 페이지 네비게이션을 구현하기란 조금 까다롭습니다.
      그래서 딱 우리에게 필요한 것만 가져와 설치 하고, 적용해 나갈 계획입니다.

      우리에게 필요한 것이라고 했지만, 거의 대부분의 앱에 적용이 되어 있는 것들만 가져왔습니다.

      아래 명령어들은 네비게이션을 사용하기 위해 필요한 기본 라이브러리들이구요!
      우리가 곧 배울 스택 네비게이션와 탭 네비게이션 기능은 추가적으로 라이브러리를 또 설치 해줘야 합니다 😂

      아래 명령어를 차례차례 터미널에 넣어 실행해주세요
      가장 마지막줄은 꽤 깁니다. 이렇게 여러 라이브러리들을 띄어쓰기로 연결해서 한번에 설치 할 수도 있습니다

      프로젝트 별로 관리가 되기 때문에 새로운 프로젝트를 만드시면 거기에 추가적으로 설치를 해주셔야 합니다!
      **네비게이션 설치 코드
      yarn add @react-navigation/native​
      **네비게이션 추가 설치 코드
      expo install react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context @react-native-community/masked-view​
  • [앱 페이지 적용] 설치 - 스택네비게이션 01
    • 스택 네비게이션이란?
      스택 네비게이션은 컴포넌트에 페이지 기능을 부여해주고 컴포넌트에서 컴포넌트로 이동,
      즉 페이지 이동을 가능하게 해줍니다
      컴포넌트를 페이지화 시키는 스택 네비게이션은 다음과 같습니다.
      우리가 페이지처럼 만든 컴포넌트를, 정말 페이지처럼 사용할 수 있게끔 페이지로 컴포넌트를 감싸 페이지로 만들어줍니다.

      이렇게 만든 여러 페이지들을 책갈피 기능을 하는 스택 네비게이터에 모조리 등록시켜서, 
      언제든지 이 페이지 이동이 가능하게끔 해줍니다

      페이지는 Stack.Screen 이라 부르며
      책갈피는 Stack.Navigator라 부릅니다

    • createStackNavigator 사용해보기
      **스택 네비게이터 설치 코드
      yarn add @react-navigation/stack

      [실습 ✍️] 적용하기
      navigation 폴더 하나를 만들고 StackNavigator.js 파일을 만들고 StackNavigator 안에 코드를 넣어주세요

      🥴스택 네비게이터 코드 분석
      https://reactnavigation.org/docs/stack-navigator/
      적용 순서 1) 사용 준비
      import React from 'react';
      //설치한 스택 네비게이션 라이브러리를 가져옵니다
      import { createStackNavigator } from '@react-navigation/stack';
      
      //페이지로 만든 컴포넌트들을 불러옵니다
      import DetailPage from '../pages/DetailPage';
      import MainPage from '../pages/MainPage';
      
      //스택 네비게이션 라이브러리가 제공해주는 여러 기능이 담겨있는 객체를 사용합니다
      //그래서 이렇게 항상 상단에 선언하고 시작하는게 규칙입니다!
      const Stack = createStackNavigator();
      적용 순서 2) 기본 틀
      //리액트의 모~든 파일은 컴포넌트라 생각하고
      //페이지 기능을 해주는 모든 기능이 담겨 있는 컴포넌트를 만든다 생각하세요!
      const StackNavigator = () =>{
          return (
      				/// 페이지 기능이 들어갈 곳
          )
      }
      
      export default StackNavigator;​

      적용 순서 3) 스크린 옵션
      //컴포넌트들을 페이지처럼 여기게끔 해주는 기능을 하는 네비게이터 태그를 선언합니다.
              //위에서 선언한 const Stack = createStackNavigator(); Stack 변수에 들어있는 태그를 꺼내 사용합니다.
              //Stack.Navigator 태그 내부엔 페이지(화면)를 스타일링 할 수 있는 다양한 옵션들이 담겨 있습니다.
              <Stack.Navigator
                  screenOptions={{
                      headerStyle: {
                          backgroundColor: "black",
                          borderBottomColor: "black",
                          shadowColor: "black",
                          height:100
                      },
                      headerTintColor: "#FFFFFF",
                      headerBackTitleVisible: false
                  }}
                  
              >
      
                  {/* 컴포넌트를 페이지로 만들어주는 엘리먼트에 끼워 넣습니다. 이 자체로 이제 페이지 기능을 합니다*/}
                  <Stack.Screen name="MainPage" component={MainPage}/>
                  <Stack.Screen name="DetailPage" component={DetailPage}/>
              </Stack.Navigator>​


      적용 순서 4) 페이지 연결
      컴포넌트를 페이지화 했고, 페이지를 이동할 수 있는 네이게이션도 준비가 됐다면, 
      우리는 최상단 컴포넌트 즉 App.js에 네비게이션 기능을 달아야 합니다. 


      즉, 앱 가장 최상위 코드에 네비게이션을 다는겁니다
      그래야 앱 어디서든 원하는 페이지 이동이 가능할테니까요!
    • 스택 네비게이터 적용 후 MainPage 모습
  • [앱 페이지 적용] 페이지 헤더 스타일 수정 - 스택네비게이션 02
    • 페이지 헤더 수정
      그런데 현재 MainPage 화면은 다음과 같이 상단의 모습이 약간 이상해 보입니다.
      그 이유는 StackNavigator에서 현재 헤더에 대한 스타일과 페이지에 헤더의 제목까지 결정해주고 있기 때문입니다.

      ✔스택 네비게이터의 헤더 스타일 부분 코드
         따라서 헤더 스타일을 적절히 바꾸기 위해 다음과 같이 옵션 부분의 코드를 수정해보도록 하겠습니다. 
      import React from 'react';
      //설치한 스택 네비게이션 라이브러리를 가져옵니다
      import { createStackNavigator } from '@react-navigation/stack';
      
      //페이지로 만든 컴포넌트들을 불러옵니다
      import DetailPage from '../pages/DetailPage';
      import MainPage from '../pages/MainPage';
      
      //스택 네비게이션 라이브러리가 제공해주는 여러 기능이 담겨있는 객체를 사용합니다
      //그래서 이렇게 항상 상단에 선언하고 시작하는게 규칙입니다!
      const Stack = createStackNavigator();
      
      
      const StackNavigator = () =>{
          return (
      
              //컴포넌트들을 페이지처럼 여기게끔 해주는 기능을 하는 네비게이터 태그를 선언합니다.
              //위에서 선언한 const Stack = createStackNavigator(); Stack 변수에 들어있는 태그를 꺼내 사용합니다.
              //Stack.Navigator 태그 내부엔 페이지(화면)를 스타일링 할 수 있는 다양한 옵션들이 담겨 있습니다.
              <Stack.Navigator
                  screenOptions={{
                      headerStyle: {
                          backgroundColor: "black",
                          borderBottomColor: "black",
                          shadowColor: "black",
                          height:100
                      },
                      headerTintColor: "#FFFFFF",
                      headerBackTitleVisible: false
                  }}
                  
              >
      
                  {/* 컴포넌트를 페이지로 만들어주는 엘리먼트에 끼워 넣습니다. 이 자체로 이제 페이지 기능을 합니다*/}
                  <Stack.Screen name="MainPage" component={MainPage}/>
                  <Stack.Screen name="DetailPage" component={DetailPage}/>
              </Stack.Navigator>
          )
      }
      
      export default StackNavigator


      ✔StackNavigator 옵션 코드 수정 후 모습
       
      그래도 위에 페이지 제목으로 MainPage가 되는 모습은 뭔가 또 수정이 필요해보입니다.
      이를 위해선 다음 스택 네비게이션 페이지 이동 강의에서 살펴보도록 하겠습니다
  • [앱 페이지 적용] 페이지 이동하기 - 스택 네비게이션 03
    • 페이지 이동하기
      Main 페이지(MainPage.js)에서 카드 버튼을 누르면(Card.js) 꿀팁 상세 페이지(DetailPage.js)로 이동합니다

      일단 페이지를 이동시키려면, 책갈피가 페이지들에게 부여해준 페이지 이동 기능을 사용해야 합니다.

      Stack.screen에 등록된 모든 페이지 컴포넌트들은 navigation 와 route 라는 딕셔너리(객체)를 속성으로 넘겨받아 사용할 수 있습니다. 이 두 딕셔너리는 다음과 같은 기능을 갖습니다.

      일단 먼저 구조를 보여드렸습니다. 물론 사용을 해봐야 감이 오겠죠?

      그럼 이제 Card.js에 페이지 이동 기능을 달아보겠습니다.
      코드를 실행 한 다음 페이지를 이동해 보면 익숙한 뒤로 가기 버튼도 보일거에요!

      👏[실습
      ] 데이터 없이 페이지 이동하기
      navigation.navigate("DetailPage")
      데이터 연동은 안되어있음

      👏[실습
      ] 데이터 가지고 페이지 이동하기
      버튼 카드에서 사용한 함수에 아래와 같이 두 번째 인자로 딕셔너리를 넘겨주면,
      우리는 이동 한 페이지에서 넘겨준 데이터를 받을 수 있습니다.
      navigation.navigate("Detail",{
        title: title
      })
      그럼 Card에서 DetailPage로 이동할 때, MainPage로 부터 넘겨받은 content도 넘겨볼까요? 
      로딩화면 구현하기 싫으면 기초 아무값이나 넣어두면 됨!! comst [tip(상태변수) : setTip(상태를 바꾸는 함수)]


      왜냐하면 지금은 어떠한 카드를 눌러도 상세 페이지에서 동일한 데이터를 보게 되잖아요? tip 데이터를 고정해놨으니까요!✔- 이동한 디테일 페이지 모습
         

      건네 받은 값을 꺼낼 땐, 다음과 같이 책갈피가 navigation과 추가적으로 건네준 route에서 꺼내 확인 할 수 있습니다.
      route.params 객체에 건네준 딕셔너리가 넘겨 있습니다! 

      ✅route에 담겨져 오는 데이터 콘솔에서 직접 확인
      DetailPage에서 상태값을 초기에 설정한 이유
      DetailPage 초반에 우린 이렇게 상태값을 설정해놨었습니다. 그 이유가 뭘까요?
      심지어 이 상태값을 초기에 설정안하면 오류가 발생합니다. tip엔 아무것도 없다며...
      //초기 컴포넌트의 상태값을 설정
          const [tip, setTip] = useState({
              "idx":9,
              "category":"재테크",
              "title":"렌탈 서비스 금액 비교해보기",
              "image": "https://firebasestorage.googleapis.com/v0/b/sparta-image.appspot.com/o/lecture%2Frental.png?alt=media&token=97a55844-f077-4aeb-8402-e0a27221570b",
              "desc":"요즘은 정수기, 공기 청정기, 자동차나 장난감 등 다양한 대여서비스가 활발합니다. 사는 것보다 경제적이라고 생각해 렌탈 서비스를 이용하는 분들이 늘어나고 있는데요. 다만, 이런 렌탈 서비스 이용이 하나둘 늘어나다 보면 그 금액은 겉잡을 수 없이 불어나게 됩니다. 특히, 렌탈 서비스는 빌려주는 물건의 관리비용까지 포함된 것이기에 생각만큼 저렴하지 않습니다. 직접 관리하며 사용할 수 있는 물건이 있는지 살펴보고, 렌탈 서비스 항목에서 제외해보세요. 렌탈 비용과 구매 비용, 관리 비용을 여러모로 비교해보고 고민해보는 것이 좋습니다. ",
              "date":"2020.09.09"
          })

      그 이유는 컴포넌트가 화면에 그려지는 순서에 있습니다.
      이건 지금 단계에선 조금 과한감이 있어서 간략히만 설명해보면 다음과 같습니다. 

      1. DetailPage 컴포넌트가 useState에 들어 있는 
         데이터 가지고 화면에 그려짐(return 함수실행)
      2. 화면에 다 그려진후, useEffect 함수 실행
      3. useEffect에서 상태값 변경 이벤트가 실행되면 변경된 데이터 가지고 다시 return 실행
      4. 변경된 데이터를 가지고 화면에 DetailPage가 다시 그려짐.


      곰곰히 생각해보면 결국, 리액트 네이티브에서 화면이 변경되는 시점은 컴포넌트의 상태값이 변경될 때니까요! 


      이 개념은 어려울 수 있습니다 충분히! 따라서 처음에는, 
      어떠한 데이터를 보여주는 컴포넌트라면, 무조건 초기값을 의미없는 값이더라도 넣고 시작한다! 라고 생각하시면 편합니다!


      또는! 우리가 한번 배웠떤 Loading.js를 이용하여 데이터가 준비가 되면 로딩 화면을 치우고, 본 화면을 보여준다던가! 

      여러분들 마음껏 화면 처리를 해주시면 됩니다!


  • [Expo 앱다운 앱기능02] 페이지 내용 공유하기
    • Share
      디테일 페이지까지 이동해서 도달했다면 여러분은 앱 개발자! 

      그런데 결과를 친구한테 공유하고 싶은 마음이 들수도 있겠네요
      결과를 공유해주고, 앱다운로드 주소까지 전달해준다면
      여러분이 만든 앱 홍보하기가 수월하겠죠?

    • Share 적용해보기
      1. 준비!
        설치 할 라이브러리 없이, react-native에서 기본적으로 제공해주는 공유 기능을 사용합니다.
        import { Share } from "react-native";
        그리고 우린 다음과 같은 공유 버튼을 디테일 페이지 하단에 생성하고 기능을 만들꺼에요! 

        ✔버튼 추가 디테일 페이지 모습

      2. [실습 ✍️] 적용
        share 함수를 만들고 거기에 react-native가 기본적으로 제공해주는 Share 함수를 사용하여 간단히 공유를 할 수 있다

      3. 공유 모습

  • [Expo 앱다운 앱기능02] 외부 링크 클릭 이벤트!
    • Linking
      디테일 페이지에 있는 내용들이 사실 어디에서 가져온거라면?
      출처를 남겨야 할겁니다.
      그리고 그 출처로 바로가기 버튼정도도 있으면 여러분들이 만드는 다양한 플랫폼들을 서로 연결 시킬 수 있겠죠? 

      이번엔 앱에서 외부 링크를 여는 방법에 대해 배워봅니다.
      버튼을 누르면, 버튼에 연결 시킨 기능을 통해 외부 링크를 핸드폰에 있는 기본 브라우저로 열어봅니다.

    • Linking 적용해보기
      1. 준비!
        DetailPage에 버튼을 다음과 같이 추가해주세요
        expo 에서 제공해주는 도구를 설치 한다음, 해당 도구를 상단에 가져와 준비해야 합니다
        expo install expo-linking

        import * as Linking from 'expo-linking';
      2. [실습 ✍️] 적용


 

지난 주 내내 expo설치 오류로 ㅡ,ㅡ...... 고생했는데,

윈도우는 꼭 expo 실행 시 설치가 아닌 ctrl+C하고 설치 할 것!

설치 오류가 나면 삭제 후 재설치해도 무방! 'ㅅ'//

 

 

 

728x90
반응형