내부 링크 거는 기준 · 어디에 걸어야 구글이 읽나
내부 링크를 걸어도 아무 일이 없는 경우가 많다. 자사 블로그 57편의 링크 구조와 크롤 기록을 맞춰 보니 개수가 아니라 자리가 갈랐다. 소스를 무엇으로 고르고 어디에 넣어야 실제로 듣는지, 목록 페이지가 왜 통로가 되지 못하는지 실측으로 정리했다.
내부 링크를 걸라는 말은 어디서나 듣는다. 그런데 걸어도 아무 일이 없는 경우가 많다.
우리는 자사 블로그 57편의 링크 구조와 크롤 기록을 매일 맞춰 봤다. 그 과정에서 확인한 것은 링크를 몇 개 거느냐보다 어디에 거느냐가 결정적이라는 점이다. 같은 링크라도 어떤 자리에서는 듣고 어떤 자리에서는 아무 영향이 없었다.
이 글은 그 차이를 만드는 조건을 적는다. 일반론이 아니라 우리가 직접 세어 본 것만 담았다.
내부 링크가 듣기 위한 두 가지 조건
링크가 실제로 일을 하려면 둘 다 만족해야 한다.
하나, 그 링크를 담은 페이지가 다시 읽혀야 한다. 링크는 페이지 안에 있는 문자열이다. 그 페이지를 검색엔진이 다시 가져가기 전까지 링크는 존재하지 않는 것과 같다. 어제 넣은 링크는 그 글이 다시 읽힌 뒤부터 작동한다.
둘, 본문 안에 있어야 한다. 페이지마다 같은 자리에 같은 모양으로 반복되는 목록은 그 페이지의 내용으로 읽히지 않을 수 있다. 문장 안에서 맥락과 함께 걸린 링크와는 취급이 다르다.
이 둘을 모르면 "링크를 열 개 걸었는데 왜 안 되지"라는 상태가 된다. 열 개를 아무도 읽지 않는 페이지의 하단 목록에 걸었다면 실제로 한 일은 없다.
반대로 조건을 알면 할 일이 단순해진다. 최근에 읽힌 페이지를 찾고, 그 본문에서 맥락이 맞는 문장을 찾고, 거기에 하나를 건다. 나머지는 기다리는 것이다.
어디에 거는지가 무엇을 거는지보다 앞선다
우리 57편을 발견 경로로 나눠 크롤 여부를 맞춰 봤다.
| 검색엔진이 기록한 발견 경로 | 편수 | 크롤된 비율 |
|---|---|---|
| 다른 페이지의 링크 | 18 | 83% |
| 사이트맵에만 있음 | 12 | 25% |
| 아무 경로도 없음 | 23 | 0% |
발행일이 비슷한 것끼리 다시 묶어도 차이는 유지됐다. 나이 때문이 아니다.
여기서 읽을 것은 83%가 아니라 **0%**다. 어디서도 연결되지 않은 글은 사이트맵에 이름이 올라가 있어도 읽히지 않았다. 사이트맵은 존재를 알리는 것이지 방문 순서를 정하지 않는다. 이 숫자가 어떻게 나왔고 색인이 안 될 때 무엇을 먼저 보는지는 구글 색인 안 되는 이유에 따로 적었다.
소스를 고르는 기준은 순위가 아니라 마지막 크롤 날짜다
새 글에 링크를 줄 기존 글을 고를 때, 보통 순위가 높거나 방문자가 많은 글을 고른다. 우리도 처음엔 그렇게 했다.
그런데 위의 첫 번째 조건을 생각하면 기준이 달라진다. 중요한 것은 그 페이지가 언제 다시 읽히느냐다. 순위가 높아도 몇 달째 안 읽힌 페이지에 링크를 걸면, 그 몇 달 동안 아무 일도 일어나지 않는다.
그래서 우리는 후보 글들의 마지막 크롤 날짜를 먼저 확인하고 가장 최근 것부터 고른다. 서치콘솔 URL 검사에서 한 줄로 나온다.
이 둘이 얼마나 다른지는 실제로 세어 보면 안다. 우리 경우 순위가 가장 높은 글과 가장 최근에 읽힌 글은 겹치지 않았다.
실무에서는 이렇게 한다. 새 글과 주제가 이어지는 기존 글을 대여섯 편 추린다. 각각의 마지막 크롤 날짜를 확인한다. 그중 가장 최근에 읽힌 두 편을 고른다. 주제 근접도는 후보를 추리는 단계에서만 쓰고, 최종 선택은 날짜로 한다.
날짜가 다 오래됐다면 그 주제 영역 전체가 잘 안 읽히고 있다는 뜻이다. 이때는 억지로 고르는 대신, 최근에 읽힌 다른 영역의 글에서 연결할 자리가 있는지 본다. 주제가 조금 멀어도 실제로 읽히는 페이지가 낫다.
링크를 넣었으면 갱신 시각이 움직여야 한다
소스를 잘 골라도 한 가지가 더 남는다. 그 페이지의 사이트맵 갱신 시각이 바뀌어야 "다시 읽어 달라"는 신호가 나간다.
내용을 고쳤는데 갱신 시각이 그대로인 상태는 생각보다 흔하다. 이 경우 작업은 했는데 알리지 않은 셈이고, 나중에 효과를 확인할 방법도 없어진다. 고치는 것과 고쳤다고 알리는 것은 별개의 동작이다.
목록에 걸린 링크와 문장에 걸린 링크는 다르다
블로그 하단의 "관련 글" 목록은 만들기 쉽고 개수도 늘리기 쉽다. 그런데 이 방식에는 한계가 있다.
| 하단 관련 글 목록 | 본문 문장 안의 링크 | |
|---|---|---|
| 만드는 비용 | 자동 생성, 낮음 | 사람이 자리를 찾아야 함 |
| 맥락 | 왜 그 글인지 설명 없음 | 어느 문장에서 왜 넘어가는지 드러남 |
| 페이지마다 | 같은 자리 같은 모양 | 글마다 다름 |
우리는 본문 안에서만 링크를 건다. 한 편에 두세 개를 넘기지 않고, 그 문장을 읽다가 자연스럽게 더 알고 싶어지는 자리에만 넣는다. 자리를 못 찾으면 넣지 않는다.
이 방식은 느리다. 글을 읽고 자리를 찾아야 하니 한 건에 몇 분이 든다. 대신 한 건의 효과가 다르다.
자리를 찾는 요령이 하나 있다. 대상 글의 주제어가 소스 글 본문에 이미 등장하는 문장을 찾는 것이다. 그런 문장이 있다면 그 자리는 이미 맥락이 맞춰져 있다. 없다면 억지로 만들지 말고 다른 소스를 본다. 문장을 새로 써서 링크를 끼워 넣기 시작하면 그때부터는 독자를 위한 것이 아니다.
한 가지 더. 소스 글에 링크가 이미 네댓 개 있다면 거기에 또 넣기보다 링크가 적은 글을 찾는다. 한 페이지가 내보내는 링크가 많아질수록 각각의 비중은 나뉜다.
블로그 목록 페이지는 생각보다 적게 링크한다
여기서 많이들 놓치는 것이 있다. 블로그 목록 페이지가 모든 글로 가는 통로일 것이라고 가정하는 것이다.
우리 블로그 목록 페이지의 HTML을 실제로 열어 세어 봤다. 글 링크가 10개였다. 최신 10편이고, 나머지는 다음 페이지로 넘어가야 나온다.
| 위치 | 글 수 | 목록 페이지에서 직접 링크됨 |
|---|---|---|
| 1페이지 | 10 | 예 |
| 2페이지 이후 | 47 | 아니오 |
즉 열한 번째 글부터는 목록 페이지를 통한 경로가 없다. 새 글을 올릴 때마다 가장 오래된 글이 한 칸씩 밀려나면서 조용히 경로를 잃는다.
이것이 우리 미크롤 글들이 몰려 있던 자리다. 목록 페이지가 있으니 다 연결돼 있으리라 여겼는데, 실제로 연결된 것은 최근 열 편뿐이었다.
확인하는 방법은 간단하다. 목록 페이지를 브라우저에서 열고 페이지 소스를 본 다음, 글 주소 형태가 몇 번 나오는지 센다. 화면에서 스크롤하며 세는 것과 다를 수 있다 — 더 불러오기 방식이라면 처음 응답에는 일부만 들어 있다.
여기서 한 가지가 더 갈린다. 목록이 처음 응답에 들어 있는지, 아니면 화면이 뜬 뒤에 채워지는지다. 후자라면 검색엔진이 받은 문서에는 링크가 없을 수 있다. 페이지 소스를 직접 보는 이유가 이것이다.
페이지네이션은 발견 경로로 치지 않는 편이 낫다
그러면 2페이지 이후는 어떻게 되나. 목록 페이지에 다음 페이지 링크가 있으니 따라갈 것 같지만, 우리 기록에서는 그 페이지들이 한 번도 읽히지 않았다.
주소 끝에 ?page=2 같은 형태로 붙는 목록은 우선순위가 낮게 다뤄지는 경우가 많다. 사이트맵에 넣어 두어도 그대로였다.
그래서 페이지네이션을 발견 경로로 계산에 넣지 않는 편이 안전하다. 목록 2페이지 이후의 글은 다른 글의 본문에서 직접 링크를 받아야 한다고 보는 쪽이 실제에 가깝다.
그리고 목록 페이지 자체도 확인 대상이다. 우리는 목록 페이지의 마지막 크롤 날짜를 보고 그것이 두 달 가까이 멈춰 있다는 것을 알았다. 홈은 며칠 전에 읽혔는데 목록만 오래 멈춰 있었다. 목록 페이지가 안 읽히면 거기 걸린 최신 열 편마저 그 경로로는 전달되지 않는다.
이건 목록 페이지에 링크가 몇 개인지와 별개의 문제다. 링크 수는 구조의 문제이고, 읽히는 빈도는 그 페이지가 사이트 안에서 어떤 위치인지의 문제다. 둘 다 봐야 어디가 막혔는지 나온다.
링크를 심은 뒤 무엇을 확인하나
넣고 끝내면 들었는지 알 수 없다. 순서대로 본다.
하나, 링크가 실제 HTML에 나오는가. 편집기에서 저장했다고 화면에 나온 것은 아니다. 배포 방식에 따라 반영에 시간이 걸린다. 브라우저에서 페이지 소스를 열어 그 주소가 있는지 본다.
둘, 소스 글의 갱신 시각이 움직였는가. 사이트맵에서 그 주소의 갱신 시각을 확인한다. 사이트맵과 서치콘솔을 아직 연결하지 않았다면 구글 검색 등록 기준이 먼저다.
셋, 소스 글이 다시 읽혔는가. 여기서부터는 기다리는 구간이다. 우리 경험으로는 며칠에서 일주일 이상 걸리고 고르지도 않다. 사흘 연속 여러 페이지가 읽히다가 나흘을 건너뛴 적도 있다.
넷, 그 다음에 대상 글의 발견 경로가 생겼는가. 소스가 읽힌 뒤에야 확인할 수 있다. 순서를 건너뛰고 대상 글부터 보면 아직 아무 일도 안 일어난 시점에 판정하게 된다.
이 순서를 지키면 실패했을 때 어디서 멈췄는지도 같이 나온다. 2단계에서 막혔으면 배포나 캐시 문제이고, 3단계에서 오래 걸리면 그 소스가 애초에 잘 안 읽히는 페이지였던 것이고, 4단계까지 갔는데 변화가 없으면 그때 링크 자체를 의심한다. 한꺼번에 보면 어디가 문제인지 영영 모른다.
몇 개를 걸어야 하나
개수 기준을 먼저 세우면 자리를 찾는 대신 개수를 채우게 된다. 우리가 쓰는 기준은 이렇다.
받는 쪽 기준으로 하나는 반드시. 아무 데서도 링크받지 못하는 글이 없게 한다. 우리는 이 기준으로 12편을 찾아 나흘 만에 8편으로 줄였다. 주는 쪽 개수를 세는 것보다 받는 쪽이 비어 있는지 세는 편이 훨씬 유용하다. 전자는 늘려도 한계효용이 빨리 떨어지고, 후자는 0과 1의 차이라서 그렇다.
주는 쪽은 한 편에 두세 개. 그 이상은 자리가 억지가 된다. 문장을 링크에 맞춰 고치기 시작했다면 이미 넘은 것이다.
같은 글에 반복해서 걸지 않는다. 한 소스에서 같은 대상으로 두 번 거는 것은 한 번과 크게 다르지 않다. 다른 소스를 찾는 편이 낫다.
하지 말아야 할 것
자동으로 관련 글을 붙이고 끝내는 것. 만들기는 쉬운데 위의 두 조건 중 어느 것도 보장하지 않는다. 자동화가 어디까지 맡을 수 있고 어디서 사람이 들어가야 하는지는 AI 블로그 자동 포스팅, 어디까지 맡기나에서 다뤘다.
앵커 텍스트를 키워드로 맞추는 것. 문장이 어색해지면 읽는 사람이 먼저 안다. 링크는 문장의 일부여야 한다. 같은 대상에 거는 링크마다 문구가 조금씩 다른 것은 자연스러운 일이고, 그걸 하나로 통일하려고 문장을 비트는 순간 손해가 더 크다.
오래된 글을 방치하는 것. 목록에서 밀려난 글은 조용히 경로를 잃는다. 주기적으로 어느 글이 아무 링크도 못 받고 있는지 세어 보는 편이 좋다.
여러 가지를 같은 날 바꾸는 것. 링크를 심고 제목도 고치고 내용도 늘리면, 크롤 주기가 길어서 나중에 무엇이 들었는지 가릴 수 없다.
한 소스에 링크를 몰아 넣는 것. 최근에 읽힌 글을 하나 찾았다고 거기에 대상 글 다섯 개를 다 걸면, 그 페이지가 다시 읽힐 때까지 다섯 건이 전부 묶여서 기다린다. 소스를 나눠 두면 하나가 늦어도 나머지는 간다.
정리하면
내부 링크에서 실제로 결정적인 것은 세 가지다.
받는 쪽에 하나도 없는 글이 있는지를 먼저 센다. 0과 1의 차이가 가장 크고, 그 다음부터는 완만하다.
소스는 최근에 읽힌 페이지로 고른다. 순위나 방문자 수가 아니다. 링크는 그 페이지가 다시 읽혀야 전달되기 때문이다.
본문 문장 안에 넣는다. 자동 목록은 방문자에게는 쓸모가 있지만 발견 경로로 계산하지 않는다.
나머지는 대부분 기다리는 일이다. 크롤 주기는 우리가 정하지 못하고 고르지도 않으므로, 조치마다 확인할 날짜를 미리 적어 두는 편이 결국 빠르다.
자주 묻는 질문
내부 링크만으로 색인이 되나요?
우리 기록에서는 크롤된 글의 대부분이 같은 도메인 안의 링크로 발견됐다. 다만 크롤과 색인은 다른 단계다. 링크는 읽히게 하는 것까지 책임지고, 읽은 뒤 넣을지는 내용이 정한다.
오래된 글에서 새 글로 거는 것과 반대 중 어느 쪽이 낫나요?
발견을 목적으로 한다면 읽히는 글에서 안 읽히는 글로 거는 방향이다. 보통 오래된 글이 이미 읽히고 있으므로 오래된 글에서 새 글로 가는 쪽이 많아진다.
관련 글 목록을 없애야 하나요?
없앨 필요는 없다. 방문자에게는 쓸모가 있다. 다만 그것을 발견 경로로 계산하지 않는 것이 요점이다. 목록이 있으니 연결됐다고 여기면 실제로는 비어 있는 곳을 못 본다.
링크를 걸고 얼마나 기다려야 하나요?
소스 글이 다시 읽히는 시점에 달렸다. 우리는 조치마다 일주일 뒤 날짜를 정해 두고 그날 확인한다. 하루 이틀 보고 뒤집으면 아직 아무 일도 일어나지 않은 시점에 판정하는 셈이 된다.
링크를 걸면 순위도 오르나요?
우리가 확인한 것은 읽히게 하는 효과까지다. 읽히지 않던 글이 읽히면 검색에 나타날 수 있게 되니 결과적으로 노출이 생기지만, 이미 읽히고 색인된 글의 순위가 링크 몇 개로 움직이는지는 우리 데이터로 말할 수 없다. 둘을 섞어서 기대하지 않는 편이 낫다.
외부 사이트에서 오는 링크는 필요 없나요?
발견만 놓고 보면 내부 링크로 충분했다. 우리 크롤된 글은 전부 같은 도메인 안의 링크로 발견됐다. 다만 사이트 전체가 얼마나 자주 읽히는지는 다른 문제이고, 거기에는 외부에서 들어오는 링크가 영향을 준다. 개별 글의 발견은 내부 링크로, 사이트의 읽히는 빈도는 외부 링크로 나눠 생각하면 정리가 쉽다.
어느 글이 링크를 못 받고 있는지 어떻게 아나요?
글 본문에서 내부 주소를 모두 뽑아 대상별로 세면 된다. 도구 없이도 할 수 있고, 한 번 세어 두면 어디가 비어 있는지 바로 보인다. 검색엔진이 기록한 발견 경로와 같이 보면 더 정확하다.
참고 자료
- Google 검색의 작동 방식 — Google 검색 센터 — 크롤러가 링크를 따라 이동하는 방식.
- 사이트맵에 대해 알아보기 — Google 검색 센터 — 사이트맵이 보장하는 것과 보장하지 않는 것.
- 페이지 색인 생성 보고서 — Search Console 도움말 — 발견 경로와 상태 문구를 확인하는 화면.