generated from ttipo/project-base
docs: 공연·전시 출처 조사와 KOPIS 동기화 설계 정리
- 조사 문서: KOPIS·한국문화정보원·대구문화예술진흥원 이용 조건·필드·한도, 사용자 확인(KOPIS 저장·포스터 재사용 가능), 2026-11-03 진단 결과 - place-db.md v1.7: 여러 출처 스키마(§2.4), KOPIS 동기화 순서·좌표 검사·호출량·알려진 한계(§12.1), 다음 출처(§12.2) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+51
-9
@@ -1,7 +1,7 @@
|
||||
# 장소 DB 설계 (v1.5, 2026-11-03)
|
||||
# 장소 DB 설계 (v1.7, 2026-11-03)
|
||||
|
||||
WanderGo 의 장소·축제 데이터를 어떻게 저장하고, 갱신하고, 앱에 노출하는지 정한다.
|
||||
1단계(엔티티·마이그레이션)와 2·3단계(관광공사 국문·반려동물·상가정보 동기화 명령), 중복 병합, 조회 API(§11), 축제·행사 동기화·API(§12)를 구현했다 — `backend/src/modules/place/`, `backend/src/commands/place-sync.ts`, `backend/src/migrations/`.
|
||||
1단계(엔티티·마이그레이션)와 2·3단계(관광공사 국문·반려동물·상가정보 동기화 명령), 중복 병합, 조회 API(§11), 축제·행사 동기화·API와 KOPIS 공연 동기화(§12)를 구현했다 — `backend/src/modules/place/`, `backend/src/commands/place-sync.ts`, `backend/src/migrations/`.
|
||||
이 문서와 코드가 다르면 코드가 기준이다. 바꿀 때는 이 문서도 함께 고친다.
|
||||
|
||||
## 0. 전제 (이미 정한 것)
|
||||
@@ -152,7 +152,7 @@ erDiagram
|
||||
- 한국어는 `place` 본체에 둔다.
|
||||
- 관광공사 영문은 국문과 연결 필드가 없어 **좌표(50m 안) + 분류 코드**로 맞춘다. 맞지 않은 영문 항목은 기록만 하고 붙이지 않는다(첫 적재 때 매칭률을 잰다).
|
||||
|
||||
### 2.4 `festival_event` — 축제·공연·행사
|
||||
### 2.4 `festival_event` — 축제·공연·행사·전시
|
||||
|
||||
| 컬럼 | 설명 |
|
||||
| --- | --- |
|
||||
@@ -164,7 +164,11 @@ erDiagram
|
||||
| `i18n` | jsonb `{en: {name, overview}}` |
|
||||
| `status`, `last_seen_at` | |
|
||||
|
||||
- "60일 넘는 상시 프로그램 제외"는 **조회할 때** 적용한다(저장은 그대로).
|
||||
- "상시 프로그램 제외"는 **조회할 때** 종류별 기간 상한으로 적용한다(저장은 그대로): 축제·공연·행사 60일, 전시 183일(`EVENT_MAX_SPAN_DAYS`).
|
||||
- **여러 출처**(2026-11-03, 마이그레이션 `1793704967449-AddEventSourceAndVenue`): `source`(tour 관광공사 · kopis 공연예술통합전산망 ·
|
||||
kcisa 한국문화정보원 · dgfca 대구문화예술진흥원) + `(source, source_id)` 유니크. 종류에 `exhibition`, 장르(`genre`)·예매 링크(`booking_url`)·
|
||||
공연장(`venue_id` → `event_venue`) 추가. KOPIS 공연은 좌표가 공연장 상세에만 있어 `event_venue`(출처별 시설 id 유니크)에 캐시한다.
|
||||
- 출처별 동기화는 자기 출처 행사만 숨긴다(관광공사 동기화가 KOPIS 공연을 숨기지 않게).
|
||||
|
||||
### 2.5 `place_sync_run` — 동기화 기록
|
||||
|
||||
@@ -234,13 +238,14 @@ erDiagram
|
||||
| 반려동물 | 매주 | `detailPetTour2` contentId 없이 전체(약 9,700건, 10회) → contentid 로 붙임 | 10회 |
|
||||
| 관광공사 영문 | 매주 | 영문 `areaBasedList2` → 좌표+분류로 매칭 → `place_i18n(en)` | |
|
||||
| 상가정보 | 분기 | 대상 행정동 `storeListInDong`(divId=adongCd) × 데이트 업종 → bizesId 로 upsert. **새 스냅샷에 없는 ID → `gone`** | 도심·수성못·앞산 행정동 |
|
||||
| 축제·행사 | 매일 | `searchFestival2`(오늘−60일 ~ 오늘+60일) | |
|
||||
| 축제·행사 | 매일 | `searchFestival2`(오늘 ~ 오늘+90일, 대구+경북) | 대구 1 · 경북 7 (90일) |
|
||||
| KOPIS 공연 | 매일 | `pblprfr`(오늘 ~ 오늘+90일) → 새·바뀐 공연만 상세 → 새 공연장만 시설 상세 | 대구 153 · 경북 91 (90일) |
|
||||
| 폐업 대조 | 분기 | 행안부 인허가(휴게음식점·제과점·일반음식점) 영업상태와 주소·상호로 대조 → `gone` 후보 | 활용신청 후 |
|
||||
|
||||
- 비표출 레코드는 법정동이 비어 있으므로 비표출 확인은 지역 필터 없이 한다(매뉴얼 검토 노트).
|
||||
- 동기화는 `place` 만 쓴다. `place_curation` 은 읽지도 쓰지도 않는다.
|
||||
|
||||
### 4.1 실행 방법 (구현됨: 관광공사 국문·반려동물·상가정보)
|
||||
### 4.1 실행 방법 (구현됨: 관광공사 국문·반려동물·상가정보·축제·KOPIS 공연)
|
||||
|
||||
```bash
|
||||
# 개발 — 키가 있는 백엔드 컨테이너 안에서 (dc = docker compose -f docker-compose.yml -f docker-compose.dev.yml --env-file .env.development)
|
||||
@@ -249,6 +254,7 @@ dc exec backend npm run place:sync -- tour-kor # 대구(27) 목록
|
||||
dc exec backend npm run place:sync -- tour-pet # 반려동물 동반 정보(약 10회)
|
||||
dc exec backend npm run place:sync -- store # 상가정보 데이트 업종(대구 중구·남구·수성구, 30회 안팎). 분기마다
|
||||
dc exec backend npm run place:sync -- event # 축제·공연·행사(대구+경북, 오늘부터 90일 안). 매일. 새로 생기거나 바뀐 행사만 상세
|
||||
dc exec backend npm run place:sync -- kopis # KOPIS 공연(대구+경북, 90일). 매일. KOPIS_SERVICE_KEY 필요. 첫 실행은 상세 250회 안팎(0.6초 간격, 약 4분)
|
||||
dc exec backend npm run place:sync -- dedupe # 같은 가게 병합(키 불필요). tour-kor·store 가 끝날 때도 자동으로 돈다
|
||||
dc exec backend npm run place:sync -- reparse-hours # 저장된 영업시간 원문을 지금의 파서로 다시 해석(키 불필요). 파서를 고친 뒤 한 번
|
||||
dc exec backend npm run place:sync -- status # 적재 현황·오늘 쓴 호출 수
|
||||
@@ -377,6 +383,42 @@ node dist/commands/place-sync.js tour-kor
|
||||
- 홈 '이번 주말 축제·행사' = `from`=토 · `to`=일 · 동네 중심 좌표 · `radius`=120000 → 대구 행사가 먼저, 다음 경북(거리 표시 "대구에서 85km").
|
||||
- **비면** 같은 반경으로 `from`=오늘 · `to`=오늘+30일을 불러 제목을 '다가오는 축제·행사'로 바꿔 보여 준다(빈 칸을 두지 않는다).
|
||||
- 장소 상세 '근처 축제·행사' = 장소 좌표 + 기본 반경(5km), 없으면 칸을 숨긴다.
|
||||
- 다음 보강(조사 예정): 대구는 공연·전시가 많은데 관광공사에는 거의 없다 → 공연예술통합전산망(KOPIS)·문화체육관광부 문화정보 API 의
|
||||
이용 조건(저장 허용·출처 표시·호출 한도)을 확인한 뒤 출처로 추가한다. 운영자 직접 등록은 운영자 화면이 생기면.
|
||||
- 계약 테스트: `backend/test/festival.e2e-spec.ts`(12개) — 2030년 날짜·동해 좌표 픽스처라 실행 날짜와 무관하다.
|
||||
- 계약 테스트: `backend/test/festival.e2e-spec.ts` — 2030년 날짜·동해 좌표 픽스처라 실행 날짜와 무관하다.
|
||||
|
||||
### 12.1 KOPIS 공연 (구현됨)
|
||||
|
||||
**동기화** `place:sync -- kopis [--regions=27,47] [--days=90]` (매일, `KOPIS_SERVICE_KEY` 필요)
|
||||
|
||||
대구는 공연이 많은데 관광공사에는 거의 없다. 그래서 KOPIS 공연예술통합전산망을 공연 출처로 쓴다.
|
||||
조사: `docs/research/pre-dev-check/culture_event_sources.md`. 2026-11-03 사용자 확인: KOPIS 데이터 저장·포스터 재사용 가능.
|
||||
|
||||
- **진단**(2026-11-03, `tools/data-check/culture_api_check.py`)
|
||||
- 90일을 한 번에 조회할 수 있다(31일 제한 없음). https 동작.
|
||||
- 앞으로 90일 공연: 대구 153건(클래식 62 · 대중음악 30 · 뮤지컬 25 · 연극 16 …), 경북 91건.
|
||||
- 목록에는 공연시설 id·좌표·수정일이 없다. 그래서 상세와 시설 상세를 따로 부른다.
|
||||
- 공연시설 좌표는 5곳 중 5곳에 있었다. 다만 1곳(대구 중구 주소)이 경주 좌표였다 → 아래 좌표 검사를 만든 이유.
|
||||
- 순서(`sync/kopis.sync.ts`)
|
||||
1. **목록** `pblprfr`(signgucode, stdate=오늘, eddate=오늘+N일, rows=100). 끝난 공연(`공연완료`)·다른 시·도·중복은 건너뛴다.
|
||||
목록을 끝까지 받았으면 받은 기간 안에서 목록에 없는 공연을 숨긴다(원본 장애 판단은 §4.1).
|
||||
2. **상세** `pblprfr/{mt20id}` — 새 공연, 어제 이후 등록·수정된 공연(목록 `afterdate`), 상세를 받은 지 7일 지난 공연만.
|
||||
요금 `pcseguidance` → `fee_text`, 공연 시간 `dtguidance` → `playtime_text`, 예매처 첫 링크 → `booking_url`,
|
||||
소개 = 줄거리 `sty` + 출연·관람 시간·관람 연령 줄. 장소 이름은 상세가 홀까지 주므로("대구콘서트하우스 (그랜드홀 …)") 상세 값을 쓴다.
|
||||
3. **공연시설** `prfplc/{mt10id}` — 진행 중·예정 공연이 쓰는 시설 중 새 시설과 30일 지난 시설만 → `event_venue`.
|
||||
**좌표는 주소의 시·도 영역 안일 때만 쓴다**(`geo.ts` `isInSido`). 아니면 비우고 경고를 남긴다(그 공연은 근처 조회에서만 빠진다).
|
||||
4. 시설의 좌표·주소·전화를 공연에 복사한다. 조회 API 가 공연 좌표로 거리를 계산하기 때문이다. 시설 좌표를 고치면 다음 실행에 공연도 바뀐다.
|
||||
- 포스터는 `http://www.kopis.or.kr/…` 로 온다. 앱이 http 이미지를 막으므로 `https://kopis.or.kr/…` 로 바꿔 저장한다(목록·상세 사진 모두 포스터).
|
||||
- 호출: 0.6초 간격(KOPIS 는 초당 10회에서 차단). 오퍼레이션별(`pblprfr`·`pblprfr-detail`·`prfplc-detail`) 하루 상한 980.
|
||||
공식 한도는 밝혀져 있지 않다. 이후 하루 호출은 목록 4회 + 상세 수십 회로 예상한다.
|
||||
- 출처 표기: 조회 API 상세의 `attribution.provider` = "(재)예술경영지원센터 공연예술통합전산망(www.kopis.or.kr)".
|
||||
- 검증: `backend/test/kopis-sync.e2e-spec.ts`. 가짜 KOPIS 응답과 실제 DB 로 다음을 확인한다.
|
||||
첫 적재와 시설 좌표 복사, 틀린 좌표 비우기 → 재실행 시 상세·시설 재조회 없음 → 바뀐 공연만 상세 재조회, 없어진 공연 숨김.
|
||||
- 알려진 한계
|
||||
- 관광공사 공연(EV02)과 같은 공연이 둘 다 나올 수 있다. 출처 간 같은 행사 병합은 아직 없다(조사 문서 3-3 의 규칙으로 나중에).
|
||||
- '이번 주말'은 기간이 겹치는지만 본다. 평일만 하는 공연도 섞인다(`dtguidance` 요일 해석은 나중에).
|
||||
- 기간이 60일 넘는 공연(대구 8건)은 상시 프로그램 규칙으로 목록에서 빠진다.
|
||||
|
||||
### 12.2 다음 출처
|
||||
|
||||
- **전시: 한국문화정보원 한눈에보는문화정보**(15138937). 진단 결과 앞으로 90일 대구 42건(전시 13 · 음악/콘서트 17 …), 경북 17건(전시 1)이다. 좌표 채움 38/42.
|
||||
공연은 KOPIS 와 겹치므로 **전시(realm 전시)만** 받을 계획이다. 이미지 이용 조건은 아직 확인하지 않았다(조사 문서 4장 4번).
|
||||
|
||||
|
||||
@@ -0,0 +1,273 @@
|
||||
# 공연·전시 출처 조사 (KOPIS · 한국문화정보원 · 대구) — 2026-11-03
|
||||
|
||||
> 목적: 홈 '이번 주말 축제·행사'에 대구 공연·전시를 채울 공공 API 를 고른다. 관광공사 `searchFestival2` 에는 앞으로 90일 대구 행사가 1건뿐이다(`docs/design/place-db.md` §12).
|
||||
> 전제: 서버가 매일 받아 자체 DB(`festival_event`)에 저장하고 목록·상세·근처(좌표 거리) 조회로 보여 준다. 출처 표시는 할 수 있다. 무료 상업 앱이고 나중에 수익화할 수 있다. 카카오·네이버 데이터는 저장하지 않는다.
|
||||
>
|
||||
> **표기**
|
||||
> - **[확인: URL]** 이번 세션에 원문(페이지·PDF·가이드 문서)을 직접 열어 확인했다.
|
||||
> - **[확인(검색 요약): URL]** KOPIS 사이트는 JS 렌더링이라 본문을 직접 읽지 못했다. 검색 엔진이 그 공식 페이지에서 뽑은 문구로만 확인했다. 원문 대조가 필요하다.
|
||||
> - **[3rd-party: URL]** 다른 개발자의 GitHub 메모·코드. 공식 근거가 아니다.
|
||||
> - **[관측: URL]** 키가 필요 없는 공개 엔드포인트·웹 목록을 2026-11-03 에 직접 불러 집계했다.
|
||||
> - **[추정]** 내 판단이다. 검증이 필요하다.
|
||||
>
|
||||
> 키가 필요한 API(KOPIS, 공공데이터포털 `apis.data.go.kr`)는 호출하지 않았다. Chrome 확장은 연결되지 않았고, KOPIS 사이트 스크립트를 따로 받아 보는 방식은 쓰지 않았다.
|
||||
|
||||
---
|
||||
|
||||
## 0. 사용자 확인 (2026-11-03)
|
||||
|
||||
- 아래 4장의 1~3(KOPIS 인증키 신청·KOPIS 서면 문의·공공데이터포털 15138937·15138930 활용신청)을 사용자가 마쳤다.
|
||||
- 사용자 확인: **데이터 저장 가능, 포스터 이미지 재사용 가능.** (KOPIS 서면 문의 결과로 받은 답이다. 답변 원문은 사용자가 보관 — 받은 문구를 이 문서에 붙여 두면 근거가 남는다.)
|
||||
- 그래서 1·3장의 "포스터는 권리 확인 전까지 URL 만" 권고는 KOPIS 에 대해서는 풀린다. 한국문화정보원 이미지(공공누리 1유형이 아니면 사전 협의)는 별도로 확인한다.
|
||||
- 진단 결과는 아래 0-1 에 있다. KOPIS 공연 동기화는 구현했다(`place-db.md` §12.1).
|
||||
|
||||
### 0-1. 진단 결과 (2026-11-03, `tools/data-check/culture_api_check.py`)
|
||||
|
||||
**KOPIS** — 호출 18회
|
||||
- `https://kopis.or.kr/openApi/restful` 가 동작한다(https 확인).
|
||||
- **90일을 한 번에 조회할 수 있다.** 대구 31일 92건, 90일 153건이었다. 31일 제한은 없다.
|
||||
- 앞으로 90일 공연: 대구 153건, 경북 91건.
|
||||
- 대구 장르: 서양음악(클래식) 62 · 대중음악 30 · 뮤지컬 25 · 연극 16 · 무용 7 · 국악 6 · 서커스/마술 5 · 복합 1.
|
||||
- 상태: 공연예정 142 · 공연중 11. 오픈런 0건. 포스터는 153건 모두 있다. 기간이 2개월을 넘는 공연은 8건이다.
|
||||
- 목록 칸: `mt20id`·`prfnm`·`prfpdfrom`·`prfpdto`·`fcltynm`·`poster`·`area`·`genrenm`·`openrun`·`prfstate`.
|
||||
공연시설 id·수정일은 목록에 **없다**.
|
||||
- 상세 5건에는 모두 요금·공연 시간·시설 id·수정일·예매처 1곳이 있었다. 줄거리(`sty`)는 1건에만 있었다.
|
||||
- 공연시설 좌표는 5곳 모두 있었다. 그러나 **프로토타운 북성로 본부(대구 중구 주소)의 좌표가 경주(경도 129.21)였다.** 그래서 주소의 시·도와 좌표를 대조한다.
|
||||
- `afterdate`(어제 이후 등록·수정) 조회가 동작한다(대구 12건).
|
||||
|
||||
**한눈에보는문화정보** — 호출 3회
|
||||
- 앞으로 90일: 대구 42건, 경북 17건.
|
||||
- 대구 분야: 음악/콘서트 17 · 전시 13 · 연극 5 · 교육/체험 4 · 뮤지컬/오페라 2 · 무용/발레 1.
|
||||
- 경북 분야: 음악/콘서트 8 · 뮤지컬/오페라 3 · 행사/축제 3 · 연극 2 · 전시 1.
|
||||
- 좌표 채움: 대구 38/42, 경북 14/17. 썸네일은 전부 있다.
|
||||
- 상세 칸: `contents1`·`price`·`placeAddr`·`phone`·`imgUrl`·`url` 등.
|
||||
- 제목에 `&lsquo;` 같은 이중 인코딩이 보인다. 받을 때 엔티티를 한 번 더 풀어야 한다.
|
||||
- 공연은 KOPIS 와 겹친다. 그래서 이 출처에서는 전시만 받는 것이 낫다 [추정].
|
||||
|
||||
## 1. 한 줄 결론
|
||||
|
||||
**공연은 KOPIS 를 주 출처로 쓸 만하다. 대구 공연이 분기 376건이고, 상업적 이용이 가능하며, 공연시설 상세 API 로 좌표를 얻을 수 있다. 전시는 한국문화정보원 '한눈에보는문화정보'(좌표 포함)와 대구문화예술진흥원 공연·전시 API(키 없음, 좌표·포스터 없음)로 보강한다. 막히는 조건은 두 가지다. ① 세 출처 모두 포스터 이미지의 재배포·변형 허락을 밝히지 않는다. ② KOPIS 약관 원문(저장·캐시 조항, 일일 한도)을 읽지 못했다.**
|
||||
|
||||
- 텍스트 데이터의 저장을 금지하는 조항은 어느 출처에서도 찾지 못했다. 그러나 KOPIS 는 약관 원문을 못 읽어서 "금지 조항이 없다"고 단정할 수 없다.
|
||||
- 한국문화정보원 문화포털의 **회원 이용약관 제17조**는 "사전 승낙 없는 영리행위"를 금지한다. 같은 데이터를 공공데이터포털은 "이용허락범위 제한 없음"으로 내놓는다. 이 둘이 어긋나므로 확인이 필요하다(§2-1).
|
||||
|
||||
---
|
||||
|
||||
## 2. 출처별 표
|
||||
|
||||
열은 세 출처다.
|
||||
- **KOPIS**: 공연예술통합전산망, (재)예술경영지원센터
|
||||
- **문화정보원**: 한국문화정보원_한눈에보는문화정보조회서비스, data.go.kr 15138937
|
||||
- **대구**: 대구광역시_공연·전시 정보, 대구문화예술진흥원 제공, data.go.kr 15084620
|
||||
|
||||
### 2-1. 이용 조건
|
||||
|
||||
| 항목 | KOPIS | 문화정보원 | 대구 |
|
||||
| --- | --- | --- | --- |
|
||||
| 이용허락범위 | 공공데이터포털 등록분(공연목록·공연상세·공연시설목록·공연시설상세·축제목록) 모두 "이용허락범위 제한 없음", 무료 [확인: https://www.data.go.kr/data/15097805/openapi.do · https://www.data.go.kr/data/15097844/openapi.do] | "이용허락범위 제한 없음", 무료 [확인: https://www.data.go.kr/data/15138937/openapi.do] | "이용허락범위 제한 없음", 무료 [확인: https://www.data.go.kr/data/15084620/openapi.do] |
|
||||
| 공공누리 유형 | 표시를 찾지 못함 | API 데이터에는 표시가 없다. 문화포털 저작권정책은 "공공누리 제1유형이 붙은 저작물만" 별도 허락 없이 자유이용할 수 있다고 한다 [확인: https://www.culture.go.kr/portal/main/contents.do?menuNo=200159] | 표시를 찾지 못함 |
|
||||
| 상업적 이용 | FAQ: "특별한 사유가 존재하지 않는 한 상업적 이용이 가능합니다" (공공데이터법 근거) [확인(검색 요약): https://kopis.or.kr/por/cs/openapi/openApiFaq.do?menuId=MNU_00074] | 포털 기준으로는 가능("제한 없음"). 다만 문화포털 회원약관 제17조는 "사전 승낙 없이 서비스를 이용하여 어떠한 영리행위도 할 수 없습니다"라고 한다 [확인: https://www.culture.go.kr/portal/main/contents.do?menuNo=200157]. 이 조항이 data.go.kr 로 받은 API 에도 적용되는지는 확인하지 못했다 | 포털 기준 가능("제한 없음") [확인: 위 URL] |
|
||||
| 자체 DB 저장·캐시 | 허용·금지 조항 모두 찾지 못함. 미확인 | 금지 조항 없음. 포털은 "제한 없음"이고 업데이트 주기는 "실시간"이다 [확인: 위 URL]. 문화포털 회원약관 제17조 3항은 "얻은 정보를 사전승낙 없이 복사, 복제 … 타인에게 제공할 수 없습니다"라고 한다 [확인: 위 menuNo=200157] | 금지 조항 없음 [확인: 위 URL] |
|
||||
| 출처 표시 | 의무: "KOPIS에 의거하여 개발된 프로그램 또는 서비스라는 점을 반드시 명시". 예시 문구는 "(재)예술경영지원센터 공연예술통합전산망(www.kopis.or.kr)"이고, 출처를 표시하지 않으면 서비스가 중단될 수 있다 [확인(검색 요약): https://kopis.or.kr/por/cs/openapi/openApiInfo.do?menuId=MNU_00074] | API 자체에는 명시가 없다. 공공누리 저작물은 출처 표시가 필수이고, 예시 문구는 "본 저작물은 '문화포털'에서 서비스 되는 공공누리 제O유형으로 개방한 …"이다 [확인: 위 menuNo=200159] | 명시 없음. "대구문화예술진흥원" 표기를 권장 [추정] |
|
||||
| 포스터 이미지 | 포스터 이용 조건을 밝힌 문구를 찾지 못함. 포스터는 제작·기획사의 저작물일 가능성이 높다 [추정] | `thumbnail`·`imgUrl`(포스터 등)을 준다. 공공누리 제1유형이 아니면 "담당자와 사전에 협의"해야 한다(문화공공데이터광장 저작권정책) [확인: https://www.culture.go.kr/data/page/guide/terms.do] | 이미지 필드가 없다 [관측: https://dgfca.or.kr/api/daegu/cultural-events] |
|
||||
| 공통 원칙 | 공공데이터포털: "저작권 등 제3자 권리가 포함된 공공데이터는 권리자의 정당한 이용허락을 확보해야" 한다 [확인: https://www.data.go.kr/ugs/selectPortalPolicyView.do] | 같음 | 같음 |
|
||||
| 기타 제약 | 인증키는 1인당 1개, 양도·공유 불가, PC에서만 발급·사용. 조회 한도를 넘으면 서비스가 중지된다 [확인(검색 요약): 위 openApiInfo·openApiFaq URL] | — | 사용자가 직접 등록하는 행사가 섞여 있다(설명: "문화행사 정보를 직접 등록할 수도 있습니다") [확인: 위 URL] |
|
||||
|
||||
### 2-2. 키 발급·한도
|
||||
|
||||
| 항목 | KOPIS | 문화정보원 | 대구 |
|
||||
| --- | --- | --- | --- |
|
||||
| 신청 방법 | kopis.or.kr Open API 메뉴에서 신청하면 **인증키가 이메일로 발급**된다 [확인(검색 요약): 위 openApiFaq URL]. data.go.kr 등록분은 LINK 형이라 키는 KOPIS 에서 받는다. 바로가기 주소는 `kopis.or.kr/por/cs/openapi/openApiList.do` [확인: https://www.data.go.kr/tcs/dss/selectApiLinkUrl.do?publicDataPk=15097805] | data.go.kr 로그인 → '활용신청' → 마이페이지에서 인증키 확인 [확인: https://www.culture.go.kr/industry/apiGuideA.do] | **키가 필요 없다.** 링크 주소 `https://dgfca.or.kr/api/daegu/cultural-events` 가 JSON 전체를 바로 준다 [관측: 같은 URL]. data.go.kr 표기는 "개발 자동승인 / 운영 심의승인"이다 [확인: 위 15084620 URL] |
|
||||
| 승인 소요 | 미확인. 3rd-party 메모: "유효기간 1년, 3개월 이상 미사용 시 승인 취소" [3rd-party: https://raw.githubusercontent.com/sirloinbh/life-journal/main/docs/research/external-sources.md] | 개발·운영 모두 **자동승인** [확인: 위 15138937 URL] | 해당 없음 |
|
||||
| 개인/개인사업자 | "1인당 1개"이므로 개인 신청 전제로 보인다 [추정]. 사업자 요건은 찾지 못함 | data.go.kr 은 개인 회원으로 신청할 수 있다 (`accounts_checklist.md` 결론 3) | 해당 없음 |
|
||||
| 호출 한도 | FAQ: "1초당 10회 조회 시 서비스가 중지" [확인(검색 요약): 위 openApiFaq URL]. 일일 한도는 미확인. 3rd-party 실측: 7초 간격으로 72회 중 9회가 불규칙하게 차단됐고, 30초 뒤 재시도하면 성공했다 [3rd-party: https://github.com/jaefunk/assistant/pull/6] | 개발계정 **10,000건/일**. 운영계정은 활용사례를 등록하면 늘릴 수 있다 [확인: 위 15138937 URL]. 가이드: 초당 최대 30 tps, 평균 응답 500ms [확인: https://www.culture.go.kr/guide/docs/new_ppds_guide.zip] | 미확인. 한 번 호출에 전체(2.2MB, 5,259건)를 준다 [관측] |
|
||||
| 요금 | 무료 [확인: 위 15097805 URL] | 무료 [확인] | 무료 [확인] |
|
||||
| 형식·전송 | XML 만 제공(JSON 은 직접 변환) [확인(검색 요약): 위 openApiFaq URL]. 가이드상 운영 URL 이 `http://www.kopis.or.kr/openApi/restful/...` 이고 "전송레벨암호화 없음"이다 [확인: kopis_openapi_guide_v3.7.pdf, https://www.data.go.kr/data/15097841/openapi.do 참고문서] | XML, REST. 포털 주소는 `https://apis.data.go.kr/B553457/cultureinfo` 다 [확인: https://www.data.go.kr/data/15138937/openapi.do?format=md]. 가이드 문서에는 `cultrueinfo`(오타)로 적혀 있다 [확인: new_ppds_guide.zip] | JSON 배열 [관측] |
|
||||
|
||||
### 2-3. 제공 필드
|
||||
|
||||
| 항목 | KOPIS | 문화정보원 | 대구 |
|
||||
| --- | --- | --- | --- |
|
||||
| 오퍼레이션 | 공연목록 `pblprfr`, 공연상세 `pblprfr/{mt20id}`, 공연시설목록 `prfplc`, 공연시설상세 `prfplc/{mt10id}`, 축제목록 `prffest` 등 [확인: guide v3.7] | 기간별 `period2`, 지역별 `area2`, 분야별 `realm2`, 상세 `detail2?seq=`, 문화캘린더 `livelihood2` [확인: new_ppds_guide.zip] | 단일 엔드포인트 [관측] |
|
||||
| 제목·기간 | `prfnm`, `prfpdfrom`/`prfpdto`(형식 `2016.05.12`) [확인: guide v3.7] | `title`, `startDate`/`endDate`(YYYYMMDD) [확인: new_ppds_guide.zip] | `subject`, `start_date`/`end_date`(YYYY-MM-DD) [관측] |
|
||||
| 장소 이름 | `fcltynm`(공연시설명(공연장명)) [확인: guide v3.7] | `place` [확인] | `place`(예: "SOYO 갤러리") [관측] |
|
||||
| 주소 | 공연에는 없다. 공연시설상세 `adres` 로 얻는다 [확인: guide v3.7] | 상세 `placeAddr`(공연장 주소), `placeSeq`(문화예술공간 일련번호) [확인] | 없다. 구 이름(`event_area`)만 있다 [관측] |
|
||||
| **좌표** | **공연에는 없다.** 공연상세 `mt10id`(공연시설 ID) → 공연시설상세의 `la`(위도)·`lo`(경도). 예: 올림픽공원 37.52112 / 127.12836 [확인: guide v3.7] | **있다.** 목록·상세 모두 `gpsX`(경도)·`gpsY`(위도)를 준다. 좌표 범위 검색 `gpsxfrom/gpsyfrom/gpsxto/gpsyto` 도 된다. 항목구분이 0(선택)이라 비어 있을 수 있다 [확인: new_ppds_guide.zip] | **없다** [관측] |
|
||||
| 장르 | `genrenm` + 장르코드 `shcate`: AAAA 연극, GGGA 뮤지컬, CCCA 서양음악(클래식), CCCC 한국음악(국악), CCCD 대중음악, BBBC 무용(서양/한국무용), BBBE 대중무용, EEEA 복합, EEEB 서커스/마술 [확인: https://kopis.or.kr/upload/openApi/%EA%B3%B5%EC%97%B0%EC%98%88%EC%88%A0%ED%86%B5%ED%95%A9%EC%A0%84%EC%82%B0%EB%A7%9DOpenAPI%EA%B3%B5%ED%86%B5%EC%BD%94%EB%93%9C.pdf]. **전시는 없다** | `realmName` + `realmCode`: A000 연극, B000 음악/콘서트, B002 국악, C000 무용/발레, **D000 전시**, B003 뮤지컬/오페라, E000 아동/가족, F000 행사/축제, G000 교육/체험 등. `serviceTp` 는 A 공연/전시, B 행사/축제, C 교육/체험 [확인] | `event_gubun`: 전시·공연·교육·체험·행사 [관측] |
|
||||
| 지역 필터 | `signgucode`(시도 2자리: **대구 27**, 경북 47)·`signgucodesub`(구군 4자리: 2711 중구 … 2771 달성군). 우리 `lDongRegnCd` 27·47 과 같은 값이다 [확인: 공통코드 PDF] | `sido`(예: "부산"), `sigungu`(예: "동래구") 문자열 [확인: data.go.kr format=md] | 없다. 대구 전용이고 `event_area`(구)로 직접 거른다 [관측] |
|
||||
| 포스터 URL | `poster`(예: `http://www.kopis.or.kr/upload/pfmPoster/…`), 소개이미지 `styurls` [확인: guide v3.7]. http→https 와 www 제거 리다이렉트가 일어난다 [3rd-party: https://github.com/Cominggg/Data/issues/90] | 목록 `thumbnail`, 상세 `imgUrl` [확인] | 없다 [관측] |
|
||||
| 가격 | 상세 `pcseguidance`(예: "전석 30,000 원") [확인: guide v3.7] | 상세 `price`(예: "무료") [확인] | `pay_gubun`(유료/무료/빈값), `pay`(자유 문구) [관측] |
|
||||
| 공연 시간 | 상세 `dtguidance`(자유 문구, 예: "화요일 ~ 금요일(20:00), 토요일(15:00,17:30,20:00)"), `prfruntime` [확인: guide v3.7] | 시간 필드 없음. `contents1` 본문에 섞여 있다 [확인] | `content` 본문(HTML `<br>`)에 섞여 있다 [관측] |
|
||||
| 그 밖에 | `prfstate`(01 예정/02 공연중/03 완료), `openrun`, `relates`(예매처명·URL), `festival`(축제 여부), `updatedate`(최종수정일) [확인: guide v3.7] | `url`(관람 URL), `phone`, `placeUrl` [확인] | `homepage`, `contact`, `host`. **`contact` 에 개인 휴대전화가 들어 있는 경우가 있다**(예: 010-…) [관측] |
|
||||
| 변경 감지 | 목록 `afterdate`: 해당 일자 이후 등록·수정된 항목만 준다 [3rd-party: https://github.com/coldsurfers/kopis-cli (types.ts, specs/phase5)]. 상세 `updatedate` [확인: guide v3.7] | 수정일 필드 없음 [확인] | 수정일 필드 없음. `event_seq` 는 증가하는 번호다(2299~8852) [관측] |
|
||||
| 갱신 주기 | 포털 표기 "실시간" [확인: 위 15097805 URL]. KOPIS 는 197개 티켓 발권 시스템과 연계해 "매일 데이터를 수집"한다 [확인: 아래 3분기 보고서] | "실시간" [확인] | "실시간" [확인] |
|
||||
|
||||
### 2-4. 대구 데이터 양
|
||||
|
||||
| 출처 | 수치 | 근거 |
|
||||
| --- | --- | --- |
|
||||
| KOPIS | 2025년 3분기(7~9월), 수도권을 빼면 대구가 공연건수 1위: **376건**, 1,712회, 티켓 24만 8,324매. 장르별(서울 제외 순위): 클래식 167건(2위), 뮤지컬 58건(2위), 무용 18건(2위), 연극 공연회차 763회(1위) | [확인: http://www.gokams.or.kr/DATA/GO/2025%203%EB%B6%84%EA%B8%B0%20%ED%8B%B0%EC%BC%93%ED%8C%90%EB%A7%A4%20%ED%98%84%ED%99%A9%20%EB%B6%84%EC%84%9D%20%EB%B3%B4%EA%B3%A0%EC%84%9C.pdf] |
|
||||
| KOPIS (환산) | 90일 창이면 대구 수백 건이 겹칠 것이다. 주말 이틀에도 수십 건이 나올 것이다 | [추정] |
|
||||
| KOPIS 수집 범위 | "전산 발권된" 예매·취소 데이터다. 「공연법」 제4조로 전송 의무가 있지만 "전산예매시스템에 의하여 발권되지 아니한 경우"는 빠진다. 그래서 **무료·현장 공연은 누락될 수 있다** | [확인: 위 보고서 앞부분 '보고서 안내'·공연법 발췌] |
|
||||
| 문화정보원 | 문화포털 웹 '한눈에 보는 문화정보'에서 지역을 대구로 고르면 **40건**(전국 3,597건)이다. 첫 화면 12건은 음악/콘서트 9, 전시 2, 뮤지컬 1이다. 웹 목록 기준이라 API 결과와 같다고 단정할 수 없다 | [관측: https://www.culture.go.kr/portal/cltInfo/oneCltInfo/list.do?menuNo=200010&ctpvNm=%EB%8C%80%EA%B5%AC] |
|
||||
| 대구 | 전체 5,259건 중 2026-11-03 ~ 2027-02-01 과 기간이 겹치는 것은 **42건**이다(전시 21, 공연 16, 교육 2, 체험 2, 행사 1). 이번 주말(11/7~8)은 11건(전시 7, 공연 2, 교육 2). 42건 중 7건이 60일 넘는 장기 행사다. 2026년 시작 행사는 월 3~51건으로 들쭉날쭉하다 | [관측: https://dgfca.or.kr/api/daegu/cultural-events] |
|
||||
| (비교) 관광공사 | 앞으로 90일 대구 1건 | `docs/design/place-db.md` §12 |
|
||||
|
||||
### 2-5. 원문 URL
|
||||
|
||||
- KOPIS
|
||||
- Open API 안내: https://kopis.or.kr/por/cs/openapi/openApiInfo.do?menuId=MNU_00074 (JS 렌더링, 직접 열람 실패)
|
||||
- FAQ: https://kopis.or.kr/por/cs/openapi/openApiFaq.do?menuId=MNU_00074 (같음)
|
||||
- 서비스 목록: https://kopis.or.kr/por/cs/openapi/openApiList.do?menuId=MNU_00074
|
||||
- 개발가이드 v3.7(PDF): https://www.data.go.kr/data/15097841/openapi.do 의 참고문서. 3rd-party 메모는 사이트 최신판을 v5.0 이라고 한다 [3rd-party: https://github.com/jaefunk/assistant/pull/4]
|
||||
- 공통코드(PDF, 사이트 최신판): https://kopis.or.kr/upload/openApi/%EA%B3%B5%EC%97%B0%EC%98%88%EC%88%A0%ED%86%B5%ED%95%A9%EC%A0%84%EC%82%B0%EB%A7%9DOpenAPI%EA%B3%B5%ED%86%B5%EC%BD%94%EB%93%9C.pdf
|
||||
- data.go.kr 등록분: 공연목록 15097805 · 공연상세 15097841 · 공연시설목록 15097806 · 공연시설상세 15097844 · 축제목록 15097808
|
||||
- 문의: 공연정보팀 kopis@gokams.or.kr / 02-708-2256 [확인: 위 3분기 보고서]
|
||||
- 문화정보원
|
||||
- 포털: https://www.data.go.kr/data/15138937/openapi.do
|
||||
- 사용가이드: https://www.culture.go.kr/industry/apiGuideA.do
|
||||
- 개발가이드(zip, .doc): https://www.culture.go.kr/guide/docs/new_ppds_guide.zip
|
||||
- 저작권정책: https://www.culture.go.kr/portal/main/contents.do?menuNo=200159
|
||||
- 이용약관: https://www.culture.go.kr/portal/main/contents.do?menuNo=200157
|
||||
- 문의: 문화포털팀 02-3153-2843
|
||||
- 대구
|
||||
- 포털: https://www.data.go.kr/data/15084620/openapi.do
|
||||
- 엔드포인트: https://dgfca.or.kr/api/daegu/cultural-events
|
||||
- 문의: 053-803-3738
|
||||
- 공통: 공공데이터포털 이용허락범위·약관 https://www.data.go.kr/ugs/selectPortalPolicyView.do
|
||||
|
||||
### 2-6. 그 밖에 살펴본 출처 (짧게)
|
||||
|
||||
| 출처 | 판단 | 근거 |
|
||||
| --- | --- | --- |
|
||||
| 문화체육관광부_문화예술공연(통합) (data.go.kr 15121487 → 문화공공데이터광장 `CNV_060`) | **부적합.** `dtype`(분류)와 `title`(2자 이상)이 **필수**라서 전체를 받아 오기 어렵다. 지역·좌표 필드도 없다. 문화포털 게시물을 다시 내보내는 것이다 | [확인: https://www.culture.go.kr/data/openapi/openapiView.do?id=580] |
|
||||
| 한국문화정보원 외_전시정보(통합) (`API_CCA_145`) | **보조로만.** 국립 기관 23곳의 전시다. 대구는 국립대구박물관 1곳뿐이고 지역·좌표 필드가 없다. 문화공공데이터광장 저작권정책은 공공누리 1유형이 아니면 사전 협의를 요구한다 | [확인: https://www.culture.go.kr/data/openapi/openapiView.do?id=598 · https://www.culture.go.kr/data/page/guide/terms.do] |
|
||||
| 한국문화정보원_문화시설조회서비스 (15138930) | **좌표 보강용으로 쓸 만하다.** 공연장·미술관·박물관 등의 주소·위치 좌표를 준다. 제한 없음, 개발 10,000건/일, 자동승인 | [확인: https://www.data.go.kr/data/15138930/openapi.do] |
|
||||
| 대구광역시_오페라하우스 공연일정 (15057055) | API 가 아니다. 링크를 따라가면 대구시 RSS 목록이 나오고, `http://www.daeguoperahouse.org/rss.php` 를 가리킨다 | [확인: https://www.data.go.kr/data/15057055/openapi.do · https://www.daegu.go.kr/index.do?menu_id=00000277] |
|
||||
| 전국공연행사정보표준데이터 (15013106) | **보조 후보.** 정부 예산이 들어간 지자체 공연행사이고 위도·경도 항목이 있다. 226개 기관이 분기마다 갱신한다. API 는 개발 10,000건/일이다. 대구 기관이 데이터를 내는지는 확인하지 못했다 | [확인: https://www.data.go.kr/data/15013106/standard.do] |
|
||||
| KOPIS 축제목록 (`prffest`) | 공연예술 축제다. 관광공사 축제와 겹칠 수 있다 | [확인: guide v3.7] |
|
||||
|
||||
---
|
||||
|
||||
## 3. 우리 설계에 붙일 때의 주의점
|
||||
|
||||
### 3-1. 좌표
|
||||
|
||||
- **KOPIS** [추정]
|
||||
- 공연 목록·상세에는 좌표가 없다.
|
||||
- 상세의 `mt10id` 로 공연시설 상세를 불러 `la`/`lo`/`adres` 를 얻는다.
|
||||
- 시설 정보는 별도 테이블(예: `event_venue`, 키는 `mt10id`)에 캐시한다. 새 시설이 나올 때만 부르고, 한 달에 한 번 갱신한다.
|
||||
- 공연장은 시설(mt10id) 아래 여러 홀(mt13id, 예: 대구문화예술회관 비슬홀·팔공홀)이 있다. 좌표는 시설 단위다 [확인: guide v3.7, 공통코드 PDF].
|
||||
- **문화정보원**
|
||||
- `gpsX` 가 **경도**, `gpsY` 가 **위도**다. 순서를 뒤집지 않는다 [확인: new_ppds_guide.zip].
|
||||
- 선택 항목이라 비어 있을 수 있다.
|
||||
- **대구 API**
|
||||
- 좌표·주소가 없다. 장소 이름과 구만 있다.
|
||||
- **좌표가 없을 때 순서** [추정]
|
||||
1. 이미 받은 시설 테이블(KOPIS 시설, 문화시설조회서비스)이나 `place`(관광공사 문화시설)와 **정규화한 이름이 완전히 일치**하는 것에 붙인다. 같은 구 안에서만 찾는다.
|
||||
2. 그래도 없으면 공공 지오코더로 주소를 좌표로 바꾼다(juso.go.kr 좌표제공 또는 VWorld). 두 서비스의 약관은 아직 보지 않았다(`kakao_place_id.md` 미확인 목록).
|
||||
3. 그래도 없으면 좌표 없이 저장한다. 지금 정책과 같다. 근처 조회에서만 빠진다(`place-db.md` §12).
|
||||
- **카카오·네이버 지오코딩 결과는 저장하지 않는다.** 카카오는 "공공기관 API로 변환한 좌표"를 저장하는 것만 허용한다고 답했다(`map_sdk.md`, DevTalk 152228).
|
||||
- **이름 매칭이 좌표 매칭보다 낫다.** 같은 건물·부지의 다른 시설이 0~10m 안에 있어서, 좌표 거리로는 틀린 연결이 더 가까이 잡혔다는 실측이 있다. 정규화 후 이름이 겹치는 장소는 색인에서 뺐다고 한다 [3rd-party: https://github.com/tour-api-2026/byeori/pull/46].
|
||||
|
||||
### 3-2. 스키마·조회 규칙 (`festival_event`, `place-db.md` §2.4·§12)
|
||||
|
||||
- **`source_id` 유니크를 바꿔야 한다.** 지금은 관광공사 contentid 단독 유니크다. `source`(tour·kopis·kcisa·dgfca) 컬럼을 더하고 `(source, source_id)` 를 유니크로 한다. `place_sync_run.job` 에도 출처별 작업을 추가한다 [추정].
|
||||
- **`kind` 에 `exhibition` 을 더한다.** KOPIS 장르(연극·뮤지컬·클래식 …)는 별도 `genre` 컬럼에 둔다 [추정].
|
||||
- **"60일 넘는 상시 프로그램 제외" 규칙을 종류별로 바꾼다.** 이 규칙을 그대로 두면 전시는 대부분 홈에서 사라진다. 전시는 몇 달씩 하는 경우가 많고, 대구 API 42건 중 7건이 60일을 넘는다 [관측]. KOPIS 오픈런(`openrun=Y`) 공연도 마찬가지다. 전시는 기준을 길게 잡거나 빼야 한다 [추정].
|
||||
- **필드 매핑**
|
||||
- `fee_text` ← KOPIS `pcseguidance` / 문화정보원 `price` / 대구 `pay`
|
||||
- `playtime_text` ← KOPIS `dtguidance`
|
||||
- `overview` ← KOPIS `sty`, 문화정보원 `contents1`, 대구 `content`(HTML 정리 필요)
|
||||
- **날짜 형식이 출처마다 다르다:** `2016.05.12` / `20190616` / `2026-11-03`.
|
||||
- **'이번 주말' 판정 주의.** 지금은 기간이 겹치는지로만 거른다. 그래서 화~금만 하는 공연이 주말 목록에 섞인다. KOPIS `dtguidance`(요일·시각 자유 문구)를 파싱해 토·일 회차가 있는지 보는 것이 이상적이다. 처음에는 표시만 하고 나중에 보강해도 된다 [추정].
|
||||
- **대구 API 의 `contact` 에는 개인 휴대전화가 섞여 있다.** 응답·검색 색인에 그대로 노출할지 정해야 한다(개인정보 최소화) [관측 + 추정].
|
||||
- **군위군.** 2023년 대구로 편입됐다 [추정: 기억에 의존, 이번에 원문 확인 안 함]. KOPIS 공통코드의 대구 구군 목록은 달성군(2771)까지만 있다 [확인: 공통코드 PDF]. 그래서 군위 공연이 경북(47)으로 분류될 수 있다 [추정].
|
||||
|
||||
### 3-3. 관광공사 행사와 중복 처리
|
||||
|
||||
- **겹치는 지점** [추정]
|
||||
- 관광공사 EV02(공연)·EV01(축제)와 KOPIS 공연·축제목록이 겹칠 수 있다.
|
||||
- 대구 API 는 사용자 직접 등록이라 KOPIS·문화정보원과 겹칠 수 있다.
|
||||
- 문화포털에 보이는 대구 공연 목록에는 "[대구] …" 접두어가 붙는다. 다른 출처(KOPIS 계열)에서 들어온 것으로 보이지만 근거는 없다.
|
||||
- **같은 행사 판정** [추정]
|
||||
1. 정규화한 제목이 일치한다. `[대구]` 같은 대괄호 접두어, 괄호 주석, 공백, 문장부호를 지운다.
|
||||
2. 기간이 겹친다.
|
||||
3. 장소가 같다. 같은 시설 ID, 이름 정규화 일치, 좌표 200m 이내 중 하나다.
|
||||
4. 셋을 모두 만족할 때만 같은 행사로 본다.
|
||||
- **지역도 맞아야 한다.** 투어 공연은 도시마다 제목이 같다(예: 3분기 상위 공연의 "싸이흠뻑쇼 [대구]/[광주]/[대전]") [확인: 3분기 보고서]. 제목·기간만으로 묶으면 안 된다.
|
||||
- **대표 출처 우선순위** [추정]
|
||||
- 축제: 관광공사
|
||||
- 공연: KOPIS. 가격·시간·예매처가 구조화되어 있다.
|
||||
- 전시: 문화정보원 → 대구 API 순
|
||||
- 나머지 출처는 연결 테이블(예: `festival_event_source`)이나 `merged_into` 로 남긴다. 장소 중복 병합과 같은 방식이다.
|
||||
- **애매하면 합치지 않는다.** 퍼지 매칭은 쓰지 않는다. 틀린 병합이 더 해롭다(3rd-party 사례도 완전일치만 썼다).
|
||||
|
||||
### 3-4. 갱신 주기·호출량
|
||||
|
||||
- **KOPIS (매일)**
|
||||
- **목록**: `signgucode=27`·`47`, `stdate`=오늘, `eddate`=오늘+90일, `rows=100`. 페이지를 끝까지 돈다. 조회 기간을 31일 단위로 나눠 부르는 3rd-party 구현이 있다. 실제 제한인지는 미확인이므로 키를 받은 뒤 90일 한 번 호출로 확인한다 [3rd-party: jaefunk PR #4].
|
||||
- **상세**: 처음 보는 `mt20id` 이거나 `updatedate` 가 바뀐 것만 부른다. 목록의 `afterdate`(마지막 동기화일 −1일)로 후보를 줄일 수 있다.
|
||||
- **시설 상세**: 새 `mt10id` 만 부른다.
|
||||
- **속도**: 초당 10회에서 차단되므로 **초당 2회 이하**로 부른다. 차단·오류가 나면 30초 쉬고 재시도한다 [확인(검색 요약) + 3rd-party].
|
||||
- **호출 수** [추정]
|
||||
- 첫 적재(대구+경북): 목록 수십 회, 상세 수백 회, 시설 100~200회
|
||||
- 이후 하루: 목록 수십 회, 상세 수십 회
|
||||
- **숨김**: 취소된 공연을 KOPIS 가 어떻게 표시하는지는 미확인이다. 기존 원본 장애 안전장치(`sync/removal-guard.ts`)를 그대로 적용한다.
|
||||
- **키 노출**: 가이드상 http + 쿼리스트링 키다. 서버 로그·에러 기록에서 키를 가린다. https 로도 되는지는 키 발급 후 확인한다 [추정].
|
||||
- **문화정보원 (매일)**
|
||||
- `area2` 를 `sido=대구`(+`경북`), `from`/`to` 로 부른다. `serviceTp=A`(공연/전시)를 기본으로 하고, B(행사/축제)도 받을지 정한다.
|
||||
- 상세는 새 `seq` 만 부른다. 수정일 필드가 없으므로 주 1회 전체 상세를 다시 받아 비교한다. 대구 물량이 작아 10,000건/일 안에 충분히 든다 [추정].
|
||||
- **대구 API (매일 1회)**
|
||||
- 한 번에 전체(2.2MB)가 온다. `end_date ≥ 오늘` 만 남기고 `event_seq` 로 비교한다 [관측].
|
||||
- **포스터·이미지**
|
||||
- 권리를 확인하기 전에는 **URL 만 저장하고 원본 주소로 보여 준다.** 서버에 내려받기·리사이즈·썸네일 생성·CDN 재배포는 하지 않는다. `image_license` 는 `unverified` 로 둔다 [추정].
|
||||
- KOPIS 포스터는 `http://www.kopis.or.kr/…` 이다. iOS ATS 때문에 `https://kopis.or.kr/…` 로 바꿔 저장한다 [3rd-party: Cominggg #90].
|
||||
- **출처 표시 UI**
|
||||
- 행사 상세 하단과 앱 정보 화면에 출처를 적는다. KOPIS 는 "(재)예술경영지원센터 공연예술통합전산망(www.kopis.or.kr)"이다 [확인(검색 요약)].
|
||||
- 문화정보원은 "한국문화정보원 문화포털", 대구 API 는 "대구문화예술진흥원"으로 적는다 [추정].
|
||||
- **KOPIS 키는 서버에서만 쓴다.** 안내문의 "PC에서만 사용 가능"은 앱에 키를 넣어 단말에서 직접 부르는 방식을 막는 뜻으로 읽힌다 [추정]. 지금 설계(서버 동기화)는 문제없다.
|
||||
|
||||
---
|
||||
|
||||
## 4. 사용자가 해야 할 일
|
||||
|
||||
1. **KOPIS 인증키 신청.**
|
||||
- kopis.or.kr → Open API 메뉴에서 **PC 로** 신청한다. 1인 1키이고 키는 이메일로 온다.
|
||||
- 3개월 넘게 쓰지 않으면 취소된다는 3rd-party 메모가 있다. 그래서 KOPIS 동기화 구현을 시작하기 직전에 신청한다.
|
||||
- 받은 키는 `backend/.env.{env}` 에만 둔다(이름 예: `KOPIS_SERVICE_KEY`). 채팅·이슈·커밋에는 적지 않는다.
|
||||
2. **KOPIS 에 서면 문의.** 공연정보팀 kopis@gokams.or.kr / 02-708-2256. 답을 이 문서에 붙인다.
|
||||
- (a) 공연·시설 정보를 자체 DB 에 저장·가공해 상업 앱에서 보여 줘도 되는가
|
||||
- (b) 포스터·소개이미지를 원본 URL 로 앱에 표시해도 되는가. 서버에 저장하거나 리사이즈해도 되는가
|
||||
- (c) 일일 호출 한도와 조회 기간 제한(31일 여부)
|
||||
- (d) 키 유효기간과 미사용 취소 기준
|
||||
- (e) 출처 표시 위치·문구
|
||||
3. **공공데이터포털 활용신청**(자동승인)
|
||||
- '한국문화정보원_한눈에보는문화정보조회서비스'(15138937)
|
||||
- 좌표 보강용 '한국문화정보원_문화시설조회서비스'(15138930)
|
||||
- 이미 있는 data.go.kr 계정을 쓰면 된다.
|
||||
4. **(선택) 문화포털팀(02-3153-2843)에 확인.** 회원약관 제17조의 영리행위 금지가 data.go.kr 로 받은 API 데이터에도 적용되는가. `thumbnail`/`imgUrl` 이미지의 이용 조건은 무엇인가.
|
||||
5. **(선택) 대구시(053-803-3738)에 확인.** 대구 공연·전시 API 의 상업 이용·호출 한도. 포털 표기는 "제한 없음"이다.
|
||||
6. **포스터 정책 결정.** 2번 답을 받은 뒤 정한다. 원본 URL 로 표시, 표시 안 함, 서버 저장 중 하나다.
|
||||
7. **키를 받은 뒤 진단 스크립트 실행.** `tools/data-check/festival_region_check.py` 처럼 만든다. 출처별 대구·경북 90일 건수, 좌표 채움 비율(KOPIS `la/lo`, 문화정보원 `gpsX/gpsY`), 관광공사와 겹치는 비율을 잰다. 그다음 `place-db.md` §12 에 반영한다.
|
||||
|
||||
---
|
||||
|
||||
## 5. 확인하지 못한 것
|
||||
|
||||
- **KOPIS 약관·FAQ 원문.** 사이트가 JS 렌더링이라 직접 읽지 못했고 검색 요약으로만 확인했다. 그래서 다음을 모른다.
|
||||
- 자체 DB 저장·캐시 조항
|
||||
- 일일 호출 한도
|
||||
- 승인 소요 시간
|
||||
- 키 유효기간·미사용 취소(3rd-party 메모는 "1년 / 3개월")
|
||||
- ~~조회 기간 31일 제한~~ → 2026-11-03 진단으로 해소: 90일을 한 번에 조회할 수 있다(0-1)
|
||||
- 최신 개발가이드(v5.0으로 알려짐). 이번에 읽은 것은 data.go.kr 의 v3.7 이다. 공통코드만 사이트 최신판을 봤다.
|
||||
- **포스터 이미지 권리.** 세 출처 모두 명시가 없다. KOPIS 포스터의 저작권자(제작·기획사) 허락 범위도 모른다.
|
||||
- **KOPIS 목록 응답의 `area` 필드.** v3.7 가이드에는 상세에만 있다. 목록에도 있다는 것은 3rd-party 코드뿐이다.
|
||||
- **KOPIS `la`/`lo` 채움 비율.** 특히 소극장·비공연장 시설. 취소 공연 표시 방식도 모른다.
|
||||
- **문화정보원 데이터의 원천 구성.** KOPIS 데이터를 포함하는지 모른다. API 로 받은 대구 실제 건수와 `gpsX/gpsY` 채움 비율도 모른다. 웹 목록 40건만 확인했다.
|
||||
- **문화포털 회원약관 제17조와 data.go.kr "제한 없음"의 관계.**
|
||||
- **대구 API 의 별도 약관·호출 한도.** dgfca.or.kr 안에 API 안내 페이지가 있는지 찾지 못했다.
|
||||
- **전국공연행사정보표준데이터에 대구 기관이 데이터를 내는지.**
|
||||
- **juso.go.kr 좌표제공·VWorld 지오코더의 저장·상업 이용 조건.**
|
||||
- **KOPIS 키를 개인사업자·법인 명의로 받을 수 있는지.**
|
||||
Reference in New Issue
Block a user