create account

[React Native #4] 리액트 네이티브 날씨앱 만들기 #3 by anpigon

View this thread on: hive.blogpeakd.comecency.com
· @anpigon · (edited)
$2.32
[React Native #4] 리액트 네이티브 날씨앱 만들기 #3
![](https://steemitimages.com/0x0/https://files.steempeak.com/file/steempeak/anpigon/yEuqXKgU-weather-28719_640.png)

# 리액트 네이티브로 날씨앱 만들기 세번째 강좌
리액트 네이티브를 사용하여 날씨앱을 만드는 세번째 강좌입니다. 이번에는 날씨 API 데이터를 이용해서 화면을 구현합니다.

<br>

---

**이전글**

* [[React Native #1] 리액트 네이티브 시작하기](https://steemit.com/kr/@anpigon/react-native-1--1542639852750)
* [[React Native #2] 리액트 네이티브 날씨앱 만들기 #1](https://steemit.com/kr/@anpigon/react-native-2--1542732103861)
* [[React Native #3] 리액트 네이티브 날씨앱 만들기 #2](https://steemit.com/kr/@anpigon/react-native-3-2-1542874472110)

---

<br>

# 날씨 화면 만들기

날씨를 보여줄 Weather.js 컴포넌트를 생성한다. Weather 컴포넌트는 단순히 날씨만 보여주는 용도라서 stateless 컴포넌트로 구현하였다. stateless 컴포넌트는 class가 아닌 const로 구현한다.  stateless 컴포넌트에 대한 자세한 내용은 [React Stateless Functional Components  블로그](https://medium.com/@minoo/react-stateless-functional-components-%EC%9A%B0%EB%A6%AC%EA%B0%80-%EA%B0%84%EA%B3%BC%ED%95%98%EA%B3%A0-%EC%9E%88%EB%8A%94-9%EA%B0%80%EC%A7%80-ecef2ef73d79)를 참고한다.

```
import React, { Component } from 'react';
import { StyleSheet, Text, View, Image } from 'react-native';

const Weather = () => {
  return (
    <View>
      <Text>Sunny</Text>
      <Text>23℃</Text>
    </View>      
  );
}

export default Weather;
```
> 날씨를 보여주는 컴포넌트를 기존에 App.js 파일에 구현해도 된다. 하지만 컴포넌트 단위로 파일을 따로 생성하는 것을 권장한다. 

<br><br>

## App.js 수정하기

이제 App.js 파일을 열어 수정한다. App 클래스에 `state`를 추가한다. `state`는 `loading`와 `weahter` 항목을 가지고 있다. `loading`는 GPS와 날씨API를 조회 중인지를 체크한다. 그리고  `weahter`에는 날씨 정보를 담을 것이다.

```js
export default class App extends React.Component {
  
  state = {
    loading: true, // 로딩 여부
    weather: null, // 날씨 정보
  }

  // ... 이하 생략 ...
```
> `state`에 대한 설명은  [리액트 문서 State and Lifecycle](https://reactjs.org/docs/state-and-lifecycle.html)를 참조한다.

 <br><br>

그리고 App 클래스의 `render` 함수를 수정한다.

```
  render() {
    return (
      <View style={styles.container}>
        { 
          this.state.loading ? <Text>Weather</Text> : <Weather data={this.state.weather} />
        }
      </View>
    );
  }
```

> `this.state.loading` 값에 따라 보여지는 **View**가 달라진다. `loading` 값이 **True**면 Weather 텍스트가 보이고, **False**면 현재 날씨 정보가 보일 것이다.

<br><br>

이전 시간에 만들었던 `_getWeather` 함수를 아래와 같이 수정한다.

```js
_getWeather = ({latitude, longitude}) => {
    fetch(`https://api.openweathermap.org/data/2.5/weather?lat=${latitude}&lon=${longitude}&appid=${API_KEY}`)
    .then(response => response.json()) // 응답값을 json으로 변환
    .then(json => {
      console.log(json);
      
      // 추가된 코드
      this.setState({
        weather: json,
        loading: false
      })
    });
  }
```
> `this.setState` 함수를 사용하여 `state` 값을 업데이트한다. `loading`를 **False**로 업데이트하고, 날씨 API에서 가져온 데이터를 weather에 담아준다. 리액트에서 `state` 값을 업데이트하기 위해서는 반드시 `this.setState` 함수를 사용해야 한다.

<br><br>

## Wehther.js 수정하기

 Wehther.js 파일을 아래와 같이 수정한다. 현재 날씨와 기온을 보여준다.

```
const Weather = ({ data }) => {
  return (
    <View>    
      <Text>{data.weather[0].main}</Text>
      <Text>{data.main.temp}℃</Text>
    </View> 
  );
}
```

> **Wehther** 컴포넌트는 `{ data }` 를 전달받아 `Text` 뷰에 출력한다.


<br><br>


이제 앱을 실행하고 확인한다.

![](https://steemitimages.com/400x0/https://ipfs.busy.org/ipfs/QmdZZ552PjYuyJUQuLiq4zr4bfidg3m3PFfg7aTuPN8WvR)


현재 기온이 **286.06℃**로 표시된다. 이건 openweathermap가 기온을 켈빈 단위로 주기 때문이다. 다음 공식을 적용하여 켈빈을 썹씨(°C)로 변환한다.

*켈빈(K)을 썹씨(°C)로 변환 공식*

```
°C = K - 273.15 
```

<br>

현재 기온을 보여주는 부분에 이 공식을 적용하자.

`<Text>{weather.main.temp}℃</Text>` 를 `<Text>{Math.ceil(weather.main.temp - 273.15)}℃</Text>` 로 수정한다.

<br>

그리고 다시 앱을 확인해보자.

![](https://steemitimages.com/400x0/https://ipfs.busy.org/ipfs/Qmb8Jye2yr5MYzwjP1swWpZewtNu9HuhMwQJ79xi4h4eeD)

현재 날씨는 **Rain**, 기온은 **13℃**로 출력되었다.

<br>

다음 시간에는 이 화면을 이쁘게 꾸며보겠습니다.

<br>

___

<br>

하얀 배경에 검정 텍스트만 보여주니 깔끔하고 좋네요. ㅎㅎ

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


---

#####  <sub> **Sponsored ( Powered by [dclick](https://www.dclick.io) )** </sub>
##### [기념 액자 도착](https://api.dclick.io/v1/c?x=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjIjoiYW5waWdvbiIsInMiOiJyZWFjdC1uYXRpdmUtNC0zLTE1NDI5OTA0NzAyMzQiLCJhIjpbInQtODU5Il0sInVybCI6Imh0dHBzOi8vc3RlZW1pdC5jb20va3IvQGFybWRvd24vLS0xNTQyNjI5Mjc3MTIyIiwiaWF0IjoxNTQyOTkwNDcwLCJleHAiOjE4NTgzNTA0NzB9.UM5OZpH1hW-EI2HanaSHOOZuHcibvkXnhSBLNLYIyHM)
<sup>Sponsored ( Powered by dclick )</sup>
</center>
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
properties (23)
authoranpigon
permlinkreact-native-4-3-1542990470234
categorykr
json_metadata{"tags":["kr","kr-dev","busy"],"app":"busy/2.5.6","format":"markdown","community":"busy"}
created2018-11-23 16:27:51
last_update2018-12-29 15:59:36
depth0
children15
last_payout2018-11-30 16:27:51
cashout_time1969-12-31 23:59:59
total_payout_value1.774 HBD
curator_payout_value0.547 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length4,198
author_reputation17,258,940,000,931
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,793,689
net_rshares3,800,780,473,661
author_curate_reward""
vote details (43)
@bukio ·
짱짱맨 호출에 응답하여 보팅하였습니다. 스팀잇을 시작하시는 친구들에게도 널리 알려주세요.
properties (22)
authorbukio
permlinkre-bukio-jjangjjangman-1542998639970
categorykr
json_metadata"{"tags":["bukio", "jjangjjangman"],"app":"steemer/1.0"}"
created2018-11-23 18:44:00
last_update2018-11-23 18:44:00
depth1
children0
last_payout2018-11-30 18:44:00
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length49
author_reputation11,545,563,591,097
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,798,793
net_rshares0
@codingman ·
gps를 이용해서 현재 장소 날씨를 불러오면 좋겠네요.
properties (22)
authorcodingman
permlinkre-anpigon-react-native-4-3-1542990470234-20181124t003324354z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2018-11-24 00:33:27
last_update2018-11-24 00:33:27
depth1
children1
last_payout2018-12-01 00:33:27
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length30
author_reputation23,188,231,710,844
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,810,263
net_rshares0
@anpigon ·
다음에는 한강 수온도 가져와볼려구용.ㅋㅋ
properties (22)
authoranpigon
permlinkre-codingman-re-anpigon-react-native-4-3-1542990470234-20181124t010431849z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2018-11-24 01:04:33
last_update2018-11-24 01:04:33
depth2
children0
last_payout2018-12-01 01:04:33
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length22
author_reputation17,258,940,000,931
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,811,183
net_rshares0
@gomdory ·
![](https://ipfs.busy.org/ipfs/QmSpSf3UTPCZUwCEfi1sWKKcUXWKH3SnpEaYaqRuWu7omz)
@anpigon님 보팅 감사합니다. 곰돌이가 1.1배로 돌려드리고 가요~ 영차~

[[곰돌이 명성도 55기념 이벤트] 너의 보팅을 두배로 돌려줄께~ / 스팀잇에 빛을 비춰줘~ lightsteem alpha](https://steemit.com/gomdory/@blockchainstudio/55-lightsteem-alpha)
properties (22)
authorgomdory
permlinkre-react-native-4-3-1542990470234-20181124t102554
categorykr
json_metadata""
created2018-11-24 10:25:57
last_update2018-11-24 10:25:57
depth1
children0
last_payout2018-12-01 10:25:57
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length261
author_reputation38,104,394,235,725
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,827,505
net_rshares0
@jisoooh0202 ·
깔끔하고 좋은데요 이걸로도???ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
properties (22)
authorjisoooh0202
permlinkre-anpigon-react-native-4-3-1542990470234-20181123t173431739z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2018-11-23 17:34:33
last_update2018-11-23 17:34:33
depth1
children3
last_payout2018-11-30 17:34:33
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length27
author_reputation4,755,820,563,511
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,796,267
net_rshares0
@anpigon ·
날씨앱 출시 한번 해볼까했는데, 앱마켓에 날씨앱이 넘치도록 많네요 ㅋㅋ
properties (22)
authoranpigon
permlinkre-jisoooh0202-re-anpigon-react-native-4-3-1542990470234-20181124t010220423z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2018-11-24 01:02:21
last_update2018-11-24 01:02:21
depth2
children2
last_payout2018-12-01 01:02:21
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length39
author_reputation17,258,940,000,931
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,811,108
net_rshares0
@jisoooh0202 ·
ㅋㅋㅋㅋㅋㅋㅋ 많죠 ㅎㅎㅎㅎ
식당앱 하나 만들어 보려고 플러터 일단 설치 중입니다. ㅋㅋㅋ
자바스크립트나 다트나 둘다 한개도 모르니 뭘 한들 똑같지 않을까 싶어서 ㅋㅋㅋㅋ
properties (22)
authorjisoooh0202
permlinkre-anpigon-re-jisoooh0202-re-anpigon-react-native-4-3-1542990470234-20181124t063029369z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2018-11-24 06:30:30
last_update2018-11-24 06:30:30
depth3
children1
last_payout2018-12-01 06:30:30
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length95
author_reputation4,755,820,563,511
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,821,142
net_rshares0
@jyinvest ·
정말 깔끔하네요 그뤠잇!
properties (22)
authorjyinvest
permlinkre-anpigon-react-native-4-3-1542990470234-20181124t011415572z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2018-11-24 01:14:18
last_update2018-11-24 01:14:18
depth1
children1
last_payout2018-12-01 01:14:18
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length13
author_reputation25,687,578,009,800
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,811,575
net_rshares0
@anpigon ·
감사합니다.ㅎㅎ 그뤠잇!
properties (22)
authoranpigon
permlinkre-jyinvest-re-anpigon-react-native-4-3-1542990470234-20181125t015709013z
categorykr
json_metadata{"community":"busy","app":"busy/2.5.6","format":"markdown","tags":["kr"],"users":[],"links":[],"image":[]}
created2018-11-25 01:57:09
last_update2018-11-25 01:57:09
depth2
children0
last_payout2018-12-02 01:57:09
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length13
author_reputation17,258,940,000,931
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,859,951
net_rshares0
@steem-ua ·
#### 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.634 which ranks you at **#14416** across all Steem accounts.
Your rank has improved 23 places in the last three days (old rank 14439).

In our last Algorithmic Curation Round, consisting of 254 contributions, your post is ranked at **#109**.
##### Evaluation of your UA score:

* Only a few people are following you, try to convince more people with good work.
* You have already convinced some users to vote for your post, keep trying!
* Good user engagement!


**Feel free to join our [@steem-ua Discord server](https://discord.gg/KpBNYGz)**
properties (22)
authorsteem-ua
permlinkre-react-native-4-3-1542990470234-20181124t011934z
categorykr
json_metadata"{"app": "beem/0.20.9"}"
created2018-11-24 01:19:36
last_update2018-11-24 01:19:36
depth1
children0
last_payout2018-12-01 01:19:36
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length706
author_reputation23,214,230,978,060
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,811,769
net_rshares0
@tanky ·
우왕 꾸민 화면도 궁금해요🤩
properties (22)
authortanky
permlinkre-anpigon-react-native-4-3-1542990470234-20181125t220338216z
categorykr
json_metadata{"community":"busy","app":"busy/2.5.6","format":"markdown","tags":["kr"],"users":[],"links":[],"image":[]}
created2018-11-25 22:03:39
last_update2018-11-25 22:03:39
depth1
children1
last_payout2018-12-02 22:03:39
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length15
author_reputation47,369,644,705,590
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,902,127
net_rshares0
@anpigon ·
날씨마다 배경색이 바뀌는 것 말고는 바뀐 것이 없어요.ㅎㅎ
관심 가져주셔서 감사합니다.
properties (22)
authoranpigon
permlinkre-tanky-re-anpigon-react-native-4-3-1542990470234-20181126t140235467z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2018-11-26 14:02:36
last_update2018-11-26 14:02:36
depth2
children0
last_payout2018-12-03 14:02:36
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length48
author_reputation17,258,940,000,931
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,935,991
net_rshares0
@trueimagine ·
좋은 글 잘 봤습니다 ^^
꼭 피곤하지 마세요 ㅎ ~ 
꾸욱~ 
properties (22)
authortrueimagine
permlinkre-anpigon-react-native-4-3-1542990470234-20181124t075546673z
categorykr
json_metadata{"community":"busy","app":"busy/2.5.6","format":"markdown","tags":["kr"],"users":[],"links":[],"image":[]}
created2018-11-24 07:55:48
last_update2018-11-24 07:55:48
depth1
children1
last_payout2018-12-01 07:55:48
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length35
author_reputation92,320,110,641,308
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,823,417
net_rshares0
@anpigon ·
감사합니다. 전 피곤하지 않습니다. 그래서 안피곤입니다.ㅋ
properties (22)
authoranpigon
permlinkre-trueimagine-re-anpigon-react-native-4-3-1542990470234-20181125t015731674z
categorykr
json_metadata{"community":"busy","app":"busy/2.5.6","format":"markdown","tags":["kr"],"users":[],"links":[],"image":[]}
created2018-11-25 01:57:36
last_update2018-11-25 01:57:36
depth2
children0
last_payout2018-12-02 01:57:36
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length32
author_reputation17,258,940,000,931
root_title"[React Native #4] 리액트 네이티브 날씨앱 만들기 #3"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id75,859,963
net_rshares0