Hello World

기상청 사이트 서울 날씨 주간 예보 조회 - Spring Framework 본문

Spring/3.x

기상청 사이트 서울 날씨 주간 예보 조회 - Spring Framework

EnterKey 2016. 2. 22. 14:12
반응형

이전 Java 기상청 사이트 서울 날씨 주간 예보 조회 프로그램을 Camel Framework와 Spring Framework와 결합한 프로그램으로 재 작성한다. 이 프로그램도 소스 100 줄 이내 프로그램이다.

목차

 [숨기기]

사용 기술

이전 예제에서 Spring Framework가 추가 되었다.

기술설명
Java 6Java 6
Apache Camel[1]Apache EIP 프레임워크 2.8.0
Spring [2]Spring application 프레임워크 3.0.5
Apache HttpClientApache http 클라이언트 라이브러리 3.1
Eclipse IDEJava 통합 개발 환경 3.6
MavenJava 빌드 툴, 의존 라이브러리 포함에 사용

프로그램 유스케이스

이전 예제와 프로그램 유스케이스는 같다, Spring Framework의 기술을 적용하는 개발 방식만 변경된다.

  1. 기상청 웹 사이트에서 서울, 경기 지역 날씨 주간 예보 XML 정보를 얻는다.
  2. XML 정보에서 서울 날씨 주간 정보를 추출한다.
  3. 서울 지역 날씨를 화면에 출력한다.

EIP 패턴

  • EIP 경로 정의

이전 예에서는 EIP 경로를 Java Source에 정의하였으나, 이 예제에서는 Spring Context XML 파일에 EIP 경로를 정의한다.


  • applicationContext.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xmlns:camel="http://camel.apache.org/schema/spring"
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans
  6.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7.    http://camel.apache.org/schema/spring
  8.    http://camel.apache.org/schema/spring/camel-spring.xsd">
  9.  
  10.     <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  11.         <jmxAgent id="agent" disabled="false" />
  12.         <route>
  13.             <from uri="direct:seoul" />
  14.             <to uri="http://www.kma.go.kr/weather/forecast/mid-term-xml.jsp?stnId=109" />
  15.             <convertBodyTo type="org.w3c.dom.Document" />
  16.             <to uri="bean:weatherExtractor?method=print" />
  17.         </route>
  18.     </camelContext>
  19.  
  20.     <bean id="weatherExtractor" class="com.brm.weather.WeatherExtractor" />
  21.  
  22. </beans>
  • EIP 다이어그램

의존 라이브러리

이전 의존 라이브러리에서 camel-sping 의존성을 추가하였다.

  • pom.xml
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.     <modelVersion>4.0.0</modelVersion>
  4.     <groupId>weather</groupId>
  5.     <artifactId>weather</artifactId>
  6.     <version>0.0.1-SNAPSHOT</version>
  7.     <dependencies>
  8.         <dependency>
  9.             <groupId>org.apache.camel</groupId>
  10.             <artifactId>camel-http</artifactId>
  11.             <version>2.8.0</version>
  12.             <scope>compile</scope>
  13.         </dependency>
  14.         <dependency>
  15.             <groupId>log4j</groupId>
  16.             <artifactId>log4j</artifactId>
  17.             <version>1.2.16</version>
  18.             <scope>compile</scope>
  19.         </dependency>
  20.         <dependency>
  21.             <groupId>org.slf4j</groupId>
  22.             <artifactId>slf4j-log4j12</artifactId>
  23.             <version>1.6.1</version>
  24.             <scope>compile</scope>
  25.         </dependency>
  26.         <dependency>
  27.             <groupId>org.apache.camel</groupId>
  28.             <artifactId>camel-spring</artifactId>
  29.             <version>2.8.0</version>
  30.             <scope>compile</scope>
  31.         </dependency>
  32.     </dependencies>
  33. </project>
  • 라이브러리 의존 다이어그램
  • 의존 라이브러리 목록

이전 예제에서 camel-spring 의존성을 추가하여 관련된 의존 라이브러리 목록이 추가 되었다.

라이브러리설명
camel-core-2.8.0.jarApache Camel Core 라이브러리
camel-http-2.8.0.jarApache Camel Core Http Component 라이브러리
commons-codec-1.2.jarApache Commons Codec 라이브러리
commons-httpclient-3.1.jarApache Commons Http Client 라이브러리
commons-logging-1.0.4.jarApache Commons Logger 라이브러리
commons-management-1.0.jarApache Commons Management 라이브러리
geronimo-servlet_2.4_spec-1.1.1.jarApache Geronimo Servlet 2.4 spec 정의 라이브러리
log4j-1.2.16.jarlog4j 라이브러리
slf4j-api-1.6.1.jarslf4j logger 라이브러리
slf4j-log4j12-1.6.1.jarslf4j log4j logger 라이브러리
camel-spring-2.8.0.jarCamel Spring 결합 라이브러리
spring-core-3.0.5.RELEASE.jarSpring Core 라이브러리
spring-beans-3.0.5.RELEASE.jarSpring Bean 라이브러리
spring-context-3.0.5.RELEASE.jarSpring Context 라이브러리
spring-expression-3.0.5.RELEASE.jarSpring Expression 라이브러리
spring-asm-3.0.5.RELEASE.jarSpring Asm 라이브러리
spring-aop-3.0.5.RELEASE.jarSpring Aop 라이브러리
spring-tx-3.0.5.RELEASE.jarSpring Transaction 라이브러리
aopalliance-1.0.jarAOP 표준화 라이브러리

