@things-factory/integration-data-go-kr 10.0.0-beta.62 → 10.0.0-beta.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -16
- package/ROADMAP.md +25 -14
- package/dist-server/engine/connector/data-go-kr-client.d.ts +1 -1
- package/dist-server/engine/connector/data-go-kr-client.js +25 -2
- package/dist-server/engine/connector/data-go-kr-client.js.map +1 -1
- package/dist-server/engine/connector/data-go-kr-connector.d.ts +5 -11
- package/dist-server/engine/connector/data-go-kr-connector.js +3 -9
- package/dist-server/engine/connector/data-go-kr-connector.js.map +1 -1
- package/dist-server/engine/spec/building-ledger/hub.d.ts +12 -0
- package/dist-server/engine/spec/{building-ledger.js → building-ledger/hub.js} +13 -10
- package/dist-server/engine/spec/building-ledger/hub.js.map +1 -0
- package/dist-server/engine/spec/building-ledger/index.d.ts +7 -0
- package/dist-server/engine/spec/building-ledger/index.js +12 -0
- package/dist-server/engine/spec/building-ledger/index.js.map +1 -0
- package/dist-server/engine/spec/index.d.ts +2 -1
- package/dist-server/engine/spec/index.js +22 -5
- package/dist-server/engine/spec/index.js.map +1 -1
- package/dist-server/engine/spec/types.d.ts +3 -3
- package/dist-server/engine/spec/types.js +1 -1
- package/dist-server/engine/spec/types.js.map +1 -1
- package/dist-server/engine/spec/weather/asos.d.ts +2 -0
- package/dist-server/engine/spec/weather/asos.js +33 -0
- package/dist-server/engine/spec/weather/asos.js.map +1 -0
- package/dist-server/engine/spec/weather/aws.d.ts +2 -0
- package/dist-server/engine/spec/weather/aws.js +28 -0
- package/dist-server/engine/spec/weather/aws.js.map +1 -0
- package/dist-server/engine/spec/weather/index.d.ts +14 -0
- package/dist-server/engine/spec/weather/index.js +23 -0
- package/dist-server/engine/spec/weather/index.js.map +1 -0
- package/dist-server/engine/spec/weather/mid-term-forecast.d.ts +2 -0
- package/dist-server/engine/spec/weather/mid-term-forecast.js +56 -0
- package/dist-server/engine/spec/weather/mid-term-forecast.js.map +1 -0
- package/dist-server/engine/spec/weather/short-term-forecast.d.ts +2 -0
- package/dist-server/engine/spec/weather/short-term-forecast.js +71 -0
- package/dist-server/engine/spec/weather/short-term-forecast.js.map +1 -0
- package/dist-server/engine/spec/weather/warning.d.ts +2 -0
- package/dist-server/engine/spec/weather/warning.js +34 -0
- package/dist-server/engine/spec/weather/warning.js.map +1 -0
- package/dist-server/engine/task/building-ledger/general.js +1 -1
- package/dist-server/engine/task/building-ledger/general.js.map +1 -1
- package/dist-server/engine/task/call.d.ts +10 -3
- package/dist-server/engine/task/call.js +20 -4
- package/dist-server/engine/task/call.js.map +1 -1
- package/dist-server/engine/task/index.d.ts +1 -0
- package/dist-server/engine/task/index.js +1 -0
- package/dist-server/engine/task/index.js.map +1 -1
- package/dist-server/engine/task/weather/grid-converter.d.ts +24 -0
- package/dist-server/engine/task/weather/grid-converter.js +69 -0
- package/dist-server/engine/task/weather/grid-converter.js.map +1 -0
- package/dist-server/engine/task/weather/index.d.ts +13 -0
- package/dist-server/engine/task/weather/index.js +18 -0
- package/dist-server/engine/task/weather/index.js.map +1 -0
- package/dist-server/engine/task/weather/short-term-forecast.d.ts +38 -0
- package/dist-server/engine/task/weather/short-term-forecast.js +99 -0
- package/dist-server/engine/task/weather/short-term-forecast.js.map +1 -0
- package/dist-server/index.d.ts +2 -0
- package/dist-server/index.js +4 -1
- package/dist-server/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/integration/connector/data-go-kr-connector.md +6 -7
- package/helps/integration/services/building-ledger.md +6 -5
- package/helps/integration/services/weather.md +82 -0
- package/helps/integration/task/building-ledger.md +25 -1
- package/helps/integration/task/data-go-kr-call.md +31 -4
- package/helps/integration/task/weather-short-term-forecast.md +96 -0
- package/logs/.5e5d741d8b7784a2fbad65eedc0fd46946aaf6f2-audit.json +15 -0
- package/logs/connections-2026-04-25-09.log +0 -0
- package/package.json +2 -2
- package/server/engine/connector/data-go-kr-client.ts +26 -2
- package/server/engine/connector/data-go-kr-connector.ts +8 -11
- package/server/engine/spec/{building-ledger.ts → building-ledger/hub.ts} +12 -9
- package/server/engine/spec/building-ledger/index.ts +7 -0
- package/server/engine/spec/index.ts +24 -3
- package/server/engine/spec/types.ts +3 -3
- package/server/engine/spec/weather/asos.ts +32 -0
- package/server/engine/spec/weather/aws.ts +27 -0
- package/server/engine/spec/weather/index.ts +14 -0
- package/server/engine/spec/weather/mid-term-forecast.ts +56 -0
- package/server/engine/spec/weather/short-term-forecast.ts +73 -0
- package/server/engine/spec/weather/warning.ts +33 -0
- package/server/engine/task/building-ledger/general.ts +2 -2
- package/server/engine/task/call.ts +24 -4
- package/server/engine/task/index.ts +1 -0
- package/server/engine/task/weather/grid-converter.ts +79 -0
- package/server/engine/task/weather/index.ts +14 -0
- package/server/engine/task/weather/short-term-forecast.ts +110 -0
- package/server/index.ts +2 -0
- package/translations/en.json +9 -2
- package/translations/ja.json +9 -2
- package/translations/ko.json +9 -2
- package/translations/ms.json +9 -2
- package/translations/zh.json +9 -2
- package/dist-server/engine/spec/building-ledger.d.ts +0 -9
- package/dist-server/engine/spec/building-ledger.js.map +0 -1
|
@@ -9,14 +9,13 @@
|
|
|
9
9
|
|
|
10
10
|
하나의 ServiceKey 로 등록 앱의 **구독 중인 모든 서비스** 를 호출할 수 있으므로, Connection 은 보통 앱·법인당 1개만 생성한다.
|
|
11
11
|
|
|
12
|
-
##
|
|
12
|
+
## Connection 필드
|
|
13
13
|
|
|
14
|
-
|
|
|
14
|
+
| 필드 | 필수 | 설명 |
|
|
15
15
|
| --- | --- | --- |
|
|
16
|
-
| `
|
|
17
|
-
| `
|
|
18
|
-
|
|
19
|
-
> Connection 엔티티의 `endpoint` 필드는 무시됩니다. 오리진 변경은 `origin` 파라미터 사용.
|
|
16
|
+
| `name` | O | Connection 이름 (자유) |
|
|
17
|
+
| `endpoint` | △ | API 오리진. 비워두면 기본값 `https://apis.data.go.kr`. 모의 서버/사설 프록시로 라우팅하려면 해당 오리진 입력 (예: `http://localhost:8080`) |
|
|
18
|
+
| `serviceKey` (params) | O | data.go.kr 일반 인증키 (Decoding/Encoding 모두 허용). `useDomainAttribute=true` 로 도메인 시크릿 저장 권장 |
|
|
20
19
|
|
|
21
20
|
## 관련 태스크
|
|
22
21
|
|
|
@@ -34,6 +33,6 @@
|
|
|
34
33
|
|
|
35
34
|
등록된 서비스 스펙은 코드상 `SpecRegistry.listServices()` 로 확인 가능. 현재 등록된 서비스:
|
|
36
35
|
|
|
37
|
-
- [`1613000/
|
|
36
|
+
- [`1613000/BldRgstHubService` — 국토교통부_건축물대장 허브 서비스](../services/building-ledger.md)
|
|
38
37
|
|
|
39
38
|
추가 예정 서비스는 [ROADMAP](https://github.com/hatiolab/things-factory/blob/main/packages/integration-data-go-kr/ROADMAP.md) 참조.
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 건축물대장 허브 서비스 (`1613000/BldRgstHubService`)
|
|
2
2
|
|
|
3
|
-
> 세움터(EAIS) 원천의 건축물대장
|
|
3
|
+
> 세움터(EAIS) 원천의 건축물대장 통합 Open API. 표제부·총괄표제부·층별개요·부속지번·전유공용면적·주택가격·소유자현황·기본개요 등 **8개 오퍼레이션** 제공.
|
|
4
4
|
|
|
5
|
-
- **data.go.kr 페이지**: https://www.data.go.kr/data/
|
|
5
|
+
- **data.go.kr 페이지**: https://www.data.go.kr/data/15134735/openapi.do
|
|
6
|
+
- 구버전 `1613000/BldRgstService_v2` (ID 15044713) 는 본 허브 서비스로 통합·승격됨. 신규 사용자는 본 허브 서비스로 활용신청.
|
|
6
7
|
- **원천**: 국토교통부 세움터 DB
|
|
7
8
|
- **비용**: 무료 (활용신청 후 개발 1만건/일)
|
|
8
9
|
|
|
@@ -35,7 +36,7 @@ PNU 조회 방법:
|
|
|
35
36
|
|
|
36
37
|
**예시**
|
|
37
38
|
```
|
|
38
|
-
operationRef: 1613000/
|
|
39
|
+
operationRef: 1613000/BldRgstHubService.getBrTitleInfo
|
|
39
40
|
params: { sigunguCd: "11680", bjdongCd: "10300", bun: "823" }
|
|
40
41
|
```
|
|
41
42
|
|
|
@@ -100,7 +101,7 @@ params: { sigunguCd: "11680", bjdongCd: "10300", bun: "823" }
|
|
|
100
101
|
"task": "data-go-kr-call",
|
|
101
102
|
"connection": "data-go-kr",
|
|
102
103
|
"params": {
|
|
103
|
-
"operationRef": "1613000/
|
|
104
|
+
"operationRef": "1613000/BldRgstHubService.getBrTitleInfo",
|
|
104
105
|
"params": { "sigunguCd": "...", "bjdongCd": "...", "bun": "..." }
|
|
105
106
|
}
|
|
106
107
|
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# 기상청 (KMA) 조회 서비스 묶음
|
|
2
|
+
|
|
3
|
+
기상청 산하 5개 조회 서비스. 모두 기관코드 `1360000` 산하 data.go.kr Open API.
|
|
4
|
+
|
|
5
|
+
| 서비스 | serviceId | 데이터셋 ID |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| 단기예보 (동네예보 + 초단기) | `1360000/VilageFcstInfoService_2.0` | 15084084 |
|
|
8
|
+
| 중기예보 (3~10일) | `1360000/MidFcstInfoService` | 15059468 |
|
|
9
|
+
| 기상특보 | `1360000/WthrWrnInfoService` | 15059092 |
|
|
10
|
+
| 종관기상관측 (ASOS, 시간자료) | `1360000/AsosHourlyInfoService` | 15057210 |
|
|
11
|
+
| 방재기상관측 (AWS, 시간자료) | `1360000/AwsHrInfoService` | 15059093 |
|
|
12
|
+
|
|
13
|
+
대부분의 KMA 서비스가 **하나의 ServiceKey** 로 호출 가능하지만, 데이터셋별로 활용신청을 따로 해야 하는 경우가 있습니다. 마이페이지에서 각 데이터셋의 신청 상태 확인 필요.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. 단기예보 (`VilageFcstInfoService_2.0`)
|
|
18
|
+
|
|
19
|
+
| 오퍼레이션 | 설명 | 발표시각 |
|
|
20
|
+
| --- | --- | --- |
|
|
21
|
+
| `getVilageFcst` | 동네예보 (3일치, 3시간 간격) | 02·05·08·11·14·17·20·23시 (+10분) |
|
|
22
|
+
| `getUltraSrtFcst` | 초단기예보 (6시간) | 매시각 (+45분) |
|
|
23
|
+
| `getUltraSrtNcst` | 초단기실황 (현재 관측) | 매시각 (+10분) |
|
|
24
|
+
|
|
25
|
+
공통 파라미터: `base_date`(YYYYMMDD), `base_time`(HHMM), `nx`, `ny` (KMA 5km 격자좌표).
|
|
26
|
+
|
|
27
|
+
**위경도 → 격자**: `latLonToGrid({ latitude, longitude })` 헬퍼 사용 (export 됨). 또는 전용 태스크 [`data-go-kr-weather-short-term-forecast`](../task/weather-short-term-forecast.md) 가 위경도 입력을 자동 변환.
|
|
28
|
+
|
|
29
|
+
## 2. 중기예보 (`MidFcstInfoService`)
|
|
30
|
+
|
|
31
|
+
| 오퍼레이션 | 설명 |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| `getMidFcst` | 중기 전망 (텍스트 해석본) |
|
|
34
|
+
| `getMidLandFcst` | 육상 중기예보 (강수확률·하늘상태) |
|
|
35
|
+
| `getMidTa` | 중기 기온예보 (아침 최저·낮 최고) |
|
|
36
|
+
| `getMidSeaFcst` | 해상 중기예보 |
|
|
37
|
+
|
|
38
|
+
공통 파라미터: `regId` (광역 권역 코드), `tmFc` (발표시각 YYYYMMDDHHMM, 06·18시 발표).
|
|
39
|
+
|
|
40
|
+
## 3. 기상특보 (`WthrWrnInfoService`)
|
|
41
|
+
|
|
42
|
+
| 오퍼레이션 | 설명 |
|
|
43
|
+
| --- | --- |
|
|
44
|
+
| `getWthrWrnList` | 특보 목록 |
|
|
45
|
+
| `getWthrWrnInfo` | 특보 상세 (발표문 본문) |
|
|
46
|
+
|
|
47
|
+
공통 파라미터: `stnId`(지점 ID, 전국=108), `fromTmFc`/`toTmFc`(YYYYMMDD).
|
|
48
|
+
|
|
49
|
+
## 4. 종관기상관측 (`AsosHourlyInfoService`)
|
|
50
|
+
|
|
51
|
+
| 오퍼레이션 | 설명 |
|
|
52
|
+
| --- | --- |
|
|
53
|
+
| `getWthrDataList` | 시간단위 관측 자료 |
|
|
54
|
+
|
|
55
|
+
파라미터: `dataCd='ASOS'`, `dateCd='HR'`, `startDt`/`startHh`/`endDt`/`endHh`, `stnIds`(서울=108, 부산=159 등).
|
|
56
|
+
|
|
57
|
+
## 5. 방재기상관측 (`AwsHrInfoService`)
|
|
58
|
+
|
|
59
|
+
| 오퍼레이션 | 설명 |
|
|
60
|
+
| --- | --- |
|
|
61
|
+
| `getAwsRltmList` | AWS 시간자료 |
|
|
62
|
+
|
|
63
|
+
파라미터: `tm`(YYYYMMDDHHMM), `stn`(지점 번호, 생략 시 전국).
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 호출 방법
|
|
68
|
+
|
|
69
|
+
전용 태스크가 제공되지 않는 오퍼레이션은 모두 [`data-go-kr-call`](../task/data-go-kr-call.md) 로 호출:
|
|
70
|
+
|
|
71
|
+
```jsonc
|
|
72
|
+
{
|
|
73
|
+
"task": "data-go-kr-call",
|
|
74
|
+
"connection": "data-go-kr",
|
|
75
|
+
"params": {
|
|
76
|
+
"operationRef": "1360000/MidFcstInfoService.getMidLandFcst",
|
|
77
|
+
"params": { "regId": "11B00000", "tmFc": "202604250600" }
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
단기예보(`getVilageFcst`)는 자주 쓰이고 격자 변환이 필요하므로 **전용 태스크** [`data-go-kr-weather-short-term-forecast`](../task/weather-short-term-forecast.md) 사용 권장.
|
|
@@ -16,7 +16,31 @@ PNU(필지고유번호) 5요소로 조회:
|
|
|
16
16
|
| `bun` | O | 본번 (자동 4자리 zero-pad) | `223` |
|
|
17
17
|
| `ji` | △ | 부번 (없으면 `0`, 자동 4자리 zero-pad) | `0` |
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
## 데이터 바인딩
|
|
20
|
+
|
|
21
|
+
각 입력 필드에 **JS 템플릿 리터럴 문법** `${...}` 으로 이전 step 결과나 변수를 참조할 수 있습니다 (Things-Factory `evaluateTemplate` 표준).
|
|
22
|
+
|
|
23
|
+
| 표현식 | 의미 |
|
|
24
|
+
| --- | --- |
|
|
25
|
+
| `${data.<path>}` | 직전 step 의 출력 (예: `${data.pnu.sigunguCd}`) |
|
|
26
|
+
| `${variables.<name>}` | 시나리오 시작 시 주입된 변수 |
|
|
27
|
+
| `${user.email}` / `${domain.subdomain}` | 실행 컨텍스트 |
|
|
28
|
+
| `${data.pnu.bun}-${data.pnu.ji}` | 일반 문자열 + 표현식 혼합 |
|
|
29
|
+
| `${Number(data.items[0].totArea) || 0}` | 임의 JS 표현식 가능 |
|
|
30
|
+
|
|
31
|
+
> ⚠️ `{{...}}` 문법이 **아닙니다**. JS 백틱 템플릿 리터럴 그대로의 `${...}` 입니다.
|
|
32
|
+
|
|
33
|
+
### 예시 — juso-resolve-address 와 체이닝
|
|
34
|
+
|
|
35
|
+
이전 step 의 출력 (`{ pnu: {...} }`) 을 본 task 입력에 바인딩:
|
|
36
|
+
|
|
37
|
+
| 필드 | 값 |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| `sigunguCd` | `${data.pnu.sigunguCd}` |
|
|
40
|
+
| `bjdongCd` | `${data.pnu.bjdongCd}` |
|
|
41
|
+
| `platGbCd` | `${data.pnu.platGbCd}` |
|
|
42
|
+
| `bun` | `${data.pnu.bun}` |
|
|
43
|
+
| `ji` | `${data.pnu.ji}` |
|
|
20
44
|
|
|
21
45
|
## 출력
|
|
22
46
|
|
|
@@ -6,14 +6,41 @@
|
|
|
6
6
|
|
|
7
7
|
| 이름 | 필수 | 설명 | 예시 |
|
|
8
8
|
| --- | --- | --- | --- |
|
|
9
|
-
| `operationRef` | O |
|
|
10
|
-
| `params` | △ |
|
|
9
|
+
| `operationRef` | O | 등록된 모든 오퍼레이션이 **드롭다운**으로 표시됨. 직접 입력도 가능 (스펙 없는 오퍼레이션 호출 시) | `1613000/BldRgstHubService.getBrTitleInfo` |
|
|
10
|
+
| `params` | △ | 해당 오퍼레이션의 파라미터를 JSON 객체로 입력 | `{ "sigunguCd": "11680", "bjdongCd": "10300", "bun": "223" }` |
|
|
11
11
|
|
|
12
12
|
`operationRef` 가 **등록된 스펙** 을 가리키면:
|
|
13
13
|
- 필수 파라미터 검증 / 기본값 주입 / zero-pad / 길이 검증 / enum 검증이 자동 적용
|
|
14
14
|
- 실패 시 친절한 에러 메시지 (어떤 파라미터가 왜 실패했는지)
|
|
15
15
|
|
|
16
|
-
스펙에 **없는 오퍼레이션** 도 호출 가능 (검증 스킵). 새 서비스가 추가되어 아직 스펙이 없어도 즉시
|
|
16
|
+
스펙에 **없는 오퍼레이션** 도 호출 가능 (검증 스킵). 새 서비스가 추가되어 아직 스펙이 없어도 직접 입력으로 즉시 호출 가능.
|
|
17
|
+
|
|
18
|
+
### 데이터 바인딩
|
|
19
|
+
|
|
20
|
+
`params` 객체의 각 값은 **JS 템플릿 리터럴 `${...}`** 표현식 지원. 예:
|
|
21
|
+
|
|
22
|
+
```jsonc
|
|
23
|
+
{
|
|
24
|
+
"operationRef": "1613000/BldRgstHubService.getBrTitleInfo",
|
|
25
|
+
"params": {
|
|
26
|
+
"sigunguCd": "${data.pnu.sigunguCd}",
|
|
27
|
+
"bjdongCd": "${data.pnu.bjdongCd}",
|
|
28
|
+
"bun": "${data.pnu.bun}",
|
|
29
|
+
"ji": "${data.pnu.ji}"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`{{...}}` 가 **아닙니다**. JS 백틱 템플릿 리터럴 그대로의 `${...}` 표현식.
|
|
35
|
+
|
|
36
|
+
### ⚠️ 현재 UX 한계
|
|
37
|
+
|
|
38
|
+
`params` 필드는 현재 **freeform JSON** 으로 받습니다. 선택한 `operationRef` 에 맞춰 폼이 자동 생성되지 않으니, 어떤 키를 써야 하는지는 **서비스 카탈로그 markdown** 또는 코드의 `OperationSpec.params` 를 참고해야 합니다:
|
|
39
|
+
|
|
40
|
+
- [건축물대장 카탈로그](../services/building-ledger.md)
|
|
41
|
+
- [기상청 카탈로그](../services/weather.md)
|
|
42
|
+
|
|
43
|
+
이 한계는 ROADMAP Phase 3 (`integration-base` upstream 의 동적 parameterSpec 지원) 에서 해결 예정 — 그때부터는 `operationRef` 선택 시 입력 폼이 자동 생성됩니다.
|
|
17
44
|
|
|
18
45
|
## 출력
|
|
19
46
|
|
|
@@ -44,7 +71,7 @@
|
|
|
44
71
|
"task": "data-go-kr-call",
|
|
45
72
|
"connection": "data-go-kr",
|
|
46
73
|
"params": {
|
|
47
|
-
"operationRef": "1613000/
|
|
74
|
+
"operationRef": "1613000/BldRgstHubService.getBrTitleInfo",
|
|
48
75
|
"params": {
|
|
49
76
|
"sigunguCd": "11680",
|
|
50
77
|
"bjdongCd": "10300",
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# data-go-kr-weather-short-term-forecast
|
|
2
|
+
|
|
3
|
+
기상청 단기예보(`getVilageFcst`) 조회 전용 태스크. KMA 격자좌표(nx, ny) 또는 위경도 입력을 받아 동네예보(3일치, 3시간 간격) items 를 반환한다.
|
|
4
|
+
|
|
5
|
+
## 입력 파라미터
|
|
6
|
+
|
|
7
|
+
| 이름 | 필수 | 설명 |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| `baseDate` | O | 발표일자 YYYYMMDD |
|
|
10
|
+
| `baseTime` | O | 발표시각 HHMM. **단기예보 발표시각**: 0200·0500·0800·1100·1400·1700·2000·2300 (+10분 후 제공) |
|
|
11
|
+
| `nx`, `ny` | △ | KMA 5km 격자좌표. 위경도와 둘 중 하나 필수 |
|
|
12
|
+
| `latitude`, `longitude` | △ | 위경도 (입력 시 자동으로 nx/ny 로 변환) |
|
|
13
|
+
| `numOfRows` | △ | 페이지당 결과수. 기본 1000 (3일치 카테고리×시점 합계 약 800+) |
|
|
14
|
+
| `pageNo` | △ | 페이지 번호. 기본 1 |
|
|
15
|
+
|
|
16
|
+
`(nx, ny)` 와 `(latitude, longitude)` 둘 다 비어있으면 에러. 둘 다 있으면 `(nx, ny)` 우선.
|
|
17
|
+
|
|
18
|
+
### 데이터 바인딩
|
|
19
|
+
|
|
20
|
+
모든 필드는 **JS 템플릿 리터럴 `${...}`** 으로 이전 step 결과나 변수를 참조 가능. 예:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
latitude: ${data.coord.latitude}
|
|
24
|
+
longitude: ${data.coord.longitude}
|
|
25
|
+
baseDate: ${(new Date()).toISOString().slice(0,10).replace(/-/g,'')}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`{{...}}` 가 **아닙니다**. JS 백틱 템플릿 리터럴 그대로의 `${...}` 표현식.
|
|
29
|
+
|
|
30
|
+
## 출력
|
|
31
|
+
|
|
32
|
+
```jsonc
|
|
33
|
+
{
|
|
34
|
+
"items": [
|
|
35
|
+
{
|
|
36
|
+
"baseDate": "20260425",
|
|
37
|
+
"baseTime": "1100",
|
|
38
|
+
"category": "TMP", // 카테고리 코드
|
|
39
|
+
"fcstDate": "20260425",
|
|
40
|
+
"fcstTime": "1200",
|
|
41
|
+
"fcstValue": "23", // 예보값
|
|
42
|
+
"nx": 60,
|
|
43
|
+
"ny": 127
|
|
44
|
+
}
|
|
45
|
+
/* (카테고리×시점) 조합으로 약 800+ 건 */
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 주요 카테고리 코드
|
|
51
|
+
|
|
52
|
+
| 코드 | 항목 | 단위 |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| TMP | 1시간 기온 | °C |
|
|
55
|
+
| TMN | 일 최저기온 | °C |
|
|
56
|
+
| TMX | 일 최고기온 | °C |
|
|
57
|
+
| POP | 강수확률 | % |
|
|
58
|
+
| PTY | 강수형태 | 0=없음 / 1=비 / 2=비/눈 / 3=눈 / 4=소나기 |
|
|
59
|
+
| PCP | 1시간 강수량 | mm |
|
|
60
|
+
| SNO | 1시간 신적설 | cm |
|
|
61
|
+
| REH | 습도 | % |
|
|
62
|
+
| SKY | 하늘상태 | 1=맑음 / 3=구름많음 / 4=흐림 |
|
|
63
|
+
| WSD | 풍속 | m/s |
|
|
64
|
+
| VEC | 풍향 | deg |
|
|
65
|
+
|
|
66
|
+
## 위경도 → 격자 변환
|
|
67
|
+
|
|
68
|
+
태스크 내부에서 KMA 표준 변환식 (Lambert Conformal Conic) 적용. 모듈 export `latLonToGrid` 를 직접 import 하여 사용 가능:
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
import { latLonToGrid } from '@things-factory/integration-data-go-kr'
|
|
72
|
+
|
|
73
|
+
const { nx, ny } = latLonToGrid({ latitude: 37.5665, longitude: 126.9780 })
|
|
74
|
+
// 서울시청 → { nx: 60, ny: 127 }
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 다른 단기예보 오퍼레이션 호출
|
|
78
|
+
|
|
79
|
+
`getUltraSrtFcst` (초단기예보), `getUltraSrtNcst` (초단기실황) 은 동일 서비스 내에 있으므로 [`data-go-kr-call`](./data-go-kr-call.md) 로 호출하세요. 발표시각 규칙이 다르니 [서비스 카탈로그](../services/weather.md) 참조.
|
|
80
|
+
|
|
81
|
+
```jsonc
|
|
82
|
+
{
|
|
83
|
+
"task": "data-go-kr-call",
|
|
84
|
+
"connection": "data-go-kr",
|
|
85
|
+
"params": {
|
|
86
|
+
"operationRef": "1360000/VilageFcstInfoService_2.0.getUltraSrtNcst",
|
|
87
|
+
"params": { "base_date": "20260425", "base_time": "1100", "nx": "60", "ny": "127" }
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 관련
|
|
93
|
+
|
|
94
|
+
- [`data-go-kr-connector`](../connector/data-go-kr-connector.md)
|
|
95
|
+
- [`data-go-kr-call`](./data-go-kr-call.md)
|
|
96
|
+
- [기상청 서비스 카탈로그](../services/weather.md)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"keep": {
|
|
3
|
+
"days": true,
|
|
4
|
+
"amount": 14
|
|
5
|
+
},
|
|
6
|
+
"auditLog": "logs/.5e5d741d8b7784a2fbad65eedc0fd46946aaf6f2-audit.json",
|
|
7
|
+
"files": [
|
|
8
|
+
{
|
|
9
|
+
"date": 1777076185165,
|
|
10
|
+
"name": "logs/connections-2026-04-25-09.log",
|
|
11
|
+
"hash": "e3a2bbfa80736f8ffb8cb0effb0f787d4c97d7a571ab5ed50feba08ea9c75b05"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"hashType": "sha256"
|
|
15
|
+
}
|
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/integration-data-go-kr",
|
|
3
|
-
"version": "10.0.0-beta.
|
|
3
|
+
"version": "10.0.0-beta.63",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"things-factory": true,
|
|
6
6
|
"author": "heartyoh <heartyoh@hatiolab.com>",
|
|
@@ -24,5 +24,5 @@
|
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@things-factory/integration-base": "^10.0.0-beta.57"
|
|
26
26
|
},
|
|
27
|
-
"gitHead": "
|
|
27
|
+
"gitHead": "fd00344470c9d3d25275d9a3e6da227f5b80539e"
|
|
28
28
|
}
|
|
@@ -32,13 +32,13 @@ export class DataGoKrClient {
|
|
|
32
32
|
/* Encoding 키(%2B 포함)를 붙여넣어도 Decoding 키처럼 동작하도록 정규화.
|
|
33
33
|
base64 키는 `%` 를 포함하지 않으므로 raw Decoding 키는 영향 없음. */
|
|
34
34
|
this.serviceKey = normalizeServiceKey(options.serviceKey.trim())
|
|
35
|
-
this.origin = (options.origin
|
|
35
|
+
this.origin = resolveOrigin(options.origin)
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
39
|
* 범용 GET 호출.
|
|
40
40
|
*
|
|
41
|
-
* @param servicePath `<agency>/<service>/<operation>` (예: `1613000/
|
|
41
|
+
* @param servicePath `<agency>/<service>/<operation>` (예: `1613000/BldRgstHubService/getBrTitleInfo`)
|
|
42
42
|
* @param params 쿼리 파라미터 (serviceKey / _type 은 자동 추가)
|
|
43
43
|
*/
|
|
44
44
|
async get<T>(servicePath: string, params: Record<string, any>): Promise<DataGoKrResponse<T>> {
|
|
@@ -114,6 +114,30 @@ export class DataGoKrClient {
|
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
+
/**
|
|
118
|
+
* Connection.endpoint 값을 검증하여 유효한 origin URL 로 정규화한다.
|
|
119
|
+
*
|
|
120
|
+
* - 비어있거나 공백만: 기본 오리진 사용
|
|
121
|
+
* - 유효한 절대 URL: trailing slash 제거 후 사용
|
|
122
|
+
* - 유효하지 않은 값: 친절한 에러 throw (단순 오타·누락 방지)
|
|
123
|
+
*/
|
|
124
|
+
function resolveOrigin(value: string | undefined): string {
|
|
125
|
+
if (!value || !value.trim()) return DEFAULT_ORIGIN
|
|
126
|
+
const trimmed = value.trim()
|
|
127
|
+
try {
|
|
128
|
+
const parsed = new URL(trimmed)
|
|
129
|
+
if (!parsed.protocol.startsWith('http')) {
|
|
130
|
+
throw new Error('protocol must be http or https')
|
|
131
|
+
}
|
|
132
|
+
return trimmed.replace(/\/$/, '')
|
|
133
|
+
} catch (err) {
|
|
134
|
+
throw new Error(
|
|
135
|
+
`Invalid Connection.endpoint value '${value}': must be a full URL (예: https://apis.data.go.kr) ` +
|
|
136
|
+
`or empty (기본값 ${DEFAULT_ORIGIN} 사용). Reason: ${(err as Error).message}`
|
|
137
|
+
)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
117
141
|
/** Encoding 키(%2B) 를 붙여넣어도 Decoding 키로 정규화. */
|
|
118
142
|
function normalizeServiceKey(key: string): string {
|
|
119
143
|
if (!key.includes('%')) return key
|
|
@@ -8,8 +8,9 @@ import { DataGoKrClient } from './data-go-kr-client'
|
|
|
8
8
|
* 하나의 ServiceKey 로 data.go.kr 산하 **모든 오퍼레이션** 을 호출할 수 있으므로,
|
|
9
9
|
* 사용자는 Connection 을 보통 한 개만 만들고 (앱·법인별로 1개) 여러 태스크에서 재사용한다.
|
|
10
10
|
*
|
|
11
|
-
* Connection 의 `endpoint`
|
|
12
|
-
*
|
|
11
|
+
* Connection 의 `endpoint` 필드를 API 오리진(host) 으로 사용한다. 비워두면 기본값
|
|
12
|
+
* `https://apis.data.go.kr` 가 사용되며, 모의 서버/사설 프록시로 라우팅하려면
|
|
13
|
+
* 해당 오리진을 endpoint 에 입력한다.
|
|
13
14
|
*/
|
|
14
15
|
export interface DataGoKrConnectionInstance {
|
|
15
16
|
client: DataGoKrClient
|
|
@@ -22,15 +23,17 @@ export class DataGoKrConnector implements Connector {
|
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
async connect(connection) {
|
|
25
|
-
const { params } = connection
|
|
26
|
+
const { endpoint, params } = connection
|
|
26
27
|
try {
|
|
27
28
|
const client = new DataGoKrClient({
|
|
28
29
|
serviceKey: params.serviceKey,
|
|
29
|
-
origin:
|
|
30
|
+
origin: endpoint
|
|
30
31
|
})
|
|
31
32
|
const instance: DataGoKrConnectionInstance = { client }
|
|
32
33
|
ConnectionManager.addConnectionInstance(connection, instance)
|
|
33
|
-
ConnectionManager.logger.info(
|
|
34
|
+
ConnectionManager.logger.info(
|
|
35
|
+
`data-go-kr-connector connection(${connection.name}) is connected (endpoint: ${endpoint || '(default)'})`
|
|
36
|
+
)
|
|
34
37
|
} catch (ex) {
|
|
35
38
|
ConnectionManager.logger.error(`data-go-kr-connector connection(${connection.name}) failed`, ex)
|
|
36
39
|
throw ex
|
|
@@ -49,12 +52,6 @@ export class DataGoKrConnector implements Connector {
|
|
|
49
52
|
name: 'serviceKey',
|
|
50
53
|
label: 'label.service-key',
|
|
51
54
|
useDomainAttribute: true
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
type: 'string',
|
|
55
|
-
name: 'origin',
|
|
56
|
-
label: 'label.api-origin',
|
|
57
|
-
placeholder: 'https://apis.data.go.kr'
|
|
58
55
|
}
|
|
59
56
|
]
|
|
60
57
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { OperationParamSpec, ServiceSpec } from '
|
|
1
|
+
import { OperationParamSpec, ServiceSpec } from '../types'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* PNU 5요소 파라미터 스펙 —
|
|
4
|
+
* PNU 5요소 파라미터 스펙 — BldRgstHubService 의 모든 오퍼레이션이 공유.
|
|
5
5
|
* 별도 배열 분리로 작성해두면 타 서비스(예: 건축물대장 허브) 도 재사용 가능.
|
|
6
6
|
*/
|
|
7
7
|
const pnuParams: OperationParamSpec[] = [
|
|
@@ -53,18 +53,21 @@ const pnuParams: OperationParamSpec[] = [
|
|
|
53
53
|
]
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
|
-
* 국토교통부_
|
|
56
|
+
* 국토교통부_건축물대장 허브 서비스 (data.go.kr 데이터셋 15134735).
|
|
57
57
|
*
|
|
58
|
-
* 세움터(EAIS) DB 를 원천으로 하는 공공 건축물대장 Open API.
|
|
58
|
+
* 세움터(EAIS) DB 를 원천으로 하는 공공 건축물대장 통합 Hub Open API.
|
|
59
59
|
* 모든 오퍼레이션은 동일한 PNU(필지고유번호) 구성요소로 조회한다:
|
|
60
60
|
* - sigunguCd (5) + bjdongCd (5) + platGbCd (1) + bun (4) + ji (4)
|
|
61
|
+
*
|
|
62
|
+
* 구버전 `BldRgstService_v2` (`1613000/BldRgstService_v2/`) 는 본 허브 서비스로
|
|
63
|
+
* 사실상 통합·승격되었다. 신규 사용자는 허브 서비스 활용신청을 권장.
|
|
61
64
|
*/
|
|
62
|
-
export const
|
|
63
|
-
serviceId: '1613000/
|
|
64
|
-
label: '국토교통부_
|
|
65
|
+
export const BldRgstHubService: ServiceSpec = {
|
|
66
|
+
serviceId: '1613000/BldRgstHubService',
|
|
67
|
+
label: '국토교통부_건축물대장 허브 서비스',
|
|
65
68
|
description:
|
|
66
69
|
'세움터(EAIS) 원천의 건축물대장 정보를 조회한다. 표제부·총괄표제부·층별개요·부속지번·전유공용면적·주택가격·소유자현황·기본개요 등 8개 오퍼레이션 제공.',
|
|
67
|
-
homepage: 'https://www.data.go.kr/data/
|
|
70
|
+
homepage: 'https://www.data.go.kr/data/15134735/openapi.do',
|
|
68
71
|
operations: {
|
|
69
72
|
getBrTitleInfo: {
|
|
70
73
|
operationId: 'getBrTitleInfo',
|
|
@@ -74,7 +77,7 @@ export const BldRgstServiceV2: ServiceSpec = {
|
|
|
74
77
|
params: [...pnuParams],
|
|
75
78
|
responseNotes:
|
|
76
79
|
'응답 `response.body.items.item` 이 배열 또는 단일 객체로 올 수 있음. 모든 숫자 필드가 문자열(`"114000.00"`)로 내려옴. 집합건축물은 `regstrKindCd=3`, 일반건축물은 `regstrKindCd=2`.',
|
|
77
|
-
externalDocsUrl: 'https://www.data.go.kr/data/
|
|
80
|
+
externalDocsUrl: 'https://www.data.go.kr/data/15134735/openapi.do',
|
|
78
81
|
examples: [
|
|
79
82
|
{
|
|
80
83
|
label: '서울 강남구 역삼동 823',
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { OperationSpec, ServiceSpec, parseOperationRef } from './types'
|
|
2
|
-
import { BldRgstServiceV2 } from './building-ledger'
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
/* 도메인별 서비스 스펙 — 새 도메인 추가 시 폴더 추가 + 본 import 한 줄 */
|
|
4
|
+
import * as buildingLedger from './building-ledger'
|
|
5
|
+
import * as weather from './weather'
|
|
6
|
+
|
|
5
7
|
export * from './types'
|
|
8
|
+
export * from './building-ledger'
|
|
9
|
+
export * from './weather'
|
|
6
10
|
|
|
7
11
|
const services = new Map<string, ServiceSpec>()
|
|
8
12
|
|
|
@@ -10,7 +14,24 @@ function registerService(spec: ServiceSpec) {
|
|
|
10
14
|
services.set(spec.serviceId, spec)
|
|
11
15
|
}
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
/* 도메인 모듈에서 export 된 모든 ServiceSpec 인스턴스를 자동 등록.
|
|
18
|
+
추가 도메인 import 만 늘리면 이하 코드는 그대로. */
|
|
19
|
+
function registerDomain(domain: Record<string, unknown>) {
|
|
20
|
+
for (const value of Object.values(domain)) {
|
|
21
|
+
if (isServiceSpec(value)) registerService(value)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function isServiceSpec(value: unknown): value is ServiceSpec {
|
|
25
|
+
return (
|
|
26
|
+
typeof value === 'object' &&
|
|
27
|
+
value !== null &&
|
|
28
|
+
typeof (value as any).serviceId === 'string' &&
|
|
29
|
+
typeof (value as any).operations === 'object'
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
registerDomain(buildingLedger)
|
|
34
|
+
registerDomain(weather)
|
|
14
35
|
|
|
15
36
|
export const SpecRegistry = {
|
|
16
37
|
/** 등록된 모든 서비스 스펙을 반환. */
|
|
@@ -56,9 +56,9 @@ export interface OperationSpec {
|
|
|
56
56
|
|
|
57
57
|
/** 서비스 스펙 (오퍼레이션 묶음). */
|
|
58
58
|
export interface ServiceSpec {
|
|
59
|
-
/** 서비스 경로 (예: `1613000/
|
|
59
|
+
/** 서비스 경로 (예: `1613000/BldRgstHubService`). */
|
|
60
60
|
serviceId: string
|
|
61
|
-
/** 화면 라벨 (예: '국토교통부_
|
|
61
|
+
/** 화면 라벨 (예: '국토교통부_건축물대장 허브 서비스'). */
|
|
62
62
|
label: string
|
|
63
63
|
/** 사람이 읽는 설명. */
|
|
64
64
|
description: string
|
|
@@ -72,7 +72,7 @@ export interface ServiceSpec {
|
|
|
72
72
|
* 오퍼레이션 참조 문자열 파서.
|
|
73
73
|
*
|
|
74
74
|
* 레지스트리 조회 키: `"<serviceId>.<operationId>"` — 점으로 구분.
|
|
75
|
-
* 예: `"1613000/
|
|
75
|
+
* 예: `"1613000/BldRgstHubService.getBrTitleInfo"`
|
|
76
76
|
*/
|
|
77
77
|
export function parseOperationRef(ref: string): { serviceId: string; operationId: string } | null {
|
|
78
78
|
const idx = ref.lastIndexOf('.')
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { OperationParamSpec, ServiceSpec } from '../types'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 기상청_종관기상관측 시간자료 (ASOS) (data.go.kr 데이터셋 15057210).
|
|
5
|
+
*
|
|
6
|
+
* 지상 종관기상관측 (Automated Surface Observing System) 의 시간단위 관측 자료.
|
|
7
|
+
* 전국 약 100개 지점에서 표준화된 정밀 관측. 기온·강수량·풍향풍속·습도·기압 등.
|
|
8
|
+
*/
|
|
9
|
+
const params: OperationParamSpec[] = [
|
|
10
|
+
{ name: 'dataCd', required: true, description: "자료 코드. 'ASOS' 고정.", example: 'ASOS' },
|
|
11
|
+
{ name: 'dateCd', required: true, description: "자료 단위. 시간자료='HR'.", example: 'HR' },
|
|
12
|
+
{ name: 'startDt', required: true, length: 8, description: '검색 시작일 YYYYMMDD', example: '20260420' },
|
|
13
|
+
{ name: 'startHh', required: true, length: 2, description: '검색 시작시 HH', example: '00' },
|
|
14
|
+
{ name: 'endDt', required: true, length: 8, description: '검색 종료일 YYYYMMDD', example: '20260425' },
|
|
15
|
+
{ name: 'endHh', required: true, length: 2, description: '검색 종료시 HH', example: '23' },
|
|
16
|
+
{ name: 'stnIds', required: true, description: 'KMA ASOS 지점 코드. 서울=108, 부산=159 등.', example: '108' }
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
export const KmaAsosHourlyService: ServiceSpec = {
|
|
20
|
+
serviceId: '1360000/AsosHourlyInfoService',
|
|
21
|
+
label: '기상청_종관기상관측 시간자료 (ASOS)',
|
|
22
|
+
description: '지상 종관기상관측(ASOS) 의 시간단위 관측 자료.',
|
|
23
|
+
homepage: 'https://www.data.go.kr/data/15057210/openapi.do',
|
|
24
|
+
operations: {
|
|
25
|
+
getWthrDataList: {
|
|
26
|
+
operationId: 'getWthrDataList',
|
|
27
|
+
label: '시간자료 조회',
|
|
28
|
+
description: '특정 지점·기간의 시간단위 관측 데이터.',
|
|
29
|
+
params
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { OperationParamSpec, ServiceSpec } from '../types'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 기상청_방재기상관측 시간자료 (AWS) (data.go.kr 데이터셋 15059093).
|
|
5
|
+
*
|
|
6
|
+
* 자동기상관측장비(AWS) 의 시간단위 관측 자료. ASOS 보다 조밀한 격자 (전국 500+ 지점).
|
|
7
|
+
* 강수·기온·풍향풍속·습도 등을 시간 단위로 제공.
|
|
8
|
+
*/
|
|
9
|
+
const params: OperationParamSpec[] = [
|
|
10
|
+
{ name: 'tm', required: true, length: 12, description: '관측 시각 YYYYMMDDHHMM', example: '202604251200' },
|
|
11
|
+
{ name: 'stn', description: '지점 번호 (생략 시 전국).', example: '108' }
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
export const KmaAwsHourlyService: ServiceSpec = {
|
|
15
|
+
serviceId: '1360000/AwsHrInfoService',
|
|
16
|
+
label: '기상청_방재기상관측 시간자료 (AWS)',
|
|
17
|
+
description: '자동기상관측장비(AWS) 의 시간단위 관측 자료. ASOS 대비 조밀한 격자.',
|
|
18
|
+
homepage: 'https://www.data.go.kr/data/15059093/openapi.do',
|
|
19
|
+
operations: {
|
|
20
|
+
getAwsRltmList: {
|
|
21
|
+
operationId: 'getAwsRltmList',
|
|
22
|
+
label: 'AWS 시간자료 조회',
|
|
23
|
+
description: 'AWS 지점의 시간단위 관측 자료. 강수·기온·풍향풍속·습도 등.',
|
|
24
|
+
params
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 기상청(KMA) 도메인 서비스 스펙 묶음.
|
|
3
|
+
*
|
|
4
|
+
* 새 KMA 서비스(예: 황사·자외선·미세먼지·해양 등) 추가 시:
|
|
5
|
+
* 1. 본 폴더에 `<service-slug>.ts` 파일을 만들어 ServiceSpec export
|
|
6
|
+
* 2. 본 index 의 export 와 (필요 시) 외부 SpecRegistry 등록만 추가
|
|
7
|
+
*
|
|
8
|
+
* 한 파일에 여러 서비스를 합치지 말 것 — 확장성 보호.
|
|
9
|
+
*/
|
|
10
|
+
export { KmaShortTermForecastService } from './short-term-forecast'
|
|
11
|
+
export { KmaMidTermForecastService } from './mid-term-forecast'
|
|
12
|
+
export { KmaWeatherWarningService } from './warning'
|
|
13
|
+
export { KmaAsosHourlyService } from './asos'
|
|
14
|
+
export { KmaAwsHourlyService } from './aws'
|