SEO에 부합하는 게시글 URL 만들기

Kangjik Kim·2025년 1월 23일
0

블로그 게시글 상세 페이지의 표준 URL을 /blog/1/ 처럼 사용하도록 만들었다.
SEO 친화적인 게시글 URL을 만들기 위해 URL 패턴을 변경해보자.
publish 날짜와 slug 값을 모두 사용해 단일 게시글에 대한 URL을 만들자.
날짜를 조합해 /blog/2025/1/test-post1/ 과 같은 게시글의 상세 페이지 URL을 만들 것이다.
이렇게 하면 게시글의 제목과 날짜를 모두 포함해 검섹 엔진에 색인을 생성할 수 있는 SEO 친화적인 URL을 제공하게 된다.

단일 게시글을 게시 날짜와 slug의 조합으로 조회하려면 기존 게시글과 동일한 slug와 publish 날짜를 가진 게시글이 존재하지 않도록 해야 한다.
게시글의 게시 날짜를 기준으로 슬러그를 고유하게 정의해 Post 모델이 중복 게시글을 저장하지 않도록 하자.

models.py 파일을 편집해 unique_for_date 매개 변수를 Post 모델의 slug 필드에 추가해보자.

slug = models.SlugField(max_length=250, unique_for_date='publish')

unique_for_date를 사용하면 이제 slug 필드가 게시 필드에 지정된 날짜의 중복을 허용하지 않게 된다.
publish 필드는 DateTimeField의 인스턴스지만 고유 값의 확인은 날짜(시간x)에만 수행된다.
쟝고는 주어진 게시 날짜에 새로운 게시글이 기존 게시글과 동일한 슬러그를 사용해 저장되는 것을 방지학 ㅔ된다.

모델을 변경했으니 마이그레이션을 만들어 보자.
unique_for_date는 DB 수준에서 적용되지 않으므로 DB 마이그레이션이 필요하지 않지만,
쟝고는 마이그레이션을 사용해 모든 모델 변경사항을 추적한다.
마이그레이션을 모델의 현재 상태와 일치시키기 위해 마이그레이션을 생성해보자.

python manage.py makemigrations blog

Migrations for 'blog':
  blog/migrations/0002_alter_post_slug.py
    - Alter field slug on post

쟝고는 블로그 애플리케이션의 마이그레이션 디렉터리 내에 0002_alter_post_slug.py 파일을 생성했다.
이제 마이그레이션을 적용해보자.

python manage.py migrate   

Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0002_alter_post_slug... OK

이렇게 하면 쟝고는 모든 마이그레이션이 적용되고 모델과 동기화된 것으로 간주한다.
unique_for_date 는 DB 수준에서 적용이 강제되지 않아 DB에서 수행되는 작업은 없다.

URL 패턴 수정하기

게시글 상세 URL에 게시 날짜와 슬러그를 사용하도록 URL 패턴을 수정해 보자.
blog의 urls.py 파일의 게시글 상세 URL을 편집해 보자

path('<int:year>/<int:month>/<int:day>/<slug:post>/',
         views.post_detail, name='post_detail'),

post_detail 뷰의 URL 패턴은 다음 인수를 사용하게 된다.

  • year
  • month
  • day
  • post

뷰 수정하기

이제 새로운 URL 매개 변수와 일치하도록 post_detail 뷰의 매개 변수를 변경하고 이를 사용해 해당하는 Post 객체를 조회해야 한다.

views.py 파일을 열어 아래와 같이 post_detail 뷰를 편집해 보자.

post = get_object_or_404(Post, status=Post.Status.PUBLISHED, slug=post,
                             publish__year=year, publish__month=month, publish__day=day)

year, month, day와 post 인수를 받고 지정된 슬러그 및 게시 날짜로 게시된 게시글을 검색하도록 post_detail 뷰를 수정했다. 앞서 Post 모델의 slug 필드에 unique_for_date = 'publish' 를 추가해 주어진 날짜에 해당 슬러그가 포함된 게시글이 하나만 있도록 했기에 단일 게시글을 조회할 수 있다.

게시글의 표준 URL 수정하기

이제 새로운 URL 매개 변수와 일치하도록 블로그 게시글의 표준 URL 매개 변수를 수정해보자.
blog 애플리케이션의 models.py 파일을 열어 get_absolute_url() 메서드를 편집하자.

def get_absolute_url(self):
        return reverse("blog:post_detail", args=[self.publish.year, self.publish.month, self.publish.day, self.slug])

그 다음 브라우저로 돌아가 게시글들 중 하나의 제목을 클릭해 게시글 상세 뷰를 볼 수 있다.
브라우저의 주소를 살펴보면
http://localhost:8000/blog/2025/1/22/test3/ 와 같이 SEO 친화적인 블로그 게시글을 갖게 된 것을 확인할 수 있다.

0개의 댓글