증상: ‘홈페이지제작업체’로 시작하는 글 29편, 전부 합치면 끝인가?
홈페이지제작업체 검색어를 노린 글을 canonical로 통합하려고 대상을 세자 29편이 잡혔지만, 그대로 합쳤다면 살아 있는 글 하나와 아직 성적표도 받지 못한 글 열아홉 편을 함께 묻을 뻔했습니다. 계획 자체는 단순했습니다. 같은 검색어를 노린 글이 여러 편이면 구글이 어느 글을 보여 줄지 헷갈리니, 대표 글 1편을 세우고 나머지가 그 글을 원본으로 가리키게 하자는 계획이었습니다.
대상은 제목 앞머리가 홈페이지제작업체라는 헤드 키워드와 일치하는 글로 잡았습니다. 사이트 전체 137편 가운데 이 조건에 걸린 글이 29편이었습니다. 숫자만 보면 전형적인 중복 상태였고, 통합 승인도 이미 받은 상태였습니다. 남은 일은 대표 글을 하나 고르고 29편에 태그를 붙이는 것뿐이라고 생각했습니다.
이 상황은 저희가 앞서 겪은 진단 실수와도 닮았습니다. 같은 검색어 앞에서 글이 안 보이는 원인을 처음엔 글끼리 순위를 나눠 먹는 현상으로 봤다가 데이터로 반증한 적이 있습니다(홈페이지제작업체 SEO 노출 0, 카니발라이제이션 가설이 틀린 이유). 이번에도 “같은 말로 시작하면 같은 글”이라는 전제가 맞는지부터 확인해야 했지만, 처음엔 그 확인을 건너뛰려 했습니다.
처음 의심한 것: 29편이 같은 검색어를 두고 서로 다투고 있다
첫 가설은 이랬습니다. 29편이 모두 홈페이지제작업체라는 같은 검색어를 노리고, 그래서 서로 신호를 쪼개 갖고 있으니 전부 합치면 대표 글 하나에 힘이 몰린다는 가설입니다. 이 가설이 맞다면 할 일은 명확했습니다. 헤드가 일치하는 29편을 한 그룹으로 묶고 canonical을 일괄로 붙이면 끝입니다.
이 가설에는 숨은 전제가 둘 있었습니다. 하나는 제목 앞머리가 같으면 노리는 검색어도 같다는 전제, 다른 하나는 29편 모두 성과를 판정할 수 있을 만큼 오래 살아 있었다는 전제입니다. 둘 다 확인하지 않은 채였습니다. 헤드 일치는 대상을 빨리 찾는 필터일 뿐, 통합해도 되는 글인지 판정하는 기준이 아니었습니다.
그래서 일괄 적용을 멈추고 29편을 한 편씩 열어 보기로 했습니다. 제목과 본문이 실제로 무엇을 묻는 사람을 향하는지, 검색 데이터에서 어떤 성적을 내고 있는지, 언제 발행했는지를 글마다 따로 봤습니다.
어떻게 확인했나: 28일 검색 데이터와 발행일을 글마다 대조
관측 수단은 셋이었습니다. 첫째, 구글 서치 콘솔의 최근 28일 노출·클릭·평균 순위를 글 단위로 뽑았습니다. 둘째, 각 글의 발행일을 사이트의 발행 묶음 기준(코드 안에서 cohort 헤더라고 부르는 값)과 맞춰 봤습니다. 이 기준은 발행 뒤 21일이 지나야 성과를 판정할 수 있다고 정해 둔 하한입니다. 셋째, 제목과 본문이 겨냥한 검색어를 사람이 직접 읽고 분류했습니다.
이렇게 보니 29편은 하나의 덩어리가 아니었습니다. 성격이 다른 세 부류가 섞여 있었고, 그 셋을 빼고 나니 남는 글은 4편이었습니다. 1편과 5편과 19편과 4편을 더하면 정확히 29편입니다.

아래 세 절은 각 부류가 왜 통합 대상이 아니었는지, 즉 각 부류의 알리바이입니다. 처음 가설을 무너뜨린 근거가 여기 다 들어 있습니다.
알리바이 ①: 클릭을 받고 있던 1편은 왜 빼야 했나?
유지보수 범위를 다룬 글 1편은 이미 작동하고 있었습니다. 28일 동안 노출 3, 클릭 1, 평균 순위 3.7위였습니다. 숫자 자체는 작아 보이지만 같은 기간 사이트 리포트 전체 클릭이 16건이었고, 이 글이 그중 하나를 가져왔습니다.

