본문 바로가기

Java/실습

[Java] 기상청 (HTTP 실습)

웹사이트는 보통사람들이 DB를 쓰기 편하게 구현해 놓은 페이지입니다.

개발자가 데이터만 가져오고 싶을 때 데이터를 특정한 형식으로 표현해줘야 하는데

DB에 있는 데이터를 표현하는 형식은 XML과 JSON 형식이 있습니다.

XML이란 DB에 있는 데이터를 HTML 형태로 표현한 것입니다.

XML은 태그로 이루어져 있는데 태그는 시작태그와 종료태그가 있습니다.

 

시작 태그 : <XXX>

종료 태그 : </XXX>

 

태그의 종류에 대해서 알아보겠습니다.

 

START_DOCUMENT : 문서의 시작

END_DOCUMENT : 문서의 끝

START_TAG : 시작 태그 - <XXX>

END_TAG : 종료 태그 - </XXX>

TEXT : 텍스트 (시작 태그와 종료 태그 사이의 내용)

 

XML에 대한 기초 개념을 알아보았습니다.

 

이번 시간에는

기상청에 있는 날씨 데이터를 끌어와서

화면에 보이도록 해보겠습니다.

홈 - 기상청 날씨누리

 

기상청 날씨누리

기상청 날씨누리

www.weather.go.kr

 

 

 

기상청에 들어가면 RSS라는 메뉴가 있습니다.

 

 

알고 싶은 지역을 선택하고 

3시간별 RSS를 클릭하면

kma.go.kr/wid/queryDFSRSS.jsp?zone=4122066000

이렇게 XML 코드로 작성된 페이지가 나오게 됩니다.

 

필요없는 데이터를 걷어내고, 원하는 형태로 가공하는 작업을 Parsing이라고 합니다.

위 데이터를 Parsing 해야하는데요.

Parsing하기 위해서

Maven Repository: net.sf.kxml » kxml2 » 2.3.0

위 라이브러리를 사용하도록 하겠습니다.

Parsing을 효율적으로 할 수 있는 라이브러리입니다.

 

Build Path

 

Parsing jar를 다운 받고

Build Path를 통해 필요한 Jar파일을 추가해 줍니다.

 

puftHttpClient는 Http통신을 하기 위해 만들어 놓은 라이브러리입니다.

 

package com.puft.dec181.main;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

import org.apache.http.client.cache.InputLimit;

public class puftHttpClient {

//서버에 요청해서 다운받기

public static InputStream download(String address) throws IOException{

URL u = new URL(address);

if (address.startsWith("https")){

HttpsURLConnection huc = (HttpsURLConnection) u.openConnection();

return huc.getInputStream();

} else {

HttpURLConnection huc = (HttpURLConnection) u.openConnection();

return huc.getInputStream();

}}

// 다운받은걸 String으로 바꾸기

public static String convert(InputStream is , String charset) throws IOException {

InputStreamReader isr = new InputStreamReader(is, charset);

BufferedReader br = new BufferedReader(isr);

String line = null;

StringBuffer sb = new StringBuffer(); // String을 한줄로 모음

while((line = br.readLine()) != null) {

sb.append(line);

}

return sb.toString();

}

 

}

라이브러리의 코드는 이렇습니다.

 

이 라이브러리를 사용해서 기상청의 데이터가 보이는

코드를 작성해볼까요?

try {

InputStream is = puftHttpClient.download("https://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=4122066000");

 

데이터를 연결해주는 빨대를 꽂고

 

String result = puftHttpClient.convert(is, "UTF-8");

 

변환까지 시켜줍니다.

 

System.out.println(result);

} catch (Exception e) {

e.printStackTrace();

}

 

긁어온 코드

 

파일화하고 정렬까지 하면

이렇게 데이터가 넘어온 것을 확인할 수 있습니다.

 

다음은 각 태그들을 훑어보면서

Parsing이라는 것을 해볼건데요.

 

import해온 kxml2를 사용해서 해보겠습니다.

 

InputStream is = puftHttpClient.download("https://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=4122066000");

XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();

XmlPullParser xpp = xppf.newPullParser();

xpp.setInput(is, "UTF-8");

 

Parsing을 위한 초기설정 코드입니다.

Factory를 만들고 Parser객체를 생성해줍니다.

그리고 setInput을 사용해 convert합니다.

 

다음은 Parsing 작업 코드입니다.

 

while(type != XmlPullParser.END_DOCUMENT) {

if(type == XmlPullParser.START_TAG) {

tagName = xpp.getName();

}else if(type == XmlPullParser.TEXT) {

if(tagName.equals("hour")) {

System.out.printf("시간 : ~%s시 \t", xpp.getText());

}else if(tagName.equals("temp")) {

System.out.printf("온도 : ~%s도 \t", xpp.getText());}

else if(tagName.equals("wfKor")) {

System.out.printf("날씨 : ~%s \t", xpp.getText());

}

else if(tagName.equals("wdKor")) {

System.out.printf("풍향 : ~%s시 \t", xpp.getText());

System.out.println("=-=-=-=-=-==-=-=-=-=-=-=-=-=");

}

}else if(type == XmlPullParser.END_TAG) {

//XML에서는 띄어쓰기를 텍스트로 인식하는 경우가 있어서

tagName = " ";

}

xpp.next(); //다음 태그로 이동

type = xpp.getEventType(); //시작태그인지 텍스트인지 종료태그인지

//타입을 갖게함

}

 

시작 태그라면 태그의 이름을 불러오고 다음 태그로 넘어가고

시작 태그와 종료태그가 아니라면 

시간, 온도, 날씨, 풍향 데이터만 뽑아와서

출력합니다.

종료 태그라면 태그 이름을 공백으로 바꾸고 

다음태그로 이동합니다.

 

 

시간 : ~18시 온도 : ~2.0도 날씨 : ~흐림 풍향 : ~남시 =-=-=-=-=-==-=-=-=-=-=-=-=-=

시간 : ~21시 온도 : ~2.0도 날씨 : ~흐림 풍향 : ~남동시 =-=-=-=-=-==-=-=-=-=-=-=-=-=

시간 : ~24시 온도 : ~1.0도 날씨 : ~흐림 풍향 : ~남동시 =-=-=-=-=-==-=-=-=-=-=-=-=-=

 

출력 내용입니다.

 

이번 시간에는 기상청에 있는 데이터를 뽑아와서

Parsing 후 출력까지 해봤는데요.

데이터를 긁어오는 과정을 라이브러리화해서 사용하니 편리했고

Parsing을 위한 다른 사용자의 라이브러리도 사용해보니

새로운 코드를 많이 접하게 되서 

라이브러리마다 사용하기 위한 코드를 숙지하는 것이 중요할 것 같습니다.

'Java > 실습' 카테고리의 다른 글

[Java] 지하철 - JSON 실습  (0) 2024.12.19
[Java] 미세먼지 - 종합 실습  (0) 2024.12.18
[Java] HTTP통신  (2) 2024.12.18
[Java] Split과 Date 실습  (1) 2024.12.17
[Java] 행성  (0) 2024.12.16