프로그램

이번 예제에서는 EIP 경로가 정의된 Spring Framework XML 파일을 로드하는 로직이 등장하고, Camel Framework가 제공하는 Main 클래스를 사용하여 프로그램을 구동한다. 아래 참조사이트에서 본 프로그램의 Eclipse 프로젝트를 다운로드 [3] 받을 수 있다.

  • SpringMain.java
  1. /*******************************************************************************
  2.  *
  3.  * 파일명      : SpingMain.java
  4.  * 설명        : Sping Framework 결합 메인 프로그램
  5.  *
  6.  *******************************************************************************/
  7. package com.brm.weather;
  8.  
  9. import org.apache.camel.ProducerTemplate;
  10. import org.apache.camel.spring.Main;
  11.  
  12. public class SpringMain {
  13.  
  14.     public static void main(String[] args) throws Exception {
  15.         SpringMain main = new SpringMain();
  16.         // EIP 경로 정의 Spring Framework XML
  17.         main.run("classpath:applicationContext.xml");
  18.     }
  19.  
  20.     public void run(String conf) throws Exception {
  21.         Main camel = new Main();
  22.         camel.setApplicationContextUri(conf);
  23.         camel.start();
  24.         ProducerTemplate producer = camel.getCamelTemplate();
  25.         producer.sendBody("direct:seoul""");
  26.         camel.stop();
  27.     }
  28. }
  • WeatherExtractor.java

날씨 정보를 추출하는 Bean은 이전 예제와 같다.

  1. /*******************************************************************************
  2.  *
  3.  * 파일명      : WeatherExtractor.java
  4.  * 설명        : 서울 지역 주간 날씨 예보 출력 Bean
  5.  *
  6.  *******************************************************************************/
  7. package com.brm.weather;
  8.  
  9. import com.sun.org.apache.xpath.internal.XPathAPI;
  10.  
  11. import javax.xml.transform.TransformerException;
  12.  
  13. import org.w3c.dom.DOMException;
  14. import org.w3c.dom.Document;
  15. import org.w3c.dom.Node;
  16. import org.w3c.dom.traversal.NodeIterator;
  17.  
  18. public class WeatherExtractor {
  19.     /*
  20.      * 주간 날씨 정보를 화면에 출력
  21.      */
  22.     public void print(Document doc) throws TransformerException {
  23.         // location 서울 엘리먼트 검색
  24.         String xpath = "//wid/body/location[@city='11B10101']";
  25.         NodeIterator locations = XPathAPI.selectNodeIterator(doc, xpath);
  26.         Node location;
  27.         while ((location = locations.nextNode()) != null) {
  28.             NodeIterator datas = XPathAPI.selectNodeIterator(location, "data");
  29.             Node data;
  30.             while ((data = datas.nextNode()) != null) {
  31.                 System.err.println(getText(data, "numEf") + "일 후 예보");
  32.                 System.err.println("\t날짜 : " + getText(data, "tmEf"));
  33.                 System.err.println("\t날씨예보 : " + getText(data, "wf"));
  34.                 System.err.println("\t최저온도 : " + getText(data, "tmn") + " 도");
  35.                 System.err.println("\t최고온도 : " + getText(data, "tmx") + " 도");
  36.                 System.err.println("\t신뢰도 : " + getText(data, "reliability"));
  37.             }
  38.         }
  39.     }
  40.  
  41.     private String getText(Node data, String xpath) throws TransformerException {
  42.         return XPathAPI.selectSingleNode(data, xpath).getTextContent();
  43.     }
  44. }
  • 프로그램 실행 결과
2일 후 예보
    날짜 : 2011-09-19
    날씨예보 : 흐림
    최저온도 : 17 도
    최고온도 : 21 도
    신뢰도 : 낮음
...

맺음말

기상청 사이트 서울 날씨 주간 예보 조회 프로그램을 이번에는 Camel Framework와 Spring Framework를 결합하여 작성하였다. 이 예제를 통해 Camel Framework가 Spring Framework와 잘 결합되는 것을 볼 수 있다. 이 예제에서는 맛보기 수준이지만 Camel Framework는 거의 모든 EIP 경로를 Spring XML에 정의할 수 있고, Spring Framework 에서 정의한 Bean을 자유롭게 사용할 수 있는 기술을 제공한다. Spring Framework가 Java application Framework의 de facto 표준 프레임워크로 오랫동안 성숙된 Enterprise 기술이나 메시지 비동기 전송 기술에 대한 고려가 부족한데, Camel Framework의 메시지 비동기 전송 기술을 Spring Framework와 결합하여 활용하면 Enterprise 아키텍처 구성의 새로운 방법론을 찾을 수 있을 것이다.


출처: http://www.barunmo.com/wiki/index.php/%EA%B8%B0%EC%83%81%EC%B2%AD_%EC%82%AC%EC%9D%B4%ED%8A%B8_%EC%84%9C%EC%9A%B8_%EB%82%A0%EC%94%A8_%EC%A3%BC%EA%B0%84_%EC%98%88%EB%B3%B4_%EC%A1%B0%ED%9A%8C_-_Spring_Framework

반응형

'Spring > 3.x' 카테고리의 다른 글

spring cache의 적용(ehcache)  (0) 2016.04.18
1장 스프링 시큐리티란?  (0) 2016.02.24
Spring – JMS 적용하기  (0) 2016.02.22
JMS 개념 및 Spring에서 지원하는 JMS, MDP  (0) 2016.02.22
Spring Batch 개념 정리  (0) 2016.02.22
Comments