본문 바로가기

JQ Sitemap - 티스토리 사이트맵 자동 생성기 개발 후기

@Jeeqong 2025. 4. 17. 11:09
반응형

: JQ SiteMap 제작 뒷이야기

서론

왜 만들게 되었을까?

티스토리 블로그를 운영하면서 가장 불편했던 건,

사이트맵(sitemap.xml)이 자동으로 제대로 생성되지 않는다는 점이었다.

기본 제공되는 sitemap은 /category, /tag, /guestbook 등

글과 무관한 링크까지 포함되어 있고, 정작 글 본문은 잘 노출되지 않기도 한다.

“아예 내가 자동으로 sitemap을 생성해서 배포하면 안 될까?”


본론

주요 요건 및 이슈

  • 비개발자도 사용가능하도록 github ui 로만 설정해야 한다
  • 리스트를 어디서 긁어올 것인가
  • 스킨과 테마에 따라 링크 셀렉터가 다 다른데 어떻게 파싱 할 것인가
  • 최대한 단순하게 만들어서 자동 배포 되도록 해야 한다.

크롤링 기반 자동 생성기로 전환하기

처음에는 단순하게 생각했다.

글 목록만 긁어와서 URL을 모아 sitemap.xml을 만들고, 그걸 GitHub Pages로 배포하면 되지 않을까?

그런데 막상 만들어보니, 의외로 고려할 것이 많았다.

특히 티스토리의 구조적 한계와 스킨마다 제각각인 HTML 구조가 변수였고 글링크를 날짜 파싱하는 일이 가장 번거롭고 까다로운 일이 되었다.


중복 URL 이슈와 그 해결

하나의 글이 여러 카테고리에 포함되면, /category?page=1, /category?page=2에

동일한 글 링크가 반복해서 등장하는 현상이 발생했다.

이걸 그대로 수집하면 sitemap.xml에 중복 URL이 생기고, 이는 검색엔진에 안 좋은 영향을 줄 수 있다.

그래서 HTML을 파싱 하며 url을 키로 하는 딕셔너리를 만들고,

가장 먼저 등장한 URL만 저장하도록 구조를 설계했다.

post_info_dict = {}
if full_url in post_info_dict:
    continue  # ✅ 이미 수집된 URL이면 무시

딱히 어려운 로직은 아니지만,

페이지를 돌며 중복을 인식하고 “최신글 기준”으로 수집되도록 보장하는 핵심이다.


링크와 날짜 정보 추출과 저장의 험난한 여정

링크태그들의 셀렉터의 다양화 클래스가 없는 스킨도 있고 마크업 구조도 너무 다양하더라.

티스토리에서 제공하는 기본 스킨을 토대로 셀렉터를 수집하고 그 기준으로 링크를 파싱 했다.

주요 알고리즘은 최초에 파싱 하는 블로그의 셀렉터를 뽑아 config.json 에 저장하고 이후 실행은 파싱만 진행하도록 했다.

게다가 날짜 또한 사이트맵의 lastmod는 SEO 최적화에 꽤 중요한 요소다.

문제는 티스토리의 HTML 구조가 스킨마다 다 다르고, 날짜 정보가 링크에서 멀리 떨어져 있는 경우도 많다는 것.

그래서 find_nearby_date()라는 유틸 함수를 직접 만들었다.

date_tag = find_nearby_date(link_tag, date_selector)
  • 글 링크(<a href=...>) 주변에서 날짜가 있는 태그를 찾아 탐색
  • 위치 기반 거리 측정으로 가장 가까운 날짜를 선택
  • 실패할 경우 lastmod는 생략하여 sitemap에서 제외

스킨마다 클래스명이 달라서 다소 불완전하지만,

현재까지 테스트한 대부분의 스킨에서 날짜 추출에 성공했다.


GitHub Actions와 Pages를 통한 자동화

사이트맵을 만들기만 하면 반쪽짜리다.

매일 새벽에 자동으로 생성하고, 자동으로 배포되어야 의미가 있다.

이를 위해 GitHub Actions와 GitHub Pages를 조합했다.

  • GitHub Actions로 url_crawler_runner.py 실행
  • Python 크롤링으로 sitemap.xml 생성
  • GitHub Pages (gh-pages 브랜치)에 sitemap.xml 배포

자동화 트리거는 아래와 같이 구성했다.

on:
  schedule:
    - cron: '0 18 * * *' # 매일 KST 새벽 3시 실행

결과적으로, 사용자는 자신의 블로그 URL만 config에 입력하면,

매일 자동으로 sitemap.xml이 생성되고, 배포까지 끝나는 구조가 완성되었다.


기대했던 SEO 효과…는?

사실 프로젝트의 시작은

“검색엔진에 제출 가능한 sitemap을 만들자!”라는 목표였다.

 

하지만 현실은 달랐다.

  • Google / Bing / Naver 모두 사이트맵 등록 시

도메인이 다릅니다 오류 발생

  • https://username.github.io 도메인으로 만든 sitemap은

https://yourblog.tistory.com 사이트와 매칭되지 않는다.

이건 단순히 sitemap 형식 문제가 아니라, 도메인 인증 정책 때문이다.

결국, 검색엔진 등록을 위한 sitemap 용도로는 사용할 수 없게 되었다.

깃허브를 통해 공개프로젝트를 처음 만들고 배포해 본 좋은 경험이었다

README, License, CONTRIBUTING, 배지, 릴리즈, Page, Actions 다 처음 경험해 본 것들이라 좌절감도 크지만 결과에 비해 재미있었다.


그렇다면 이걸 쓸 수 있을까?

답은 못쓴다.

 

활용방법을 찾아볼 수는 있겠다

SEO에 도움 안 된다고 무의미한 건 아니다.

  • 내가 작성한 글 목록을 항상 최신 상태로 정리
  • HTML 구조를 분석해서 링크 누락 없이 수집
  • 필요하면 sitemap.html, atom.xml, rss.xml 등으로 확장 가능

특히 개발자 입장에서 티스토리 글을 다른 플랫폼과 연동할 때

사이트맵을 자동으로 파싱 해서 사용할 수 있다는 점이 유용했다.

또 해당 기능을 활용해서 검색엔진에 등록할 수 있는 방안을 모색할 거다!

아직 끝나지 않았다!!!


마무리하며

이 프로젝트는 사실 “SEO 극대화”보다는

티스토리의 닫힌 구조를 개발자의 방식으로 열어보기 위한 시도

 

누군가는 필요 없다고 할 수 있지만, (사실 나의 속마음이다)

나는 충분히 재밌고, 의미 있는 작업이었다.

지금은 공개 후 포크 테스트도 마친 상태이며,

유저들이 포크 해서 설정만 바꾸면 자동으로 sitemap이 배포되도록 되어 있다.

🔗 JQ SiteMap 프로젝트 보기

이제는 검색엔진 제출 대신,

글 목록 정리 + 외부 툴 연동 용도로 써보면 좋을 것 같다.

혹은 아예 sitemap.html 형태로 티스토리 블로그 내부 페이지로 활용하는 것도 괜찮고!

 

 

반응형
Jeeqong
@Jeeqong :: JQVAULT

Jeeqong's vault : 정보/기록을 쌓아두는 공간 웹개발 포스팅 일상 리뷰를 기록하는 공간입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차