[JAVA, WSDL] 기상청 웹서비스를 이용한 기상정보 조회

View Comments

이번 관공서 프로젝트를 진행하던 중 기상정보를 조회할 수 있는 기능이 들어가야되서 기상청에서 제공하는 웹서비스를 이용하게 됐다.

WSDL이라는 XML형태로 제공되는 웹서비스 기술언어를 이용하는데 이번 프로젝트에서 처음 접해보는 거라 적용하는데 애를 먹어서

다음 번에 비슷한 작업을 하게 될 경우를 대비해서 정리해 본다.

기상청 웹서비스는 현재 개인에게는 서비스는 하지 않고 관공서나 방재관련쪽에만 서비스를 한다고 한다. (관련 Q&A)

혹시나 관공서쪽 프로젝트를 하면서 기상청 웹서비스를 이용하고자 한다면 기상청에 웹서비스 이용신청서를 작성하여 서비스 이용에 필요한 아이디와 패스워드를 발급받아야 이용 가능하다.

WSDL로 제공되는 기상청 웹서비스는 WSDL 형태로 제공이되고 현재 사용할 프로젝트에 적용하기 위해선 언어에 맞는 Client Stub으로 변환할 필요가 있다.

참여중인 프로젝트는 JAVA를 이용하기에 JAVA에서 쓰기 위한 Client Stub으로 변환하는 방법에 대해서만 정리한다.

   WSDL을 Client Stub으로 변환  

WSDL을 이용하여 Client Stub으로 변환하기 위해서 기상청 시스템 담당자로부터 전달받은 메뉴얼은 작년에 작성된 문서이고 정작 중요한 부분이 설명이 안되어 있어서 그대로 보고 변환하고자 하기엔 어렵다.

JAVA에서 WSDL을 변환하는 유틸은 AXIS 라이브러리를 쓰기도 하고 WAS에서 제공하는 유틸을 사용하기도 한다.

현재 프로젝트에서는 jeus를 사용하기때문에 jeus에서 제공하는 유틸을 이용하기로 한다.

jeus가 설치되어있지 않다면 TmaxSoft 테크넷에서 Trial버전을 다운받아 설치한다. 회원 로그인을 해야만 다운로드가 가능하다.

jeus를 설치하고 jeus 홈 디렉토리의 samples 폴더 아래에 ant_task란 폴더에 보면 wsdl2java란 예제 폴더가 있고 그 안에 genclient 폴더에 보면

build.xml이 있는데 그 파일과 samples 폴더 아래의 common 폴더를 이용하면 된다.

build.xml의 내용을 보면

<?xml version="1.0" encoding="UTF-8"?>
<project name="SurfaceService" default="build" basedir=".">
    <property name="is.app-client.module" value="true"/>
    <import file="./common/common-build.xml"/> -- common-buil.xml의 경로는 자신에게 맞는 경로로 변경
    <taskdef name="wsdl2java" classname="jeus.util.ant.webservices.Wsdl2JavaTask">
        <classpath refid="jeus.libraries.classpath"/>
    </taskdef>
    <target name="-pre-compile">
        <mkdir dir="${build.classes.dir}"/>
        <wsdl2java destDir="${build.classes.dir}"
            verbose="true"
            mode="gen:client"
            doCompile="true" -- true이면 JAVA 소스와 컴파일된 파일이 생성되고 false이면 JAVA소스만 생성
            noDataBinding="false"
            package="kma.websky.client.stub.forecast" -- 변환된 JAVA소스가 담길 package 정의
            wsdl="http://websky.kma.go.kr/services/SurfaceService?wsdl"> -- 변환할 서비스의 WSDL 주소
            <classpath refid="jeus.libraries.classpath"/>
            <classpath refid="classpath"/>
        </wsdl2java>
    </target>
</project>

위 표시된 부분을 자신의 프로젝트에 맞게 변경하여 cmd창에서 위 build.xml파일이 위치한 경로에서 jant를 실행하면 아래 그림과 같이 실행된다.

참고로 기상청 웹서비스 목록은 http://websky.kma.go.kr/ 사이트에서 확인 가능하고 위에서 사용된 WSDL은 지상 웹 서비스이다.

build

WSDL을 JAVA로 변환하기 위한 build


이렇게 변환을 하고 나면 build.xml이 위치한 폴더에 build 폴더와 dist란 폴더가 생성이 되고 build 폴더에는 build.xml에서 정의한 package 경로에 변환된 소스들이 생성이 되고 dist 폴더에는 해당 소스를 압축한 jar 파일이 생성된다.

