Today
-
Total
-
  • [django] SEO를 위한 사이트맵(sitemap.xml)을 장고 프로젝트에 등록하기
    Dev 2020. 8. 14. 18:00

     

     

    안녕하세요.

     

    오늘은 검색 엔진 최적화(SEO)를 위해 사이트맵을 장고 프로젝트에 추가해 봅시다.

     

    그전에, 사이트맵이 무엇인지 알아보아야겠죠?

     

     

    사이트맵이란 무엇인가요?에 대한 ⭐구글 웹마스터 공식문서⭐의 대답

    사이트맵은 사이트에 있는 페이지, 동영상 및 기타 파일과 각 관계에 관한 정보를 제공하는 파일입니다. Google과 같은 검색엔진은 이 파일을 읽고 사이트를 더 지능적으로 크롤링하게 됩니다. 사이트맵은 내가 사이트에서 중요하다고 생각하는 페이지와 파일을 Google에 알리고 이러한 파일에 관한 중요한 정보를 제공합니다. 예를 들어, 페이지의 경우 마지막 페이지 업데이트 시간, 페이지 변경 빈도, 페이지의 대체 언어 버전 등에 관해 알립니다.

    사이트맵을 사용하여 동영상, 이미지 콘텐츠 등 페이지의 특정 유형의 콘텐츠에 관한 정보를 제공할 수 있습니다. 예:

    • 사이트맵 동영상 항목은 동영상 길이, 카테고리, 연령 적합성 등급을 지정할 수 있습니다.
    • 사이트맵 이미지 항목은 이미지 주제, 유형 및 라이선스를 포함할 수 있습니다.

    (출처: 구글 Search Console 고객센터)

    https://support.google.com/webmasters/answer/156184?hl=ko

     

     

     

     

    이해가 가셨나요 ?

    즉 홈페이지의 주인은 사이트맵을 설정함으로써 페이지의 활성화 상태, 페이지의 관계도, 중요한 페이지 우선순위 등을 검색엔진에게 알려줄 수 있다는 것이죠!

     

    검색 엔진에서 다음과 같이 나오는 메뉴를 '사이트링크'라고 하는데요.

     

    내가 애용하는 사이트인 패스트캠퍼스 구글 검색 결과

     

     

    해당 도메인이 등록해 놓은 사이트맵을 바탕으로 한 알고리즘을 거친 결과로 띄운다고 보실 수 있겠습니다.

    (꼭 사이트맵에 의해서만 결정되는 건 아닙니다!)

    저부분을 커스텀하는 것은 불가능하지만, 사이트맵(+@)를 통해 사이트링크 알고리즘에 개입하여 어느정도 커스텀되게끔 유도가 가능하다는 것이죠!

     

     

    사실 티스토리나 개인 도메인을 사용한 홈페이지의 경우, 사이트맵을 설정하는 건 어렵지 않습니다.

    구글 검색엔진은 항상 도메인/sitemap.xml에서 사이트맵을 찾아가기 때문에, 정적 파일이든 뭐든 해당 path 연결만 시켜주면 되거든요!

    단, 이럴 경우 사이트맵에 변동이 생기면 sitemap.xml 파일을 직접 수정해 주어야 겠죠 ?

     

     

    하지만 장고에서는, 동적으로 사이트맵을 생성해주는 기능을 제공해주고 있기 때문에 우리는 이것을 사용하여 사이트맵을 생성해주도록 합시다.

     

     


    잠깐! 😳

    이번 포스팅은 다음을 전제로 합니다.

     

    1. 이미 생성된 장고 프로젝트가 있다

    2. 이미 (어느정도 기능을 구현하여) 만들어 놓은 app이 있다

    3. 사이트맵을 적용할 수 있는 도메인이 있다(로컬에서도 확인이 가능하지만, 붙이는 의미가 없겠죠?)


     

     

    1. settings.py에 장고 Sitemap 라이브러리를 추가

     

    settings.py에서 'INSTALLED_APPS'를 찾아 다음 부분을 추가해 줍니다.

    INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    # 추가
    'django.contrib.sites', 
    'django.contrib.sitemaps', 
    ]

     

    그 다음 settings.py에서 아무 곳에나 다음 코드를 추가해 줍니다.

    # sitemap
    SITE_ID = 1

     

     

    2. sitemaps.py를 생성한다

     

    from django.urls import reverse
    from django.contrib.sitemaps import Sitemap
    
    class StaticViewSitemap(Sitemap):
        priority = 0.5
        changefreq = 'weekly'
        def items(self):
            return [
                'index',
                'mypage:basket',
                'support:qna',
            ]
        def location(self, item):
            return reverse(item)
    
    

     

     

    저는 메인 화면, 마이페이지의 장바구니, 고객센터 세 페이지를 사이트맵에 추가한다고 가정하겠습니다.

     

    priority는 해당 클래스의 우선 순위를 나타냅니다. 0~1사이 값을 지정하게 되는데,

    다른 클래스를 여러 개 더 추가하여 사이트맵에 추가할 경우 어떤 것을 (상대적으로) 우선하여 구글에게 제공할 지를 결정합니다.

     

    changefreq는 검색엔진에 대한 해당 내용이 얼마나 자주 바뀌는 지를 알려주지만, 이거를 'always'로 지정한다고 해서 검색 엔진이 지정된 주기로 무조건 인덱싱하도록 결정하는 것은 아닙니다. 따라서 그냥 상대적인 정보를 주는 부분이며 강력하게 작동한다고 보기는 힘들겠네요.

     

     

     

    그다음 item에서 작성하는 내용이 중요한데요.

    사이트맵에 추가하고 싶은 app-name:url-namespace를 입력하는 것입니다.

    저는 support 앱에 qna라는 네임스페이스를 가진 url이 연결되어 있기 때문에, 다음과 같이 작성한 것입니다.

     

    support/urls.py

    urlpatterns = [
    
    	...
        path('qna', question_view, name='qna'),
    
    ]

     

    마찬가지로 mypage앱에 'basket'을 name으로 갖는 url을 연결해 주어야 합니다.

     

    각 앱의 urls.py에서 누락된 부분을 sitemaps.py에서 참조할 경우 NOT_MATCH ERROR가 발생하게 됩니다.

     

     

    이제 sitemaps.xml를 동적으로 만들어 주는 클래스 작성을 마쳤습니다. 

    이제 도메인/sitemap.xml에 진입하였을 때 해당 클래스가 실행되도록 path 연결을 해 줍시다.

     

     

    3. urls.py 수정하기

     

    from django.contrib import admin
    from django.urls import path, include
    from django.conf.urls import url
    from django.views.generic import TemplateView
    
    from .views import *
    
    # 추가 import
    from .sitemaps import *
    from django.contrib.sitemaps.views import sitemap
    
    
    sitemaps = {
        'static':StaticViewSitemap,
    }
    
    urlpatterns = [
       	...
        # sitemap
        path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='sitemap'),
    	...
    ]
    
    
    
    

     

    'sitemap.xml'에 앞에서 만들어준 클래스를 매칭시켜 줍시다.

    import를 하고, sitemaps 객체를 만들어 path와 연결시켜 줍니다.

     

    그리고 나서 push를 하고 /sitemap.xml에 진입해 보면?

     

     

     

    짠, 이렇게 확인이 되네요!

     

     

     

    이제 해당 내용을 메인 도메인에 배포하고, 웹마스터에서 사이트맵 연결시에

     

    도메인/sitemap.xml

     

    URL을 입력해 주면 되겠습니다.

     

     

     

     

    이상으로 포스팅을 마칩니다.

    댓글