[Project] - 글쓰기 공모전 마감 모음 사이트를 맥 한 대로 만들고 운영하기

소설·시·수필 공모전을 마감순으로 모아 보여주는 글쓰기공모전.kr 을 만들면서, 서버 없이 맥 한 대로 수집·요약·배포를 돌리는 구조와 검색 등록에서 겪은 것들을 정리합니다.

계기

  • 공모전 정보는 위비티·씽굿·링커리어·콘테스트코리아 같은 공모전 사이트와 신문사 신춘문예, 문예지 신인상 공고에 나뉘어 있음
    • 같은 공모전이 여러 곳에 올라오는데 마감일 표기가 서로 다른 경우도 있음
    • “소설만, 일반인 응모 가능한 것만, 마감 가까운 순” 으로 보고 싶었는데 그런 곳이 없었음
  • 그래서 전부 모아서 마감순으로 보여주는 사이트를 만들기로 함

전체 구조 — 서버 없이 맥 한 대

  • 매일 07:30, 19:30 에 맥 launchd 가 스크립트 하나를 실행함
    1. 공모전 사이트 10곳과 신문사·출판사 공고를 수집 (Python)
    2. 공고문에서 응모 자격·참가 방법·상금·분량을 뽑아 정리 (Claude Code CLI claude -p)
    3. 같은 공모전을 하나로 합치고 data.json 생성
    4. Vite + TypeScript 로 빌드한 뒤, 공모전·장르별 페이지를 정적 HTML 로 미리 생성
    5. Vercel CLI 로 배포, 바뀐 주소는 IndexNow 로 검색엔진에 알림
  • 빌드 결과가 이전과 같으면 배포를 건너뜀 — 결과 파일들의 md5 를 합쳐서 비교
  • 이렇게 한 이유
    • 데이터가 하루 두 번만 바뀌니 서버가 필요 없음
    • 요약을 API 대신 이미 쓰고 있는 Claude Code 구독으로 돌리니 추가 비용이 없음

같은 공모전 합치기가 제일 까다로웠음

  • 같은 공모전이 출처마다 제목이 조금씩 다름 (회차 표기, 괄호, 띄어쓰기)
  • 마감일이 하루 차이 나는 경우가 있음
    • 원인을 보니 한 사이트가 마감일을 하루 밀려서 표기하고 있었음
    • 그래서 제목이 비슷하고 마감일이 하루 이내면 같은 공모전으로 보고, 마감일은 공고 원문과 대조해서 정함
  • 반대로 신춘문예처럼 이름이 거의 같은 다른 신문사 공모전이 잘못 합쳐지는 문제도 있었음
    • 세계일보·경상일보 신춘문예처럼 “일보 신춘문예” 부분만 같아서 비슷해 보였던 것
    • 제목을 비교할 때 “신춘문예, 일보, 문학상, 공모전” 같은 흔한 단어는 빼고 고유한 부분만 비교하도록 바꿈

한글 도메인 — 글쓰기공모전.kr

  • 영문 주소(geulmagam)는 ‘geul’ 철자가 헷갈려서, 검색어 그대로인 한글 도메인을 샀음 — 가비아 1년 16,500원
  • DNS 는 A 레코드 두 개(@, www → Vercel IP)면 끝
  • 함정은 punycode
    • 글쓰기공모전.kr 은 실제로 xn--ob0butqet42c6pmgpe.kr 로 동작함
    • Vercel, DNS, 구글 서치콘솔은 punycode 로 넣어야 함
    • 그런데 네이버 서치어드바이저는 사이트 목록에 한글로 저장함 → punycode 로 찾으면 “등록 안 됨” 으로 보임
  • 옛 주소(geulmagam.vercel.app)는 새 주소로 308 리다이렉트, 단 다른 앱이 읽는 data.json 만은 옛 주소에 그대로 둠

검색 노출 — SEO 와 GEO 에서 실제로 한 것

  • 정적 페이지 미리 생성 (231개)
    • 앱은 SPA 지만, 빌드 때 홈·장르 8개·공모전 222개 페이지를 HTML 로 만들어 둠
    • 페이지마다 title, description, canonical, 구조화 데이터(JSON-LD) 를 따로 넣음
  • AI 검색용으로 추가한 것
    • robots.txt 에서 GPTBot, ClaudeBot, PerplexityBot 등 AI 크롤러 허용
    • llms.txt — 사이트 소개와 접수 중인 공모전 전체 목록을 텍스트로 제공
    • 홈·장르 페이지에 “지금 마감이 가장 가까운 소설 공모전은?” 같은 질문형 FAQ 를 데이터에서 자동 생성
      • GEO 논문(Princeton, KDD’24)에서 수치·출처를 넣은 문장이 AI 답변에 더 많이 인용된다고 해서, 답에 건수·상금을 넣음
  • 직접 만든 점검 스크립트로 확인하다 발견한 것
    • 없는 공모전 주소(/c/zzz/)가 200 으로 열리고 있었음 — 구글이 soft 404 로 경고하는 패턴
      • SPA 라우팅용 rewrite 를 빼고, 앱 화면을 404.html 로 두어 상태 코드는 404 로 바꿈
    • 사이트맵 lastmod 가 전부 같은 날짜 — 구글은 이런 값을 무시한다고 해서 페이지별로 다르게 넣음

정리

  • 하루 두 번 바뀌는 데이터라면 서버 없이 맥 한 대 + 정적 배포로 충분함
  • 수집보다 “같은 것 합치기” 와 “마감일 검증” 에 시간이 더 들었음
  • 한글 도메인은 기억하기 쉽지만, 서비스마다 punycode / 한글 표기가 달라서 등록할 때 확인이 필요함
  • AI 검색에 나오려면 본문이 HTML 에 있어야 하고, 질문형 제목 + 수치가 들어간 직답이 유리함