canonical로 다른 글을 원본이라고 가리키게 하면, 이 글은 색인에서 빠지고 원본만 남습니다. 다시 말해 통합하는 순간 3.7위에 자리 잡은 이 URL이 검색 결과에서 빠집니다. 성과가 나는 글을 정리 대상에 넣으면 그건 정리가 아니라 손실입니다. 이 1편이 첫 번째 반증이었습니다. 29편이 모두 서로 다투는 약한 글이라는 가설과 맞지 않았습니다.
알리바이 ②: 업종별 5편은 정말 같은 검색어를 노렸나?
펜션·병원·교회·패션몰·쇼핑몰, 업종 이름이 붙은 글이 5편 있었습니다. 제목이 같은 헤드로 시작할 뿐, 읽어 보면 노리는 검색어가 달랐습니다. 병원 홈페이지를 찾는 사람은 병원홈페이지제작을 검색하고, 그 말은 홈페이지제작업체와 다른 질의입니다.
이 5편을 업체 선택 글 아래로 합치면, 업종 이름으로 검색하는 사람을 받아 줄 페이지가 사라집니다. 헤드 하나에 힘을 모으려다 그보다 좁고 구체적인 롱테일 검색어를 통째로 버리는 셈입니다. 제목 앞머리가 같으면 검색 의도도 같다는 전제가 여기서 깨졌습니다.
알리바이 ③: 발행 21일이 안 된 19편은 판정할 수 있었나?
가장 큰 덩어리는 19편이었습니다. 모두 8월 5일 이후에 발행한 글이라, 통합을 검토한 8월 25일 기준으로 21일 잠복 기간이 끝나지 않았습니다. 새 글은 색인과 순위가 자리를 잡기까지 시간이 걸리고, 그 기간의 노출 0은 실패의 증거가 아니라 아직 판정할 데이터가 없다는 뜻입니다.
판정할 근거가 없는 글을 통합하면, 그 글이 잘될 수 있었던 기회를 미리 없애는 꼴이 됩니다. 그래서 이 19편은 “나쁜 글”이 아니라 “아직 모르는 글”로 분류해 제외했습니다. 처음 가설의 두 번째 전제, 즉 29편 모두 판정 가능할 만큼 오래 살았다는 전제가 여기서 무너졌습니다.
세 부류를 빼고 남은 4편은 전부 28일 노출이 2 이하, 클릭이 0이었습니다. 잠복 기간도 지났고, 노리는 검색어도 헤드와 같았고, 지금 성과를 내지도 않는 글이었습니다. 통합해도 잃을 것이 없는 글은 이 4편뿐이었습니다.
두 번째 반증: 성과 1위 글을 대표로 세우면 왜 안 되나?
대상을 4편으로 줄인 뒤에도 틀린 판단이 하나 더 있었습니다. 대표 글을 고를 때 처음 떠오른 후보는 성과가 가장 좋은 글, 곧 3.7위의 유지보수 범위 글이었습니다. 이미 순위를 받은 글에 신호를 더 모으면 효과가 클 거라는 계산이었습니다.
이 판단도 기각했습니다. 대표 글은 구글이 이 검색어에 무엇을 보여 줄지 정하는 자리입니다. 홈페이지제작업체를 검색하는 사람은 업체를 고르려는 사람이지, 유지보수 범위를 알고 싶은 사람이 아닙니다. 게다가 그 글은 이미 3.7위로 자기 자리를 잡았습니다. 다른 검색어에서 잘 되는 글을 엉뚱한 검색어의 대표로 끌어오면 양쪽 모두 손해를 볼 수 있습니다.

결국 대표 글은 성과가 아니라 검색 의도 기준으로 골랐습니다. 업체를 어떻게 골라야 하는지 다룬 업체 선택 글이 홈페이지제작업체 검색자의 질문에 가장 가깝다고 판단했고, 성과 1위 글은 그룹 밖에 그대로 두었습니다.
진짜 원인: 제목 앞머리 일치를 판정 기준으로 쓴 것
돌아보면 문제는 글이 아니라 세는 방식이었습니다. 헤드 일치는 후보를 빨리 모으는 필터로는 쓸 만하지만, 통합해도 되는지 판정하는 기준으로 쓰면 성격이 다른 글을 한 묶음으로 만듭니다. 이번에는 작동 중인 글, 다른 검색어를 노린 글, 아직 판정할 수 없는 글이 모두 같은 숫자 29에 섞여 있었습니다.
통합 대상은 세 질문을 모두 통과해야 했습니다. 지금 성과를 내지 않는가, 노리는 검색어가 대표 글과 같은가, 판정할 만큼 오래 살아 있었는가. 처음 계획은 이 셋 중 어느 것도 묻지 않았습니다.
고친 방법: 4편만 대표 글로 모으고, 대상은 목록 파일 한 곳에서 정한다
통합은 4편으로 실행했습니다. 가격 구성, 견적 비교, 간단한 범위, 반복 비용을 다룬 4편이 업체 선택 글을 원본으로 가리킵니다. 페이지는 지우지 않았습니다. canonical 태그만 붙었기 때문에 판단이 틀렸다면 태그를 떼면 됩니다.
대상을 정하는 곳은 한 군데로 모았습니다. 글마다 “나는 어느 그룹 소속”이라는 필드를 넣는 방식이었다면 137편을 손대야 합니다. 대신 canonical-groups.json이라는 목록 파일 하나에 헤드, 대표 글, 소속 글, 제외한 글과 제외 사유를 적고, 사이트 빌드가 이 파일만 읽게 했습니다. 제외 사유도 같은 파일에 남겨서, 나중에 누가 “이 글은 왜 안 합쳤지?”라고 물으면 파일 한 곳에서 답이 나옵니다.

