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

in #kr6 years ago (edited)

리액트 네이티브로 날씨앱 만들기 두번째 강좌

리액트 네이티브를 사용하여 날씨앱을 만드는 두번째 강좌입니다. 이번에는 GPS위치정보로 날씨API를 조회합니다.



이전글



날씨 조회 API 서비스 가입하기

날씨 정보를 조회하기 위해서 openweathermap API 서비스를 이용한다. 사이트에 가입하고 API키를 발급 받는다.

https://openweathermap.org

API 페이지에서 Current weather data 항목의 subscribe 버튼을 클릭한다.


Free 항목의 Get API key and Start 버튼을 클릭한다.


Sign up을 눌러 회원가입을 한다. 가입을 완료하면 아래 페이지로 이동된다.


API Keys 탭으로 이동한다. Name을 입력하고 Generate 버튼을 클릭하여 Key를 발급받는다.

그리고 App.js 파일을 열어 발급받은 키를 API_KEY 변수에 선언한다.

const API_KEY = '894c0c1d03546d1843b5efd334d6e479';

사이트에 가입하지 않고 예제에 있는 키를 그대로 사용해도 된다.



현재 날씨 조회하기

openweathermap API 문서를 읽어보자.
https://openweathermap.org/current

GPS 좌표로 현재 날씨를 가져오는 API 규격은 다음과 같다.

현재 날씨를 조회하는 URL 형태는 다음과 같다.
https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={API_KEY}


현재 날씨를 조회하는 _getWeather 함수를 구현하자. App.js 파일에 아래 코드를 추가한다.

export default class App extends React.Component {

  // ... 생략 ...

  // 추가된 코드
  _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)
    });
  }

fetch는 네트워크 통신을 위한 인터페이스다. XMLHttpRequest보다 강력한 기능을 가지고 있다.


이제 App 클래스의 componentDidMount 함수를 수정한다. navigator.geolocation.getCurrentPosition 함수에서 GPS 정보를 가져오면 _getWeather 함수를 호출하도록 한다.

export default class App extends React.Component {
  componentDidMount() {
    navigator.geolocation.getCurrentPosition(
      (position) => {
        console.log(position);
        this._getWeather(position.coords); // 추가된 코드
      }, 
      (error) => {
        console.log(error);
      }
    );
  }

navigator.geolocation.getCurrentPosition 콜백함수를 화살표 함수(()=>{})로 수정하였다. function 함수와 화살표 함수의 this의 참조 대상이 다르기 때문이다. 자세한 내용은 다음에...


이제 앱을 실행하고 콘솔창을 확인하자.

$ npm start

콘솔창을 확인하면 GPS 정보를 가져오고 바로 날씨 데이터를 가져온것을 확인 할 수 있다.

아래는 날씨 API에서 가져온 전체 날씨 데이터이다. 우리는 여기서 tempweather 데이터만 사용할 것이다.

Object {
  "base": "stations",
  "clouds": Object {
    "all": 40,
  },
  "cod": 200,
  "coord": Object {
    "lat": 37.49,
    "lon": 126.91,
  },
  "dt": 1542868200,
  "id": 1948005,
  "main": Object {
    "humidity": 35,
    "pressure": 1025,
    "temp": 279.92,
    "temp_max": 280.85,
    "temp_min": 279.15,
  },
  "name": "Kwangmyong",
  "sys": Object {
    "country": "KR",
    "id": 7668,
    "message": 0.0083,
    "sunrise": 1542838741,
    "sunset": 1542874653,
    "type": 1,
  },
  "visibility": 10000,
  "weather": Array [
    Object {
      "description": "haze",
      "icon": "50d",
      "id": 721,
      "main": "Haze",
    },
  ],
  "wind": Object {
    "deg": 310,
    "speed": 4.1,
  },
}


다음 강좌에서 현재 날씨를 보여주는 화면을 구현할 것입니다.




날씨앱은 많이 구현해본 앱 인데 만들때 마다 새롭습니다. 예전에는 SKP에서 제공하는 날씨 API를 자주 사용했는데, 이제는 SKT에서 유료로 서비스하고 있습니다. kweather는 날씨 API 서비스를 중단했네요.ㅠ 기상청은 예전에 공공데이터포털(data.go.kr)에서 API를 제공했었는데, 이젠 검색이 안됩니다.

유주완님의 서울버스앱을 시발점으로 정부3.0 - 공공 데이터 개방의 시대가 열린 적이 있었습니다. 그런데 공공데이터 시절에 공개되었던 데이터들이 지금은 대부분 비공개로 전환되었네요.ㅋ

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


Sponsored ( Powered by dclick )
■ Tasteem × Promisteem / 이삿날엔 중국집 대신 이자카야 〈男 OTOKO〉

이삿날엔 중국집 대신 이자카야 男 O T O K O 예로부터 이삿 날엔 일손 나눈 크루들(?)...

Sort:  

좋은 정보네요 ^^
디클로 응원합니다 꾸욱~

Posted using Partiko iOS

트루이메진님 감사합니다.ㅎㅎ

지금 회사서 놀곺있는데 이것 도전!!해봐야겠네요

심심할떄는 코딩 놀이 같이 해요~ㅋㅋ

공공데이터가...더이상 공공데이터가 아닌게 되어버리고 있죠 ㅠㅠ 에휴....

그렇죠. 그저 말뿐인 공공데이터입니다.
이젠 블록체인 시대를 맞이하여 공공 코인의 시대를 열어볼까요?ㅋㅋ

항상 멋있어보여 부럽습니다. ㅋㅋㅋ

항상 감사합니다. 저는 지수오님이 더 멋있어보입니다.

와우 잘 봤습니다~
응원합니다!

감사합니다.ㅎㅎ

와 확실히 모바일 라이브러리라서 그런가 gps연동도 매우 쉽게 되네요. 신기하네요. 수온은 없습니까?ㅎㅎ 예전에 한강물온도 체크기 보고 엄청 웃겼던 기억이. 그때 좀 찾아봐도 데이터를 어디서 가져오는지 모르겠던데. 웹파싱해서 가져오는건지.

모바일에서 gps 조회는 무척 간단하죠.

그리고 혹시나 찾아봤는데 한강 수온 조회 API가 있네요. description 이 너무 웃깁니다. ㅋㅋ

수월한 자살을 위해 한강 수온을 확인한다
https://github.com/skdltmxn/kakaobot/blob/master/hangang.py
현재 한강 수온은 10.5°C입니다.

짱짱맨 호출에 응답하여 보팅하였습니다. 스팀잇을 시작하시는 친구들에게도 널리 알려주세요.

감사합니다.

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.635 which ranks you at #14401 across all Steem accounts.
Your rank has improved 227 places in the last three days (old rank 14628).

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

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

예전에 누가 아두이노로 날씨 API를 연동해서 구름을 표현했었는데 저도 날씨 API를 연동해서 아두이노로 뭔가 해볼려다가 가입하고 API받고 하는게 귀찮아서 안했는데 이 부분은 따라해보고 싶긴 하는데 읽는 걸로 만족합니다.

아두이노로 날씨를 가져와서 보여주면 재미있겠어요. 저도 코딩은 글을 읽는 것만으로도 재미있습니다. 사실은 시간만 있으면 다 따라해보고 싶어요.ㅋ