더 많은 교회가
더 쉽게 연결되도록
airChurch가 공개 자료를 모으고, 자동으로 정리하며, 사람의 검토를 거쳐 연결하는 방식을 나눕니다. 비밀값·개인 식별 정보·내부 운영 주소는 담지 않았습니다.
사람과 교회를 잇는 · 라인 처치
airChurch가 공개 자료를 모으고, 자동으로 정리하며, 사람의 검토를 거쳐 연결하는 방식을 나눕니다. 비밀값·개인 식별 정보·내부 운영 주소는 담지 않았습니다.
한 곳에 몰아넣기보다, 공개 자료·자동화·검토·표시 영역을 분리해 역할을 단순하게 유지합니다.
페이지와 API를 같은 실행 환경에서 제공합니다. 대표 도메인으로 정리하고, 이미지 요청은 안전한 크기로 변환해 전달합니다.
교회·콘텐츠·검토 상태·운영 기록을 관계형 데이터로 저장합니다. 공개 여부를 데이터마다 명확하게 둡니다.
읽기 전용 목록은 짧게 캐시해 빠르게 보여 주되, 콘텐츠 자체를 복제하지 않고 출처와 원문으로 연결합니다.
아래 두 기술은 airChurch가 자료를 보여 주고 자동으로 정리하는 데 쓰는 기본 토대입니다. 둘 다 직접 서버 컴퓨터를 관리하지 않고 쓸 수 있어, 작은 팀도 운영에 집중할 수 있습니다.
웹사이트의 작은 서버 프로그램을 Cloudflare가 운영하는 네트워크에서 실행하는 방식입니다. 누군가 airchurch.net을 열면 Worker가 요청을 받아 페이지나 API 응답을 돌려줍니다.
쉽게 말해, Workers는 “항상 켜 둔 내 컴퓨터”가 아니라 요청이 있을 때 필요한 코드만 실행하는 안내 데스크입니다. airChurch에서는 페이지·API·예약 유지보수 작업이 이곳에서 움직입니다.
D1은 관계형 데이터베이스입니다. 스프레드시트처럼 표로 저장하되, 교회·목회자·영상·출처처럼 서로 연결된 정보를 정확하게 찾고 갱신할 수 있습니다.
D1에는 영상 파일이나 뉴스 전문을 복사하지 않습니다. airChurch가 보관하는 것은 “어디의 어떤 공개 자료인지”를 찾기 위한 최소 정보와 상태입니다.
아래 수치는 2026년 9월 기준 airChurch 코드에 설정된 상한과 운영 기준입니다. “많이 가져오기”보다 출처의 부하와 오류 전파를 제한하는 데 목적이 있습니다.
자동화의 역할은 공개된 사실을 반복해서 정리하는 것입니다. 교회와 사람에 대한 최종 판단, 권리 요청, 비공개 처리는 사람이 맡습니다.
서버의 예약 작업이 콘텐츠·뉴스·행사·정리 작업을 차례로 실행합니다.
공식 YouTube 채널, 교회·교단 홈페이지, 공개 RSS를 시간 제한과 용량 제한 안에서 읽습니다.
채널·교회 정보와 제목·날짜·링크를 대조하고, 설교·찬양·짧은 영상·뉴스·행사로 분류합니다.
같은 영상과 자료를 하나로 묶고, 실패한 출처는 기존에 정상인 목록을 지키며 다음 작업에서 다시 확인합니다.
검증된 최소 정보만 보여 주고, 영상·뉴스·교회 원문은 원래 제공자의 페이지로 이어집니다.
공식 채널을 기준으로 제목·게시일·원본 주소를 읽습니다. 설교와 찬양은 제목 기준으로 보수적으로 분류하고, 짧은 영상은 명시적 표기나 짧은 길이·제외 조건을 함께 확인합니다.
허용한 출처의 RSS만 읽고, 출처별 수량을 제한합니다. 제목과 짧은 소개만 보여 주며 전체 기사는 원문에서 읽게 합니다.
각 출처의 확인 시각·성공 여부·다음 확인 시점을 남깁니다. 오류가 난 출처가 다른 출처의 표시를 막지 않도록 분리합니다.
예약 작업이 보관 기간이 지난 익명 통계, 반복 제출 방지 기록, 처리 완료 요청을 정리합니다. 공개 영상의 원본은 건드리지 않습니다.
사람이 영상 페이지를 하나씩 복사하는 방식이 아닙니다. YouTube가 공개적으로 제공하는 Data API와 공식 채널 피드를 이용해, 허용한 채널의 메타데이터만 읽고 D1 목록을 갱신합니다.
교회명·지역·교단과 함께 채널 ID, 채널 핸들 또는 사용자 이름을 등록합니다. 같은 채널 ID가 여러 번 들어와도 하나의 출처로 묶습니다.
YouTube Data API의 채널 조회로 해당 채널의 업로드 재생목록을 찾습니다. 이어서 재생목록 항목을 한 번에 최대 50개씩 읽습니다.
영상 상세 정보에서 길이를 확인합니다. 제목에 설교·말씀 같은 신호가 있고 찬양·광고·쇼츠 같은 제외 신호가 없을 때 설교 후보로 봅니다. Shorts는 #shorts·쇼츠 표기 또는 5~90초 길이와 제외 규칙을 함께 적용합니다.
기본 목록은 최근 180일 공개분을 다룹니다. 교회별 상한 안에서 설교·찬양·Shorts를 각각 저장하며, 동일 YouTube 영상 ID는 새로 만들지 않고 제목·날짜를 갱신합니다.
airChurch에는 영상 파일을 저장하지 않습니다. 제목·게시일·썸네일 주소·원본 영상 ID만 보관하고, 재생과 자세한 정보는 원래 YouTube로 연결합니다.
말씀·찬양·Shorts 목록을 읽는 요청이 들어오면, 이미 응답한 뒤 백그라운드에서 갱신을 요청합니다. 같은 실행 환경에서는 5분 안에 중복 실행하지 않습니다.
콘텐츠, 찬양, 뉴스, 행사, 보관 기간 정리를 병렬로 시작합니다. 실행 주기는 배포 환경에서 관리하므로, 다른 팀은 자신의 트래픽·API 한도에 맞게 별도로 설정해야 합니다.
추적 금지 설정은 존중합니다. 첫 전송은 일반적으로 1.5초 뒤, 데이터 절약 모드에서는 5초 뒤이며 홈에서는 실제 상호작용 후에만 시작합니다.
무엇이 공개 정보인지, 무엇이 입력 정보인지, 무엇이 보호 정보인지를 처음부터 나눕니다.
공개 출처, 확인 시각, 공개 상태와 원문 링크를 함께 관리합니다.
입력값을 제한하고 반복 제출을 막은 뒤, 공개·보류·삭제를 운영자가 판단합니다.
원문 식별값 대신 최소한의 해시와 횟수를 사용하며, 기간이 지나면 자동 삭제합니다.
별도 저장 영역에서 암호화합니다. 일반 방문자에게는 제공하지 않고 승인된 역할의 접근만 기록합니다.
찜, 최근 검색, 읽기 진행 상태처럼 로그인 없이 쓸 수 있는 개인 편의 기능은 브라우저 저장소에만 둡니다.
공개 목록과 검토 상태는 D1에 저장합니다. 제출 기록은 공개 데이터와 분리하고, 필요한 기간만 보관합니다.
영상·기사·교회 홈페이지는 각 제공자가 운영합니다. airChurch는 원문을 대신 보관하거나 로그인 영역을 읽지 않습니다.
방문 통계는 90일, 마지막 활동 기록은 30일 뒤 자동 삭제합니다. 반복 제출 방지용 해시와 횟수는 최대 2일 안에 정리합니다. 처리 완료된 문의·제보·검토 기록은 성격에 따라 30일에서 180일 사이에 삭제하며, 자세한 기준은 개인정보처리방침에서 공개합니다.
전체 상한을 넘으면 오래된 항목부터 정리하되, 각 교회의 최신 3편은 남깁니다.
전체 상한을 넘으면 오래된 항목부터 정리하되, 각 교회의 최신 2편은 남깁니다.
전체 상한을 넘으면 오래된 항목부터 정리하되, 각 교회의 최신 2편은 남깁니다.
동시에 여러 서버가 실행해도 한 곳만 정리하도록 잠금을 둡니다. 실패하면 다음 실행에서 다시 시도합니다.
많이 모으는 것보다 잘못 연결하지 않는 것을 우선합니다.
로그인 없이 공개된 교회·교단·공식 채널·언론 출처를 우선합니다.
콘텐츠 가까이에 교회명·출처·원문 링크를 표시해 언제든 확인할 수 있게 합니다.
채널 소유, 최근 운영, 교회 정보가 맞지 않거나 불명확하면 자동 공개하지 않습니다.
영상·기사 원문을 복제하지 않고 제공자의 재생·원문 링크로 연결합니다.
로그인·비공개 공간·민감정보를 수집해 교회나 개인을 평가하지 않습니다.
오류, 초상권, 저작권, 비공개 요청은 먼저 보류한 뒤 공식 근거를 확인합니다.
아래 순서는 작은 교회·지역·교단 포털을 만드는 최소 실행안입니다. 기술은 바꿔도 되지만, 공개 기준과 자동화의 안전장치는 유지하는 것을 권합니다.
수집 대상, 허용 출처, 보류 사유, 정정 요청 창구를 정합니다. 예: “공식 홈페이지와 공식 YouTube 채널만 사용”, “채널 소유를 확인하지 못하면 공개하지 않음”.
Worker는 화면과 API를 실행하고 D1은 목록과 상태를 저장합니다. 브라우저가 D1에 직접 접속하지 않고 항상 Worker API를 거치게 합니다. API 키는 코드·Git이 아닌 배포 환경의 비밀값으로 등록합니다.
교회(churches), 콘텐츠(media_items), 자동화 실행 기록(sync_state), 정정 요청(change_requests)부터 시작합니다. 공개 상태는 교회·콘텐츠마다 따로 두고, 자동 수집이 보류된 항목을 다시 공개하지 못하게 합니다.
교회명·지역·교단·공식 채널 ID·홈페이지를 한 행으로 등록합니다. 채널 ID를 기본 식별자로 쓰고, 같은 ID가 중복되면 하나로 합칩니다.
한 번에 모든 채널을 읽지 않습니다. 다음 순번을 sync_state에 저장하고 20곳씩 이어갑니다. 출처별 시간 제한, 30분 실행 잠금, 실패 기록을 둡니다.
GET /api/churches와 GET /api/media는 approved 상태만 반환합니다. 방문자가 보는 요청은 빠르게 끝내고, 갱신은 Worker의 백그라운드 작업 또는 예약 작업으로 보냅니다.
POST /api/corrections는 요청을 pending으로 접수하고 공개 목록을 즉시 바꾸지 않습니다. POST /internal/retention은 보관 기간이 지난 통계·잠금·처리 완료 기록을 정리합니다.
id · name · region · denomination · youtube_channel_id · homepage_url · review_status · updated_at교회 한 곳을 한 줄로 둡니다. review_status는 approved / pending / removed처럼 공개 상태를 뜻합니다.
youtube_id · church_id · kind · title · published_at · status · source_url영상 ID는 고유값입니다. 같은 영상은 새로 만들지 않고 제목과 날짜를 갱신합니다.
key · cursor · last_attempt_at · last_success_at · lease_until자동화의 다음 순번과 실행 잠금을 기록해 중복 수집을 막습니다.
id · type · payload · status · created_at · reviewed_at제보·정정·비공개 요청은 공개 목록과 분리해 검토합니다.
GET /api/churches승인된 교회 목록만 반환하고 짧게 캐시합니다.
GET /api/media승인된 콘텐츠만 반환하며 kind=sermon / praise / short 필터를 받습니다.
POST /internal/sync/youtube외부에 열지 않는 수집 주소입니다. 예약 작업과 Worker 내부에서만 호출합니다.
POST /api/corrections정정·비공개 요청을 pending으로 접수합니다.
POST /internal/retention보관 기한이 지난 기록을 지우는 내부 작업입니다.
for source in next 20 approved sources:
channel = YouTube.channels(source.channel_id)
videos = YouTube.playlistItems(channel.uploads, max 50)
details = YouTube.videos(videos.ids)
for video in videos from last 180 days:
kind = classify(title, duration)
if kind is allowed: upsert by youtube_id
save next cursor; keep the existing list if a request fails실패해도 기존 공개 목록을 지우지 않고, 영상 ID로 중복을 막으며, 공개 상태는 자동 수집과 분리하는 것이 핵심입니다.
교회·지역·교단을 위한 사이트는 거창한 시스템보다 “공개 출처만 다루기”, “자동화와 사람의 역할 나누기”, “개인 정보 최소화”, “원문으로 돌려보내기”에서 출발할 수 있습니다.