4편만 모으면 신호를 한곳에 모으는 효과는 작습니다. 그 대가로 되돌릴 일이 거의 없게 만들었습니다. canonical 태그 자체는 떼기 쉽지만, 구글이 다시 색인하기까지 몇 주가 걸립니다. 틀렸을 때 비용이 큰 쪽을 줄이는 선택이었습니다. 잠복이 끝나는 글들은 판정 뒤에 목록 파일에 한 줄씩 더해 편입하면 됩니다.
같은 실수를 막는 장치: 판정 기한과 회귀 테스트 6건
이번 일에서 따로 막아야 할 실수가 하나 더 보였습니다. 기한 없이 실행한 통합은 언제 되돌릴지 아무도 모릅니다. 실제로 같은 날 검토한 다른 결정 하나는 계획서에 적은 판정일을 3배 넘기고도 한 번도 보고하지 않은 채 남아 있었습니다.
그래서 판정 기한과 판정 규칙을 목록 파일 안에 함께 넣었습니다. 판정일은 2026-09-22입니다. 규칙은 “28일 뒤 대표 글의 노출이 10 미만이면, 상업형 검색어는 콘텐츠로 풀 수 없다고 확정한다”입니다. 이 결과가 나오면 그룹을 넓히는 근거가 아니라 이 방향 자체를 접는 근거로 씁니다.

규칙은 테스트로도 묶었습니다. 회귀 테스트 6건에 두 가지를 꼭 넣었습니다. 하나는 canonical 사슬 금지입니다. A가 B를 가리키고 B가 다시 C를 가리키는 구조는 구글이 끝까지 따라가지 않기 때문에, 소속 글이 다른 그룹의 대표가 되면 테스트가 실패합니다. 다른 하나는 기한 필수입니다. 판정일이 없는 그룹을 파일에 넣으면 빌드 전에 테스트가 막습니다.
- 대상은 목록 파일 한 곳에서만 정한다. 글 137편에 필드를 흩지 않는다
- 제외한 글과 그 사유를 같은 파일에 적는다. 작동 중·업종별·잠복기 미만
- 그룹마다 판정 기한(verdict_due)과 판정 규칙을 적는다. 없으면 테스트 실패
- canonical 사슬(A→B→C)을 금지한다. 테스트 실패
- 잠복 21일이 지난 글만 판정 대상으로 올린다
아직 끝나지 않은 것: 배포는 왜 바로 반영하지 못했나?
코드는 PR #399로 병합했지만 그날 라이브 사이트는 이전 버전 그대로였습니다. 같은 날 여러 작업의 병합이 몰려 Vercel의 일일 빌드 한도(24시간 단위)에 걸렸습니다. 병합을 끝냈다고 사이트에 반영했다고 말할 수 없는 경우였습니다.
그래서 다음 작업 목록 맨 위에 재확인 검사 3종을 올려 두고, 다음 빌드가 성공한 뒤 실제로 라이브에서 canonical이 붙었는지 확인하도록 했습니다. 통합 판정도 마찬가지입니다. 2026-09-22에 대표 글의 노출이 10을 넘는지 보는 일까지 끝나야 이 작업이 끝납니다.
같은 검색어를 노린 글이 쌓여 정리를 고민하고 있다면, 합치기 전에 세 질문부터 던져 보시길 권합니다. 지금 성과를 내지 않는가, 같은 검색어를 노리는가, 판정할 만큼 오래 살았는가. 사이트 구조나 검색 유입 진단이 필요하면 상담으로 문의하실 수 있습니다.