아래 그림은 전체 흐름 구상입니다. 그림의 서버단은 다 따로 돌아가게 그려졌는데 -_-.. 다 스프링과 연동되어 돌아갑니다. 클라이언트에서는 풀 AJAX를 사용하고 서버에서는 url로 요청을 받고 json으로 응답합니다. 클라이언트의 레이아웃 구성은 아래 그림과 같습니다. center의 tab panel의 레이아웃 구성은 아래와 같습니다.
테이블은 하이버네이트로 생성하였습니다.
※ Toad Data Modeler 3.5 로 뽑아낸 데이터베이스 구조 입니다.
접기
jQuery 와 Ext JS 를 공부(Ajax)하면서 사용할 데이터를 준비하기 위해 기상청 에서 공개하고 있는 XML 정보 를 바탕으로 데이터를 DB에 저장해놓고 JSON 으로 출력 하는 웹 어플리케이션을 만들게 되었습니다. 크게 동네예보(Town), 주간예보(Week), 전국예보(Whole), 코드조회(동네,지방,지역), 배치가 있습니다.spring 2.5 , hibernate 3 , json-taglib 등을 사용했습니다. json 포멧은 아래와 같습니다.
{
// 성공 여부 success: [ true | false ]
// success가 false시에만 나옴 error: "에러 내용"
// 헤더 정보(지역)가 있을시에만 나옴 area(location): {
데이터 } // 실제 데이터(배열) data: [ { 한개의 데이터 } ] }
동네예보 - 컨트롤러: AbstractCommandController + Validator
- 파라미터:
area(동네코드) , date(날짜), hour(시간)
예]
http://api.nerv-team.co.kr/forecast/town.do?area=4278036000&date=2010-06-24
// 동네:'강원도 철원군 원남면', 날짜:'2010-06-24' { "success": "true", "area": { "code": "4278036000", "x": "71", "y": "143", "name": "원남면", "parent": { "code": "4278000000", "x": "66", "y": "139", "name": "철원군", "parent": { "code": "4200000000", "x": "73", "y": "134", "name": "강원도" } } }, "data": [ { "date": "2010-06-24", "hour": "3", "temp": "19.4", "tmx": "", "tmn": "18.9", "sky": "흐림", "pty": "없음", "pop": "30", "r12": "15.152693", "s12": "0.0", "ws": "0.7", "wd": "북동(NE)", "reh": "82", "lastTm": "2010-06-24 08:00:00.0", "writeDate": "2010-06-24 10:42:08.0" }, { "date": "2010-06-24", "hour": "6", "temp": "18.5", "tmx": "", "tmn": "18.9", "sky": "흐림", "pty": "비", "pop": "60", "r12": "15.152693", "s12": "0.0", "ws": "1.8", "wd": "북(N)", "reh": "90", "lastTm": "2010-06-24 08:00:00.0", "writeDate": "2010-06-24 10:42:08.0" }, ...n ] }
주간예보 - 컨트롤러: AbstractCommandController + Validator - 파라미터: location(지역코드) , date(날짜) 예] http://api.nerv-team.co.kr/forecast/week.do?location=11B10101
// 지역: '서울' { "success": "true", "location": { "code": "11B10101", "name": "서울", "province": { "code": "11B00000", "name": "서울ㆍ인천ㆍ경기도" } }, "data": [ { "date": "2010-06-26", "wf": "흐리고 비", "tmn": "22.0", "tmx": "25.0", "reliability": "높음", "tm": "2010-06-24 06:00:00.0", "writeDate": "2010-06-24 10:27:23.0" }, { "date": "2010-06-27", "wf": "구름많고 비", "tmn": "21.0", "tmx": "26.0", "reliability": "보통", "tm": "2010-06-24 06:00:00.0", "writeDate": "2010-06-24 10:27:23.0" }, ...n ] }
전국예보 - 컨트롤러: AbstractCommandController + Validator
- 파라미터:
date(날짜) ,
hour(시간) , stnId(지역코드)
예]
http://api.nerv-team.co.kr/forecast/whole.do?date=2010-06-24&hour=13&stnId=108
// 날짜: '2010-06-24', 시간: '오후 1시', 지역: '서울' { "success": "true", "data": [{ "date": "2010-06-24", "hour": "13", "stnId": "108", "stnNm": "서울", "icon": "01", "desc": "맑음", "ta": "28.2", "rnHr1": "", "sdDay": "", "writeDate": "2010-06-24 13:20:07.0" }] }
코드조회 - 컨트롤러: MultiActionController + ParameterMethodNameResolver
- 필수파라미터: action
동네예보, 주간예보를 조회하기 위해서는 동네(지역)코드가 필요합니다. 이 코드는 기상청에서 제공되지 않아서 일일이 긁어왔습니다.
// 최상위 동네코드 { "success": "true", "data": [ { "code": "1100000000", "name": "서울특별시", "x": "60", "y": "127" }, { "code": "2600000000", "name": "부산광역시", "x": "98", "y": "76" }, ...n ] }
예]
http://api.nerv-team.co.kr/forecast/api.do?action=area&parent=4200000000
// '강원도'에 속하는 동네코드 { "success": "true", "data": [ { "code": "4211000000", "parent": "4200000000", "name": "춘천시", "x": "73", "y": "134" }, ...n { "code": "4283000000", "parent": "4200000000", "name": "양양군", "x": "88", "y": "138" } ] }
예] http://api.nerv-team.co.kr/forecast/api.do?action=area&parent=4283000000
// '강원도 양양군'에 속한 동네코드 { "success": "true", "data": [ { "code": "4283025000", "parent": "4283000000", "name": "양양읍", "x": "88", "y": "138" }, { "code": "4283031000", "parent": "4283000000", "name": "서면", "x": "87", "y": "138" }, ...n ] }
동네코드는
3단 까지 되어있습니다.
---
지방코드(action=province ) 파라미터: 없음
예]
http://api.nerv-team.co.kr/forecast/api.do?action=province
{ "success": "true", "data": [ { "code": "11B00000", "name": "서울ㆍ인천ㆍ경기도" }, { "code": "11C10000", "name": "충청북도" }, ...n ] }
---
지역코드(area=location ) 파라미터: province(지방코드)
예]
http://api.nerv-team.co.kr/api.do?action=location&province=11B00000
// '서울ㆍ인천ㆍ경기도' 지방에 속한 지역코드 { "success": "true", "data": [ { "code": "11B10101", "province": "11B00000", "name": "서울" }, { "code": "11B20201", "province": "11B00000", "name": "인천" }, { "code": "11B20305", "province": "11B00000", "name": "문산" }, { "code": "11B20601", "province": "11B00000", "name": "수원" } ] }
배치 프로세스 동네예보, 주간예보, 전국예보를 일정시간마다 조회해서 Database에 저장합니다. com.project.antop.batch 패키지에 있습니다.
SaverForecast 클래스입니다. 인자에 따라서 3가지 처리를 합니다.
"town" : 동네예보
"week" : 주간예보
"whole" : 전국예보
예]
#> java -cp /home/api/public_html/forecast/WEB-INF/classes:/home/api/public_html/forecast/WEB-INF/lib/* com.project.antop.batch.SaveForecast week // 주간 예보 데이터 저장
forecast.war※ 전에 만들었던 Weather History API 는 이제 사용하지 않습니다 ㅠ_ㅠ
접기
아래는 조금 더 자세하게 그린 그림입니다.
이 프로젝트를 이해 하려면 최소한 'ExtJS'와 'Spring MVC', 'JSON' 정도는 아셔야 합니다. ㅠ_ㅠ
클라이언트단과 서버단은 완전히 분리 되어 있습니다. 100% AJAX로만 주고 받습니다.
밖에 없습니다. Store에서 알아서 서버에 요청 후 받아서 처리합니다.
store의 config properties를 autoLoad: true로 설정 하면 자동으로 요청 url을 만들어 서버단에 요청합니다.
그러면 서버단에서 contorller - (service - service impl) - (dao - dao impl) 을 거쳐서 controller에서 mav를 리턴하면 마지막에 해당 JSP 까지 가게 됩니다.
을 출력합니다.
그걸 다시 클라이언트단의 ExtJS Store에서 받아서 처리하게 됩니다.
vo(Value Object)는 뭐 자기가 정해서 쓰는거니.. 적당히.... ㅠ_ㅠ