hyeonga_code

reProject_21_스케줄러 활용, 날씨 API 활용_OpenWeatherMap 본문

Project_WEATHERWEAR

reProject_21_스케줄러 활용, 날씨 API 활용_OpenWeatherMap

hyeonga 2024. 1. 8. 05:59
반응형

 

reProject_20_스케줄러 활용, 날씨 API 활용_OpenWeatherMap

2024.01.06 - [Project] - reProject_19_Spring Scheduler 이용해서 만료된 쿠키에 적용하기 2024.01.05 프로젝트 메인 페이지에서 날씨를 활용한 상품을 추천해주는 기능을 구현하기로 했었다. 스케줄러를 사용한

hyeonga493.tistory.com


2024-01-07

openWeatherMap을 사용하여 날씨를 테이블에 저장하는 것까지 완료했다. 이제 현재 날짜를 기준으로 뒤로 2일 앞으로 2일 총 5일의 날짜를 화면에 출력할 예정이다. 오늘 날짜를 기준으로 어떻게 데이터를 가지고 와서 출력할 것인지에 대해 고민이 좀 있었다. 결론은 해시맵에 해시맵을 담아 출력하려고 한다. 해시맵에 vo를 담아도 되긴한다. 리스트에 vo를 담아 처리해도 되지만 그러면 forEach문을 사용해야 해서 이번에는 다른 방법으로 처리하기로 결정했다.

 

1. main페이지를 호출하는 clientGetController.java 수정

-- 지역이 7개가 있으므로 request.getParameter를 사용해서 지역이 어디인지를 받아오고 default 값은 seoul로 했다.

	/** 사용자 메인페이지 */
	@RequestMapping("clientMain.do")
	public String main(HttpServletRequest request, Model model) {
		log.info(null);
		
		String province = request.getParameter("province");
		if(province == null || province == "") {
			province = "seoul";
		}

		model.addAttribute("weatherList", weatherService.getWeather(province));
		
		return "client_main";
	}

 

 

 

2. WeatherService.java 수정

	// 날씨 불러오기(메인페이지)
	public HashMap<String, Object> getWeather(String province) {
		System.out.println("[ WeatherService ] getWeather");
		
		return weatherDAO.getWeather(province);
	}

 

 

 

3. WeatherDAO.java 수정

	// 날씨 불러오기(메인페이지)
	public HashMap<String, Object> getWeather(String province) {
		System.out.println("[ WeatherDAO ] getWeather");

		HashMap<String, Object> dayList = new HashMap<String, Object>();
		WeatherVO weathervo = new WeatherVO();
		weathervo.setProvince(province);
		
		// 오늘 날짜
		LocalDate today = LocalDate.now();
		int year = today.getYear();
		int month = today.getMonthValue();
		int day = today.getDayOfMonth();
		
		dayList.put("province", province);
		dayList.put("today", today.toString());
		
		for(int i=-2; i<3; i++) {
			weathervo.setWdate(LocalDate.of(year, month, (day+i)).toString());
			
			HashMap<String, Object> oneday = sqlSessionTemplate.selectOne("WeatherDAO.getWeather", weathervo);			
			
			//날짜 형식 변환
			oneday.put("wdate", oneday.get("wdate").toString().replace("-", "."));
			dayList.put("day"+(3+i), oneday); // day1, day2, day3(today), day4, day5
		}
		return dayList;
	}

 

 

4. weather-mapping.xml 파일 수정

	<!-- 날씨 불러오기(메인페이지) -->
	<select id="getWeather" resultType="HashMap" parameterType="weathervo">
		SELECT temp_min, temp_max, weatherday, weather_id, wdate
		FROM weather
		WHERE province=#{ province } AND wdate=#{ wdate };
	</select>

 

 

5. client_main.jsp 파일 수정

-- 기존에는 table 태그를 사용하여 하단의 요일과 날씨를 출력할 때 어려움이 있었는데 ul 태그로 변경하니 위치 잡기도 편하고 오히려 좋은 결정이 되었다.

 



>> 실행
-- 현재 날씨 정보와 상관없이 오늘 날짜를 기준으로 weather_id 값을 임의로 변경하여 여러 이미지를 확인할 수 있도록 함

1) parameter 값이 없는 경우 > default값(서울)

 

 

2) 서울 클릭 시 > province=seoul 

 

 

3) 춘천 클릭 시 > province=chuncheon

 

 

4) 수원 클릭 시 > province=suwon

 

 

5) 인천 클릭 시 > province=incheon

 

 

6) 대구 클릭 시 > province=daegu

 

 

6) 부산 클릭 시 > province=busan

 

 

>>>추후 오늘 날씨를 기반으로 추천 아이템을 표시하는 메인 페이지를 구현할 예정이다.

반응형