안드로이드 어플리케이션 - java로 공공 데이터 API 불러오기

박경현·2024년 1월 9일
1

방학 학교 과제를 하면서 공공데이터 API를 불러오는 어플리케이션을 만들게 되었습니다

이번 블로그에서는 어떻게 공공데이터를 불러오는가에 대한 코드를 작성합니다
데이터를 가공해서 보여주는 부분은 다음 블로그에 작성할 예정입니다

공공데이터 API 신청하기

https://www.data.go.kr/index.do
이 사이트에 가서 본인이 찾고자하는 데이터 종류나 이름을 검색합니다


그 후에 이런 페이지가 나오는데 이때 오픈API로 지정해두고
오론쪽 아래 활용신청을 누르면 됩니다

신청을 하고 나면 왠만하면 바로 승인이 되는데 그러면 아래 있는 OpenApi명세 가이드대로 연습을 해보면 됩니다

공공데이터를 사용하기 위한 사전 작업 -> AndroidManifest.xml

공공데이터를 불러오기 위해서는 몇가지 사전 작업이 필요합니다

외부 데이터를 사용하기에 인터넷 연결을 허용해줘야합니다
추가로 네트워크로 접근하는것도 허용해줘야합니다
문자열을 URL로 볼 수 있게 설정해줘야합니다

AndroidManifest.xml

<mainfest xmlns:...

>
<uses-permission androi:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
	...
    android:usesCleartextTraffic="true"
    

위에 3개의 코드를 적어주면 됩니다


Thread를 사용해서 불러오자

스레드란 프로그램내에서 실행되는 실행 단위를 말함
주로 메인스레드 한개만 있습니다

하지만 스레드가 2개라면? 더 많은 일을 병렬로 처리하기 가능해진다!

스레드 만들기 - 연습

public class MainActivity extends AppCompatActivity {
	@Override
    protected void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Thread th = new Thread(new Runnable() {
        	@Override
            public void run() {
            	int num = 1;
                while (true) {
                	Log.i("Thread"," " + num);
                    num++;
                    
                    try {
                    	Thread.sleep(1000);
                    } catch(InterruptedException e) {
                    	e.printStackTrace();
                    }
                }
            }
        });
        th.start();
    }
}

그렇다면 Main Thread와 내가 만든 SubThread가 충돌한다면?

만약 어떤 제재도 없이 두 스레드가 서로 처리 중에 간섭을 하게 된다면 원치 않는 결과가 되거나 충돌이 되어 예기치 못하게 종료됩니다

그렇기에 모든 Workr Thread의 모든 UI 작업은 핸들러를 통해서 메인스레드에 보내진다!

API 불러오기 실습 및 결과

MainActivity.java

public class MainActivity extends AppCompatActivity {
	String key = "인코딩키";
    TextView view;
    String string_data;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = findViewById(R.id.text1);
        
        new Thread(new Runnable() {
        	@Override
            public void run() {
            	try {
                	string_data = data();
                    runOnUiThread(new Runnable() {
                    	@Override
                        public void run() {
                        	text.setText(string_data);
                        }
                    })
                } catch (IOException e) {
                	e.printStackTrace();
                }
            }
        }).start();
   }
   
   private String data() throws IOException {
        // 각각의 정보를 넣어주기
        StringBuilder urlBuilder = new StringBuilder("http://api.odcloud.kr/api/15055082/v1/uddi:0a5f4af0-3d39-4510-b26a-e53c24ea3b1e_201909051519");

        // page
        urlBuilder.append("?" + "page=1&perPage=10");
        // service key
        urlBuilder.append("&" + URLEncoder.encode("serviceKey", "UTF-8") + "="+ key);

        URL url = new URL(urlBuilder.toString());

        // 문자열로 된 요청 url을 URL객체로 생성
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-type", "application/json");

        BufferedReader rd;
        // getResponseCode 가 200과 300사이면 정상
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300 ) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
        StringBuilder sb = new StringBuilder();
        String line;
        while((line = rd.readLine()) != null) {
            sb.append(line);
        }
        rd.close();
        conn.disconnect();
        System.out.println(sb.toString());
        return sb.toString();
    }
}

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글