본문 바로가기
컴퓨터

[Android] 기상청 동네예보 API (Rest API 사용하기) Java

by 우유식빵 2021. 4. 5.

1. Manifest 수정 - permission 허용, http 허용

우선 Rest API를 사용하기 위해서는 인터넷 네트워크 사용을 해야하기 때문에 Permission이 필요하다. 

App\manifests\AndroidManifest.xml에서 다음 [그림 1] 과 같이 <manifest> </manifest> 사이에  다음 코드를 넣어준다.

 

[그림 1] permission 해결 위한 manifest 수정

(참고: developer.android.com/training/basics/network-ops/connecting?hl=ko)

코드를 본문에 적고 싶은데 퍼미션 관련 코드는 필터링 되는 모양이다. 본문에 안나온다. 그래서 위 링크를 들어가서 복붙하는 것을 추천한다.

 

또 기상청에서 제공하는 EndPoint를 보면 "http://..."로 되어있는데 이는 안드로이드에서 "https"가 아니라고 에러를 만든다.

[그림2] https 에러

그렇기 때문에 manifest에 가서 <application 안에  다음과 같이 코드를 입력해주어야한다.

android:usesCleartextTraffic="true"

[그림3] https 에러 해결 위한 manifest 수정

 

2. mainThread 사용 방지

 main Thread에서 바로 네트워킹 작업을 시도하면 다음과 같은 에러가 뜬다.

[그림 4] NetwrokOnMainThreadException 에러

이렇게 에러가 뜬다는 사실은 android developer사이트에서도 친절하게 알려준다. 

[그림 5] NetworkOnMainThreadException 설명

NetworkOnMainThreadException 문제는 그냥 네트워킹을 다른 Thread에서 해주면 되는거다.

이에 대한 해결 방법을 찾아보면 다들 이 클래스를 발견할 텐데 사용하지말자. 

[그림 5] deprecated AsyncTask

이 Class는 API30부터 deprecated되었기 때문에 사용하지 않는다. 

그러므로 [그림 5]에서 써있는 것 처럼 java.util.concurrent를 대신 써주자.

 

나는 api를 다룰 클래스 파일로 apiTest.java파일을 하나 새로 만들고 mainActivity.java에서 다음과 같이 호출했다.

AsyncTask를 사용하는 대신 java.util.concurrent의 Executors를 사용하여 새 Thread를 만들어 실행시켰다. 

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import org.json.JSONException;
import java.io.IOException;
import java.util.concurrent.Executors;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final apiTest at = new apiTest();
        Executors.newSingleThreadExecutor().execute(new Runnable() {
            @Override
            public void run() {
                try {
                    at.func();
                } catch (IOException | JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

 

3.  동네예보 API 호출하기

이제 거의 끝났다. 공공데이터포털(www.data.go.kr/index.do) 에서

마이페이지에 들어가서 신청한 OpenAPI>개발계정에서 해당 API의 일반 인증키를 보러가자.

[그림 6] 동네예보 API 서비스 정보

 

이제 이 키를 이용해서 API를 호출한다.

 

코드는 다음과 같다.

apiTest.java

 

 

 

 

 

 

코드 설명.

Line Comments
11 위에서 본 바와 같이 MainActivity에서 해당 클래스의 이 함수를 호출한다.
12~19 기상청 동네예보 api에서 동네예보조회 요청에 필요한 매개변수들이다.

어떤 매개변수가 필요한지, 매개변수의 뜻은 무엇인지 궁금하다면 [그림 6]에 나와있듯이 홈페이지 참고 문서에 있는 첨부파일인 동네예보 조회서비스 오픈 api 활용가이드를 읽으면 된다!! 

꼭 읽어보길 추천한다.
21 endpoint와 원하는 정보(동네예보조회:getVilageFcst), 서비스키와 기타 요청 매개변수들을 다 합친 쿼리 스트링이다.
dataType은 나는 항상 JSON으로 받을 것이기 때문에 다른 변수를 사용하지 않고 그냥 그대로 박아뒀다.
30~32 Http연결을한다. 호출 Method는 "GET"이다. 
연결이 잘 됐는지 궁금하면 다음 코드로 넘어가지말고 
Log나 System.out.print로 conn.getResponseCode()를 찍어보자.
200이 나와야한다. 해당 값의 뜻이 궁금하면 httpCode 검색해 볼 것.
35~47 BufferedReader를 이용해서 리턴값을 받고 StringBuilder를 이용해서 라인마다 한줄씩 추가하여 저장한다.
BufferedReader사용을 마쳤으면 close해주어야한다.
이후 StringBuilder로 한줄 한줄 저장한 값을 새 String에 저장해주고 
http connection도 끊어준다.
49~56 이제부턴 이 리턴 값을 어떻게 요리해주는 지 마음대로 하면된다. 
String으로 된 JSON값을 parse해주자. (아래 [그림 7]을 참고하자)
우리가 원하는 값은 상당히 안쪽에 있기 때문에 item이라는 JSONArray가 나올 때 까지 파고 든다.
이후 Array길이만큼 원하는 값을 String으로 뽑아주면 된다. 해당 값의 의미는 API문서를 참고하자. 밑에 내가 써줄거지만.

[그림 7] 동네 예보 JSON값 미리보기

다음은 fcstValue의미이다. api참조 문서에 자세히 나와있다. 

[그림 8] fcstValue 의미

이제 얻은 값으로 마음 껏 원하는 것을 만들길. 

 

글이 도움 됐다면 하트❤️

댓글