생성된 것들 중 편한대로 사용하면 된다. jar파일을 이용하고자 하면 WEB-INF 폴더의 lib폴더에 jar파일을 넣어서 사용하면 되고 JAVA소스를 이용하고자 한다면 src폴더아래에 두고 사용하면 된다.

   변환된 Client Stub 사용에 필요한 라이브러리  

Client Stub으로 변환 후 프로젝트에 사용하고자 한다면 변환된 JAVA소스에서 사용하는 관련 라이브러리도 필요하다.

아래 목록이 그 라이브러리들이다.

bootstrap.jar
FastInfoset.jar
javax.jms.jar
jaxrpc-api.jar
jaxrpc-impl.jar
jaxrpc-spi.jar
jaxws-rt.jar
jeus.jar
jeusapi.jar
jeusutil.jar
jeus-ws.jar
saaj-impl.jar

 - 참고1 : 빨간색으로 표시된 jar 파일은 아래 첨부파일을 다운받아 사용하면 된다.

 - 참고2 : 빨간색의 굵게 표시된 JAR파일을 제외하고 나머지 jar 파일은 JEUS 설치 후 JEUS 홈디렉토리 아래 \lib\system 폴더 하위에 존재한다.

   소스에 적용하기  

기상청에서 제공하는 많은 웹서비스들이 있고 각 서비스마다 조회 가능한 기상정보들이 많기 때문에 다 쓸 필요는 없고 필요한 서비스만 가져다 쓰면 된다.

해당 웹서비스의 WSDL을 JAVA 소스로 변환하여 프로젝트에 추가한 후 아래와 같이 사용하면 된다.
/**
* 기상청 웹서비스 관련 Util Class
*/
public class KmaWeatherUtil {
private static SurfaceServiceImplService_Impl impl = null;
private static SurfaceServiceImpl_Stub service = null;

/**
* Default Constructor
*/
public KmaWeatherUtil() {
impl = new SurfaceServiceImplService_Impl();
service = (SurfaceServiceImpl_Stub)impl.getSurfaceService();

service._setProperty(javax.xml.rpc.Stub.USERNAME_PROPERTY, "발급받은 ID");
service._setProperty(javax.xml.rpc.Stub.PASSWORD_PROPERTY, "발급받은 Password");
}

/**
* 주어진 지점코드와 시간의 현재 기상정보를 받아온다.
* @param station_id
* @param time
* @return
* @throws RemoteException
*/
public CurrentWeatherModel getCurrentWeatherInfo(String station_id, String time) throws RemoteException {
return service.getCurrentWeather(station_id, time);
}
}

// 실제 사용하는 부분
// 143은 대구의 지역코드이고 2번째 인자는 String 형태(yyyyMMddHH)의 시간이며 null은 현재 시간
KmaWeatherUtil kmaWtUtil = new KmaWeatherUtil();
CurrentWeatherModel curWtInfo = kmaWtUtil.getCurrentWeatherInfo("143", null);
위 소스에서 getCurrentWeatherInfo 함수는 현재 시간의 기상정보를 가져오고 필요한 파라메터는 조회하고자 하는 위치코드(station_id)와 조회를 원하는 시간(time)을 넘겨주면 되고 현재 시간의 기상정보를 얻을려면 null값을 넘겨주면 된다.

JSP에서 표시되는 결과는 아래 그림과 같이 나온다.

결과


이상으로 변환에 대한 정리를 마친다. 현재 프로젝트에서 사용하는 건 현재 기상정보만을 사용하기때문에 함수 하나로 간단하게 되지만 서비스하고자 하는 기능이 많다면 좀 더 복잡해질거라 본다.

* 이 포스트는 blogkorea [블코채널 : 프로그램에 대한 개발팁 및 유용한 정보 공유합시다.] 에 링크 되어있습니다.

