[React Native] TO-DO 앱 만들기 #5

in #kr5 years ago (edited)

리액트 네이티브(React Native)로 할 일 관리앱(To-Do App)을 만들기 마지막 강좌입니다. 이번에는 로컬 스토리지에 데이터를 저장하고 불러오는 기능을 구현하고, 앱 배포하는 방법을 알아봅니다.

이전 강좌에서 계속 이어지는 내용입니다.



* * *

Storage에 데이터 저장하고 불러오기



저장소(Storage)를 사용하기 위해는 AsyncStorage를 import 해야한다. App.js 파일에서 import {} 'react-native' 를 아래와 같이 수정한다.

import { StyleSheet, View, Text, AsyncStorage } from 'react-native';


App 컴포넌트componentDidMount() 함수를 입력한다.

  componentDidMount = () => {
    AsyncStorage.getItem("todos").then(data => {
      const todos = JSON.parse(data || '[]');
      this.setState({ todos });
    });
  };

AsyncStorage.getItem() 함수를 사용하여 저장소에서 todos 데이터를 불러온다. 참고로 저장소(storage)에는 String만 저장 가능하다.


그리고 App 컴포넌트에서 다음 함수들을 수정한다.

addTodo = (todo) => {
  const newTodo = {
    id: Date.now(),
    text: todo,
    completed: false,
  } 
  this.setState(prevState => {
    const todos = [
      newTodo,
      ...prevState.todos
    ];
    AsyncStorage.setItem("todos", JSON.stringify(todos));
    return { todos }
  });
}
checkTodo = (id) => {
  this.setState(prevState => {
    const [ todo ] = prevState.todos.filter(e => e.id === id);
    todo.completed = !todo.completed;
    const todos = [
      ...prevState.todos
    ];
    AsyncStorage.setItem("todos", JSON.stringify(todos));
    return ({ todos })
  });
}
removeTodo = (id) => {
  this.setState(prevState => {
    const index = prevState.todos.findIndex(e => e.id === id);
    prevState.todos.splice(index, 1);
    const todos = [
      ...prevState.todos
    ];
    AsyncStorage.setItem("todos", JSON.stringify(todos));
    return ({ todos })
  });
}

데이터가 변경될 때마다 AsyncStorage.setItem()를 호출하여 Storage에 데이터를 저장한다.



앱 빌드&배포하기


마지막으로 앱을 빌드하고 배포하는 방법을 알아보자.


app.json 수정하기

app.json를 수정하여 배포 환경을 설정한다. ios와 android의 package를 입력한다.

{
  "expo": {
  
    // ... 생략 ...
    
    "ios": {
      "supportsTablet": true,
      "bundleIdentifier": "com.yourcompany.yourappname"
    },
    "android": {
      "package": "com.yourcompany.yourappname"
    },
  }
}

패키지명은 고유해야한다. 기존에 존재하는 패키지명을 입력하면 앱 배포가 불가능하다. 패키지명으로 도메인을 많이 사용한다.


exp 설치하기

앱을 빌드하고 배포하기 위해서 exp를 설치한다.

$ npm install -g exp


앱 빌드하기

안드로이드면 exp build:android , 아이폰이면 exo build:ios 를 입력한다. 그럼 각각 .ipa 파일과 .apk 파일이 생성된다.

우선 안드로이드앱을 빌드 해보자. exp build:android를 입력한다.

Expo 계정이 없으면 Make a new Expo account를 선택하여 계정을 생성하자.


나도 계정이 없어서 아래와 같이 Expo 신규 계정을 생성하였다.


다음은 인증서(keystore) 관련 내용이다. expo에서 알아서 하도록 하고 싶으면 1번을 선택한다. 하지만 기존 인증서로 앱을 서명하고 싶으면 2번을 선택한다.

이제 우리가 구현한 코드가 expo 서버에 업로드되고 빌드되는 과정이다. 시간이 매우 오래 걸린다.

조금 기다리면 아래와 같이 특정 URL을 알려준다.

