개발 slecs

블로그 포스트 SEO 메타데이터 자동 생성으로 휴먼에러 방지

목차

사용자 입장에서 콘텐츠를 공유할 때 보이는 제목, 설명이 중요하다는 걸 처음 깨달았던 게 검색 결과와 SNS 링크 미리보기다. metaTitle과 metaDesc 없으면 브라우저나 플랫폼이 자의로 제목을 자르거나 본문 첫 문장을 띄우는데, 이게 사용자 클릭률에 미치는 영향은 생각보다 크다. 그런데 블로그 포스트를 INSERT할 때마다 이걸 수동으로 채워 넣었다면? 휴먼에러가 쌓일 수밖에 없다.

메타데이터 자동화가 필요했던 이유

우리 블로그는 여러 경로로 포스트를 추가한다. 뉴스 섹션(post_news.py), 주간 소식(post_weekly.py) 등 각자 INSERT 로직을 가지고 있었는데, 각 경로에서 metaTitle/metaDesc를 일일이 채우려니 두 가지 문제가 생겼다. 첫째, 코드가 중복되고, 둘째, 누군가는 빠뜨린다. 특히 SEO 메타데이터는 "있으면 좋은" 게 아니라 "꼭 있어야 하는" 데이터다. NULL 상태로 서비스되는 순간 이미 손실인 것.

그래서 INSERT 시점에 자동으로 채우는 방식을 선택했다. 포스트가 생성되는 그 순간 메타데이터도 함께 결정되게 하는 거다.

변경 전 변경 후
각 INSERT 파일에서 metaTitle/metaDesc 수동 설정 common.py의 공통 로직으로 자동 채우기
빠질 위험성 높음 빠질 가능성 거의 없음
메타데이터 규칙이 흩어짐 한 곳에서 관리 가능
SEO 일관성 보장 안 됨 모든 포스트가 동일한 규칙 적용

공통 로직화의 전략

blog/common.py가 공통 함수들을 모아두는 공간이라면, 이곳에 메타데이터 생성 함수를 놓는 게 자연스럽다. post_news.py와 post_weekly.py는 각각 다른 콘텐츠를 다루지만, 메타데이터를 채우는 규칙은 동일하거나 적어도 일관성 있게 관리되어야 한다.

# blog/common.py 예상 구조
def generate_meta_title(title, post_type=None, max_length=60):
    """
    포스트 제목에서 메타 타이틀 생성
    - 검색 엔진에서 보통 50-60자 표시
    - post_type(news, weekly 등)에 따라 prefix 추가 가능
    """
    base = title[:max_length]
    if post_type:
        base = f"[{post_type.upper()}] {base}"
    return base[:max_length]

def generate_meta_desc(content, max_length=160):
    """
    포스트 본문에서 메타 설명 추출
    - 검색 결과에서 보통 150-160자 표시
    - HTML 태그 제거, 공백 정규화
    """
    clean = strip_html_tags(content)[:max_length]
    return clean

이렇게 하면 post_news.py와 post_weekly.py에서는 INSERT 직전에 generate_meta_title(), generate_meta_desc() 호출하기만 하면 된다. 메타데이터 로직이 바뀌어야 할 때도 한 곳만 수정하면 모든 경로가 따라간다.

실전에서 배운 주의점

처음에는 "그냥 제목 잘라서 쓰면 되지" 했는데, 실제로는 고려할 게 많다. 예를 들어:

  • 길이 제한: 검색 엔진마다 다르지만, 데스크톱 약 60자, 모바일 약 54자에서 자른다. 너무 짧아도 정보가 없고, 너무 길어도 잘린다.
  • 특수문자 처리: 따옴표, 앰퍼샌드 같은 문자는 HTML 엔티티로 변환해야 한다. 그렇지 않으면 검색 결과나 SNS에서 깨질 수 있다.
  • 중복 방지: 같은 제목의 포스트가 여러 개면 prefix(뉴스, 주간소식 같은)를 붙여서 구분해주는 게 UX 입장에서 낫다.
  • 동적 콘텐츠: 만약 포스트 제목이 나중에 수정될 가능성이 있다면, metaTitle도 함께 업데이트할지 말지 팀과 논의해야 한다. "최초 생성 시만 고정" vs "매번 재생성" 중 선택.

팀 관점에서의 고민

이 변경을 merge하기 전에 팀 메시지를 남겼다. "앞으로 블로그 포스트는 자동으로 메타데이터가 채워진다. 외부에 노출되기 전에 QA 단계에서 확인해 달라"는 내용. 왜냐하면 자동 생성 로직이 100% 완벽할 리 없고, 극단적인 경우(매우 긴 제목, 특수문자만 있는 설명 등)를 테스트하려면 여러 눈이 필요하기 때문이다.

또한 메타데이터가 중요한 만큼, INSERT 실패 시 명확한 에러 메시지를 남기도록 했다. "metaTitle 길이가 150자를 초과했습니다" 이런 식으로. 나중에 운영팀이나 콘텐츠팀이 문제를 빠르게 파악할 수 있게.

결국 이건 개발자 편의(코드 중복 제거)와 비즈니스 가치(SEO 일관성, 휴먼에러 방지)가 만나는 지점이었다. 작은 변경처럼 보이지만, 검색 유입과 SNS 공유 수에 영향을 미칠 가능성이 높다. 그래서 더 신경 써서 진행했다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.