26 Comments (+add yours?)

  1. Favicon of http://raycat.net BlogIcon Fallen Angel 2009.09.04 13:20

    상당히 어려워 보이게 느껴지는....@.@;;;;

     Reply  Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2009.09.04 13:27 신고

      ㅎㅎㅎ 개발에 대해서 모르시는 분들이야 뭐 그냥 외계어처럼 보이겠죠;;;
      사실 저도 어려워요 ㅠㅠ

       Address

  2. 2009.09.05 08:26

    비밀댓글입니다

     Reply  Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2009.09.05 11:12 신고

      블로그보단 트위터를 자주 하니 뭐 ㅋ
      알려주신 기능 자주 사용해보께요 ^^
      주말 잘 보내시구요 ㅎㅎ

       Address

  3. Favicon of http://boring.tistory.com/ BlogIcon 보링보링 2009.09.08 02:03

    html만 보면 울렁증이..@.@어지러워요~ㅎ

     Reply  Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2009.09.08 09:02 신고

      ㅎㅎㅎ 뭐 엄밀히 말하면 html이 아니라 java인데요?;;;
      오늘 하루 즐겁게 보내세요 ^^

       Address

  4. 2009.11.05 13:33

    비밀댓글입니다

     Reply  Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2009.11.05 14:51 신고

      닷넷을 이용하신다면 이 글에 적힌 방법으로는 안됩니다 ^^;
      이 글은 자바 기준으로 변환하는 방법이구요.
      구글에서 닷넷용으로 찾아보시길 권해드립니다.
      닷넷으로 할때는 웹참조를 이용하면 된다고 하는데 닷넷으로 하는 방법은 해보지를 않아서 정확한 방법은 잘 모르겠네요.
      혹시 ASP.NET이라면 아래 링크를 참고해보세요.

      첫번째 : http://msdn.microsoft.com/ko-kr/library/7bkzywba%28VS.80%29.aspx

      두번째 : http://quickstarts.asp.net/QuickStartv20/webservices/

      큰 도움이 못드려서 죄송합니다 ^^;

       Address

  5. 궁금이 2009.11.11 11:40

    jeus4버전에서는 어떻게 해야 하나요?
    환경 Dir 경로도 없고 관련 파일도 없는거 같은데 jeus4에서도 가능한가요?

     Reply  Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2009.11.11 12:03 신고

      제우스 홈 디렉토리 아래에 샘플 디렉토리에 wsdl2java 예제 폴더가 없던가요?
      비슷한 예제가 있을것 같은데...
      지금은 제가 일때문에 확인을 못해볼 것 같구요.
      저녁때쯤 확인해보고 다시 답변달아드리께요 ^^;

       Address

  6. 궁금이 2009.11.11 12:38

    네.. wsdl2java 가 없더라구요.

    저도 기상정보를 받으려는데 운영자 지침서를 받아서 보고있습니다.

    그런데 JEUS5.0 기준 설명이라 나와 있고

    무슨 소린지 알지 듣지를 못하겠습니다.

    build.xml, tasks.xml, taskdef.xml 만들어서

    빌드 실행해서 서비스 호출하라는데...

    여기가 설명을 더 잘해주셨네요..

    그런데 JEUS4 버전인데 JEUS4에서는 어떻게 해야하는지 궁금합니다.

    감사합니다.

     Reply  Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2009.11.11 18:16 신고

      저랑 같은 운영자 지침서를 받으신 모양이네요;;;
      거긴 설정파일은 설명되어있는데 정작 필요한 파일에 대한 자세한 설명이 없어서 저도 몇일 헤맸어요 -ㅅ-;
      지금 플젝 막바지라서 좀 바쁘군요 ㅎㅎ
      저녁시간대라 저녁먹고 살펴보고 답변달아드리께요 ^^;

       Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2009.11.11 19:29 신고

      음...제 컴퓨터에 윈도우용 Jeus4.2를 깔아서 살펴봤는데 이게 보니까 wsdl2java란 실행파일 자체가 없군요;;;
      변환할때 저 파일을 이용하는데
      Jeus4.x 버전대에는 다른 파일로 하는건지 아님 웹서비스 자체가 안되는건지 잘 모르겠네요 ^^;;

      http://technet.tmax.co.kr/
      위 사이트가 티맥스소프트 테크넷인데 저기 Q&A에서 담당자한테 물어봐야될듯 합니다.

      Jeus6버전대로 변환해서 사용이 가능하면 좋은데 그게 될지도 잘 모르겠네요.

      저도 이번 플젝에서 처음 사용해본거라 상세한 답변드리긴 힘들 것 같아요;;;

       Address

  7. 궁금이 2009.11.12 10:05

    답변 감사드립니다.

    티맥스에 문의를 해야 겠네요. ^^;

    좋은 하루되세요.

     Reply  Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2009.11.12 10:17 신고

      네 해결을 위한 답을 못드려서 같은 개발자로서 미안하네요 ^^;
      아무쪼록 잘 해결되길 바랍니다 ^^

       Address

  8. 초보개발자 2010.08.24 14:18

    너무 좋은 정보 감사합니다.
    현재 JEUS를 이용해서 기상정보 시스템이랑 연동중인데요.
    WSDL 서비스를 한번에 여러개 사용하고 싶으면 어떻게 하면 될까요?
    생각나시는 방법 있으시면 좀 알려주세요.

     Reply  Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2010.08.24 21:57 신고

      흠..여러개를 사용하시고자 한다면 위와 같은 작업을 해서 jar 파일로 만들거나 java 소스 패키지 형태로 만드셔서 프로젝트에 추가하여 사용하면 될거라 생각합니다.
      정말로 그냥 생각뿐이지만 그렇게 해도 될거 같은데요? ^^;

       Address

  9. 2010.10.21 10:00

    비밀댓글입니다

     Reply  Address

  10. 제우스만초보 2010.10.29 00:01

    지금 전자정부프레임워크를 이용하여 제우스와 연동을 해야 하며 기상청 서비스도 받아야 합니다.

    문제는 전자정부프레임워크와 제우스 연동이네요.. 연동이 되야 저걸 어케든 적용시켜볼겐데.. ㅠㅠ

    혹시 전자정부프레임워크와 제우스 및 웹2비 연동은 안해보셨나요?
    -_-;;

     Reply  Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2010.11.04 13:45 신고

      죄송합니다 제가 바빠서 블로그 관리가 소홀하네요 ^^;
      제우스와 웹투비, 전자정부 프레임워크 연동은 해본적이 없군요;;
      근데 java를 이용한다면 크게 차이는 없을거라 생각합니다 ^^;
      자세히 설명을 해드리고 싶지만
      제가 설명을 해드릴 수 있는 범위는 본문에 있는 글 정도 밖에 안될 거 같습니다 ^^;

       Address

  11. BlogIcon 비드고슈제 2011.08.03 17:57

    현재도 이 웹서비스가 실행되고 있나요? ㅠ
    JSP에다가 "실제 사용하는 부분의 소스"를 적고 페이지를 열면
    "예기치 않은 null" 이라는 오류가 나네요 ㅠㅠㅠㅠ
    혹시 호출하는 부분의 소스를 보여주실수 없으실려나요? ㅠㅠㅠ

     Reply  Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2011.08.03 21:27 신고

      네 저걸 적용한 관공서 사이트는 현재도 운영중에 있습니다.
      근데 저 웹서비스는 관공서에서 기상청에 공문으로 요청하여
      아이디와 비밀번호를 발급받아 사용하는 모듈입니다.
      저희와 똑같이 아이디와 비밀번호 발급을 받으셨다면 모르겠지만
      아니면 저걸 그대로 사용은 못할거에요 ^^;

       Address

  12. 비드고슈제 2011.08.05 13:39

    예기치 않은 null은 기상청에서 막아놓은 오퍼레이션을 호출할 경우에 발생하네요. 저는 아이디를 발급받아 놓을걸 받아서 써서 이런 사항을 몰랐는데, 혹시나 해서 참고하실분 하시라고 끄적여 놓습니당 ㅠㅠ 헌데,
    "일련화 해제 오류: 예기치 않은 XML 판독기 상태입니다. END을(를) 예상했지만 START: {http://xml.apache.org/axis/}stackTrace이(가) 검색되었습니다." 이 오류 아시는분 혹시 있으신가요? ㅠㅠ

     Reply  Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2011.08.05 13:51 신고

      xml 파싱하는 부분이 잘못된거 아닐까요?
      파싱하면서 발생되는 부분 같은데요 ^^;

       Address

  13. 개발자 2012.10.24 14:04

    eclipse의 web service를 이용하여 client stub으로 변환하여 기상특보 웹서비스(WarningService) 연결이 정상적임을 확인했습니다.
    위성 웹서비스(SatelliteService)를 똑같은 형식으로 호출하였더니..
    java.lang.RuntimeException: No support for attachments
    org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
    org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:154)
    org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
    org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    org.apache.axis.client.Call.invoke(Call.java:2767)
    org.apache.axis.client.Call.invoke(Call.java:2443)
    org.apache.axis.client.Call.invoke(Call.java:2366)
    org.apache.axis.client.Call.invoke(Call.java:1812)
    kr.go.kma.websky.services.SatelliteService.SatelliteServiceSoapBindingStub.getSatelliteImage(SatelliteServiceSoapBindingStub.java:170)
    kr.go.kma.websky.util.SatelliteUtil.getSatelliteImage(SatelliteUtil.java:33)
    org.apache.jsp.SatelliteService_jsp._jspService(SatelliteService_jsp.java:57)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:371)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    이와 같은 에러가 발생하더군요. 어떤 차이가 있는건가요?
    해결방법은?

     Reply  Address

    • Favicon of https://www.parkgunstyle.kr BlogIcon 열혈박군 2012.10.25 15:53 신고

      java.lang.RuntimeException: No support for attachments

      이 부분을 살펴봐야할 것 같습니다.

      어떤 방식으로 어떤 데이터를 이용하실려는 건지는 모르겠지만 처음 보는 오류 메시지네요.

       Address

Leave a Reply

0 Tracbacks (+view to the desc.)

Newer Entries Older Entries