알려준 URL(https://expo.io/builds/e95fc55b-9c4b-4938-9274-fe712ccc0de1) 을 접속하면 아래와 같은 페이지가 나타난다.

Android buildQueued 에 등록되어 있는 것을 볼 수 있다. 아직은 빌드 대기 상태이다.


이 페이지에서 조금 더 기다리면, 빌드되는 과정이 로그로 출력된다.

빌드가 완료되면 아래 화면과 같이 Download 버튼이 활성화 된다. 이제 Download 버튼을 클릭하면 .apk 파일을 다운로드 받을 수 있다.


안드로이드폰은 그냥 .apk 파일을 스마트폰에 복사하여 설치하면 된다. 하지만 아이폰은 Testflight를 이용하여 스마트폰에 설치해야한다.


이제부터는 앱을 업데이트 하는 경우, 코드를 수정하고 그냥 Publish만 하면 된다. 그러면 수정 내용이 앱에 바로 반영된다. 마켓에 앱을 다시 배포하는 과정이 필요없기 때문에 매우 편하다.


apk 파일은 드롭박스에서 다운받을 수 있습니다.
https://www.dropbox.com/s/y0ldnmkg7waj1je/todo-app-157f74bedd054b02bc59b03916513326-signed.apk?dl=0

그리고 모든 소스는 깃허브에 공개되어 있습니다.
https://github.com/anpigon/react-native-todo-app


* * *

저도 expo를 통한 앱 빌드는 처음 해보았습니다. 매우 간단하네요. 저는 리액트 네이티브를 공부한지 약 3주 정도 되었습니다. 관심있는 분들과 같이 공부 할 수 있으면 좋겠습니다. 다음 강좌에서는 redux, mobx, conetxt API 사용 방법을 공부하고 포스팅 하도록 하겠습니다.


여기까지 읽어주셔서 감사합니다.


Sponsored ( Powered by dclick )

dclick-imagead

Sort:  

짱짱맨 호출에 응답하여 보팅하였습니다.

관심은 있는데....ㅜㅜ
개발에 대한 기본 지식이 조금 있으면 같이 해보면 좋을텐데 기본 지식 조차 전혀 없어서...ㅜㅜ
기본적인 용어만이라도 좀 알면 좋으련만...

스위프트를 공부하고 나면 앱개발에 대한 기본적인 지식이 생길꺼에요. 그리고 개발 용어는 코딩하면서 같이 공부하는 거에요.

넘나 멋집니다!

댓글 감사합니다~

Hi @anpigon!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 2.687 which ranks you at #13797 across all Steem accounts.
Your rank has improved 43 places in the last three days (old rank 13840).

In our last Algorithmic Curation Round, consisting of 253 contributions, your post is ranked at #137.

Evaluation of your UA score:
  • Only a few people are following you, try to convince more people with good work.
  • The readers like your work!
  • Good user engagement!

Feel free to join our @steem-ua Discord server


@anpigon님 곰돌이가 최대 두배로 보팅해드리고 가요~! 영차~

imrahelk님이 anpigon님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
imrahelk님의 주사위 굴리고 스팀받아가세요!

...del> room9님
2등 10스팀 dorian-lee님
3등 5스팀 anpigon
4등 4스팀
5등 3스팀
6등 2스팀
7등 1스팀
  • 선착순이기 때문에 댓글 시간으로 보겠습니...

    크....열심히 개발하시능 안피곤님!! ㅎㅎ

    감사합니다. 다음은 어떤 이벤트를 기획하고 계신가요? 기대됩니다. ㅎㅎㅎ

    요즘 매직다이스 굴리느라 바빠서 암것두 안하구 있어요 ㅋㅋㅋㅋ

    앱을 만들기 쉽지 않죠?
    만들어 보고 싶은 앱이 있는데.. 뭐 부타 해야 할지 ....
    모르겠어요
    132B9271-F6C5-4C8B-988B-77A45B4652B5.jpeg

    저도 만들어보고 싶은 앱이 있어서 공부하고 있어요.ㅎㅎ 나음사스님은 아마도 웹툰 관련 앱이겠죠? ㅎㅎ

    아뇨^^ 웹툰 아니고 다른 형태 입니다.
    조언이 받을수 있나요? 아님 동업^^
    좋은 아이템이란 생각이 들어서요.

    본업이 있어서 동업은 힘들구요 ㅎㅎ
    조언은 해드릴 수 있습니다.ㅋ

    Coin Marketplace

    STEEM 0.28
    TRX 0.11
    JST 0.031
    BTC 69394.55
    ETH 3894.24
    USDT 1.00
    SBD 3.73