CMS 봇 모듈 전체에 SEO 메타 정보 자동 생성 적용
목차
CMS 포스트에 메타 제목과 설명을 일괄 추가했다. 단순해 보이지만 여러 봇 모듈에 걸친 일관성 있는 기능 확장이었다.
왜 메타데이터인가
검색 엔진이 우리 콘텐츠를 어떻게 인식할지는 <meta> 태그에서 시작된다. metaTitle과 metaDesc는 검색 결과 페이지(SERP)에 노출되는 제목과 설명글이다. 쉽게 말해 사용자가 검색했을 때 우리 링크를 클릭할지 말지를 결정하는 첫 번째 인상이다.
내가 이 작업을 담당하게 된 건 — 어떤 봇 시스템들이 동적으로 콘텐츠를 생성하는데, 그때마다 메타 정보를 제대로 담지 못하고 있다는 피드백이 들어왔기 때문이다. CMS에서 포스트를 만들기만 하고 SEO 정보를 채우는 부분이 비어있었다. 사용자 입장에선 콘텐츠는 존재하는데 검색으로 발견되기 어려웠던 것.
여러 모듈, 하나의 일관성
변경 파일을 보면 패턴이 명확하다:
| 모듈 | 역할 | 수정 내용 |
|---|---|---|
| diet/admin_db.py | 스키마 정의 | 메타 필드 추가/초기화 |
| diet/generate.py | 콘텐츠 생성 로직 | 생성 시점에 메타 정보 주입 |
| formpack/generate.py | " | " |
| funeral/admin_db.py | " | " |
| funeral/generate.py | " | " |
| gov/classifier.py | 분류/라우팅 로직 | 분류 결과로 메타 정보 결정 |
흥미로운 부분은 classifier.py가 섞여있다는 것. 단순히 데이터베이스와 생성 로직만이 아니라, 분류 결과에 따라 메타 정보가 달라질 수 있다는 의미다. 즉:
- 어떤 카테고리로 분류되는가 → 메타 제목 템플릿 결정
- 본문 내용 요약 → 메타 설명 자동 생성
이런 구조에서 주의할 점은 모듈 간 데이터 흐름의 일관성이다. diet, formpack, funeral 각각은 다른 도메인이지만, 메타데이터 생성 로직이 중복되지 않으려면:
# 공통 패턴 (개념적)
def set_meta_from_content(post, content, category):
post.metaTitle = f"{category}: {extract_title(content)}"
post.metaDesc = truncate_to_160_chars(extract_summary(content))
return post
각 모듈이 이런 공통 로직을 쓸 때, 충돌 없이 잘 조율되어야 한다.
데이터 생성 파이프라인 확장의 현실
이 작업은 사실 생성 흐름 전체를 다시 점검하는 과정이었다. 기존에는:
- 콘텐츠 만들기 → CMS에 저장 → 끝
이제는:
- 콘텐츠 만들기 → 내용 분석/분류 → 메타 정보 자동 생성 → CMS에 저장
후자가 더 오래 걸린다. 따라서 성능 영향을 고려해야 한다. 메타 정보 생성이 병목이 되면 전체 생성 시간이 늘어난다. 그래서 보통:
- 요약 생성은 간단한 규칙 기반 (정규식, 텍스트 길이 자르기)
- 무거운 NLP는 나중에 비동기로
- 테스트로 생성 속도 추적
회고: 왜 이 순간에 일괄 처리했나
이 작업이 한 번에 여러 모듈을 건드린 이유는, 단순히 "모두 필요하니까"가 아니다. 차별화된 처리보다 일관된 기준으로 먼저 가자는 판단이었다. 만약 diet만 먼저 메타를 추가했다면?
- 나중에 formpack 추가할 때 "diet는 어떻게 했더라?"를 다시 찾아봐야 함
- 코드 리뷰 때 "다른 모듈과 다른 이유가?" 질문 받음
- 팀원이 다른 새 모듈 추가할 때 어느 쪽을 따를지 혼란
그래서 일괄했다. 한 번의 리뷰, 한 번의 결정으로 모든 봇이 같은 기준을 갖도록. 물론 이건 각 모듈 간에 메타 데이터 생성의 기본 로직이 충분히 비슷했기 때문에 가능했다. 만약 diet는 매우 다른 방식으로 메타를 생성해야 한다면 분리했을 것.
그다음은 테스트다. 메타 정보가 정말로 CMS에 저장되는지, 빈 문자열이 되지 않는지, 길이 제한을 초과하지 않는지 확인했을 것. 메타데이터 한 줄 누락이 검색에 미치는 영향은 생각보다 크니까.
댓글 0
첫 댓글 달아줘.