weatherapi
├─ .eslintrc.json
├─ README.md
├─ apis
│ ├─ admin
│ │ ├─ admin.controller.js
│ │ ├─ admin.service.js
│ │ └─ schema
│ │ └─ login.schema.js
│ ├─ forecast
│ │ ├─ forcast.service.js
│ │ ├─ forecast.controller.js
│ │ └─ schema
│ │ ├─ currentData.schema.js
│ │ ├─ shortTermData.schema.js
│ │ └─ utrSrtData.schema.js
│ └─ region
│ ├─ region.controller.js
│ ├─ region.service.js
│ └─ schema
│ └─ regions.schema.js
├─ app.js
├─ config
│ ├─ config.js
│ ├─ database.js
│ ├─ logger.js
│ ├─ redis.js
│ └─ swagger.js
├─ docs
│ ├─ admin
│ │ └─ login.swagger.js
│ ├─ forecasts
│ │ ├─ getCurrentData.swagger.js
│ │ ├─ getSrtTermData.swagger.js
│ │ └─ getUtrSrtData.swagger.js
│ └─ regions
│ ├─ deleteRegion.swagger.js
│ ├─ getRegions.swagger.js
│ └─ postRegion.swagger.js
├─ middleware
│ ├─ auth.middleware.js
│ └─ errorHandler.middleware.js
├─ models
│ ├─ admin.model.js
│ ├─ current.model.js
│ └─ region.model.js
├─ package-lock.json
├─ package.json
├─ routes
│ ├─ admin.router.js
│ ├─ forecast.router.js
│ └─ region.router.js
├─ server.js
└─ utils
├─ cache
│ └─ redisCache.js
├─ cron
│ └─ cronManager.js
├─ data
│ └─ location.xlsx
├─ fetchData
│ ├─ currentWeatherData.js
│ └─ fetchRequest.js
├─ getBaseTime.js
├─ httpErrors.js
├─ location
│ ├─ locationConverter.js
│ └─ locationUtils.js
├─ response.js
└─ responseValidation.js
- npm run start:dev
- npm run start:dev-pm2 -> pm2로 실행하기
- server : express
- DB : MongoDB, Redis
- swagger url : swagger-api-docs
- schema 구조 (currentdatas)
- 초단기 실황 데이터를 스키마에 저장
- cityName : 도시 이름
- fcstDate : 예보 날짜
- fcstTime : 예보 시간
- weatherData:
- 날씨 데이터
- 날씨 코드 : 날씨 값
- schema 구조 (region)
- 초단기 실황 데이터를 수집할 지역
- regionName: 수집할 지역
- 초단기 실황 데이터(/api/forecasts/current[GET]) - 1시간 기준으로 공공 api 요청 (node-cron)사용
- 초단기 데이터(/api/forecasts/utrsrt[GET]) - 1시간 기준으로 공공 api 요청
- 단기 예보 데이터(/api/forecasts/utrsrt[GET]) - 3시간 기준으로 공공 api 요청
서울시, 경기도, 제주도 초단기 실황 데이터를 1시간 기준으로 누적 (매 시간 40분마다 api 요청 제공) cron으로 주기적으로 데이터 요청
단기 예보 데이터 1시간 기준으로 업데이트 (매 시간 45분마다 api 요청 제공)
단기 예보 데이터 3시간 기준으로 업데이트
- /api/regions (POST) : 초단기 실황 데이터 로그를 저장할 지역 추가 (관리자 권한 필요)
- /api/regions (GET) : 로그 수집중인 지역 리스트 목록 보여주기
- /api/regions (DELETE) : 로그 수집중인 지역을 삭제하기 (관리자 권한 필요)
- /api/admin/login (POST) : 관리자 아이디 로그인
-
redis ttl 값을 각 api 제공시간에 맞춰 공공 api 데이터를 만료 (공공 api 요청시)
-
baseTime과 baseDate를 api 제공 시간에 맞춰 시간을 수정
- getCurrentAPiDateAndTime 함수 (현재시간을 초단기 실황 api 제공 시간으로 수정하는 함수)
- getUtrShortApiDateAndTime 함수 (현재시간을 초단기 api 제공 시간으로 수정하는 함수)
- getShortTermApiDateAndTime 함수 (현재시간을 단기 api 제공 시간으로 수정하는 함수)
- 추가 변동사항 ) new Date가 운영체제의 시간에 맞추기 때문에 한국 시간에 맞추도록 수정
-
xlsx 파일을 통해 해당 지역의 데이터를 입력시 위도(lat) 경도(lng) 데이터를 가져옴
- locationUtils.js 파일
- 해당 도시의 위 경도를 가져옴
- 지역 이름을 xlsx의 지역 이름에 맞춰 가져오는 함수 (getCityFullName 함수)
- xlsx을 기준으로 도시명을 하기 때문에 (완전한 유사 검색으로는 되지 않음)
- locationUtils.js 파일
-
해당 위,경도를 공공 api의 좌표로 변환하는 함수
-
해당 응답 데이터에 대한 schema 검증
- 응답 일관성을 위해 AJV를 사용하여 적절한 응답 객체인지 validation 검증
-
응답 객체 구조
- 도시, 날짜, 시간별로 객체로 묶어 날씨 코드와 해당하는 날씨 값을 응답하도록 구성
-
데이터베이스 ttl
- mongodb 스키마의 ttl을 2일을 주어, 초단기 실황 데이터를 현재 기준에서 2일전까지만 저장하도록함
-
cron으로 초단기 실황 데이터를 수집하기 때문에 많은 요청을 방지하기 위해 수집 지역 추가 및 삭제 부분은 관리자로 접속하여 지역 추가 및 삭제 가능
- redis cache를 통한 응답 데이터 시간 감소 (upstash 사용)
-
초단기 실황 API
- 공공 API 요청시 : 약 1.4초
- redis cache 요청시 : 약 0.4초 ~0.6초 (약 60% 속도 향상)
- database 요청시 : 약 0.6초 ~ 0.8초
-
초단기 예보 데이터 API
- 공공 API 요청시 : 약 1.4초
- redis cache 요청시 : 약 0.4초 ~ 0.6초 (약 60% 속도 개선)
-
단기 예보 데이터 API
- 공공 API 요청시 : 약 2초 ~ 4초
- redis cache 요청시 : 0.5초 ~ 0.7초 (약 70~ 80% 속도 개선)
-