티스토리 뷰

개발자 중에서 SEO가 뭔지도 모르는 사람도 많고, 왜 자기가 만든 사이트가 검색 엔진에 노출이 안 되는지도 모르는 사람이 많다. 설사 그 이유를 알더라도 SEO의 복잡성과 생각해야 할 게 많아서 힘들어하는 분들도 많다.

여기서는 Laravel에서 SEO를 쉽게 적용시키는 패키지를 소개한다.

설치

composer require artesaos/seotools

Laravel 5.5부터는 패키지 자동 등록이 되므로 config/app.php 수정 없이 바로 쓸 수 있다. 수동 등록이 필요한 구버전이라면 아래처럼 넣는다.

// config/app.php
'providers' => [
   Artesaos\SEOTools\Providers\SEOToolsServiceProvider::class,
],

'aliases' => [
   'SEOMeta'   => Artesaos\SEOTools\Facades\SEOMeta::class,
   'OpenGraph' => Artesaos\SEOTools\Facades\OpenGraph::class,
   'Twitter'   => Artesaos\SEOTools\Facades\TwitterCard::class,
   // 또는 통합 파사드
   'SEO'       => Artesaos\SEOTools\Facades\SEOTools::class,
],

설정 파일 퍼블리시

php artisan vendor:publish --provider="Artesaos\SEOTools\Providers\SEOToolsServiceProvider"

기본 설정

config/seotools.php에 사이트 공통값을 넣어둔다. 개별 페이지에서 지정하지 않으면 이 값이 쓰인다.

'meta' => [
    'defaults' => [
        'title'       => '사이트 이름',
        'titleBefore' => false,     // 제목 뒤에 사이트명 붙이기
        'description' => '사이트 기본 설명',
        'separator'   => ' - ',
        'canonical'   => 'current',  // 정규 URL 자동 설정
    ],
],

사용법

컨트롤러에서

public function show(Post $post)
{
    SEOMeta::setTitle($post->title);
    SEOMeta::setDescription(Str::limit(strip_tags($post->body), 155));
    SEOMeta::setCanonical(route('posts.show', $post));

    OpenGraph::setTitle($post->title)
        ->setDescription(Str::limit(strip_tags($post->body), 155))
        ->setType('article')
        ->addImage($post->thumbnail_url);

    TwitterCard::setType('summary_large_image');

    return view('posts.show', compact('post'));
}

블레이드에서 출력

<head>
    {!! SEO::generate() !!}
</head>

한 줄이면 title, description, OpenGraph, Twitter Card 태그가 전부 출력된다.

JSON-LD 구조화 데이터

검색 결과에 별점, 작성일, 이미지 같은 리치 스니펫이 나오게 하려면 구조화 데이터가 필요하다.

JsonLd::setType('Article');
JsonLd::setTitle($post->title);
JsonLd::setDescription($post->summary);
JsonLd::addImage($post->thumbnail_url);

패키지가 해주지 않는 것들

여기가 중요하다. 패키지를 깔았다고 SEO가 되는 게 아니다. 메타 태그는 SEO의 일부일 뿐이다.

1. sitemap.xml

composer require laravelium/sitemap

생성한 사이트맵을 Google Search Console에 제출해야 색인이 빨라진다. 글이 5만 건을 넘으면 sitemap index로 나눠야 한다.

2. robots.txt

관리자 페이지나 검색 결과 페이지는 크롤링을 막는 게 좋다. 크롤링 예산을 낭비하기 때문이다.

User-agent: *
Disallow: /admin
Disallow: /search

Sitemap: https://example.com/sitemap.xml

3. URL 구조

/posts/1 보다 /posts/laravel-seo-guide 가 낫다. 슬러그는 한 번 정하면 바꾸지 않는 게 원칙이다. 바꿔야 한다면 301 리다이렉트를 남긴다.

4. 페이지 속도

Core Web Vitals가 랭킹 요소다. 메타 태그를 아무리 잘 넣어도 LCP가 4초면 순위가 밀린다. 이미지 최적화, 캐시 헤더, 불필요한 JS 제거가 실질적인 효과가 크다.

5. SSR 여부

블레이드로 서버에서 렌더링하면 문제가 없지만, Vue나 React SPA로 만들었다면 크롤러가 빈 화면을 볼 수 있다. Inertia + SSR이나 Nuxt/Next를 검토해야 한다.

6. 중복 콘텐츠와 canonical

같은 글이 /posts/1, /posts/1?utm_source=..., /category/dev/posts/1 로 접근되면 검색엔진 입장에서는 중복이다. canonical 태그로 대표 URL을 알려줘야 한다.

확인하는 법

  • Google Search Console — 색인 상태, 검색어, 클릭 수. 가장 중요하다
  • URL 검사 도구 — 특정 페이지가 어떻게 인식되는지 확인
  • 리치 결과 테스트 — JSON-LD가 유효한지 검증
  • PageSpeed Insights — Core Web Vitals 측정
  • 브라우저에서 소스 보기 — 메타 태그가 실제로 렌더링되는지

마지막 항목이 은근히 중요하다. 코드상으로는 넣었는데 실제 HTML에는 안 나오는 경우가 있다. 개발자 도구의 Elements가 아니라 페이지 소스 보기로 확인해야 크롤러가 보는 것과 같다.

정리

  • artesaos/seotools 로 메타·OG·Twitter Card·JSON-LD를 한 번에 처리
  • 블레이드에 {!! SEO::generate() !!} 한 줄
  • 패키지는 메타 태그만 해결한다
  • sitemap, robots.txt, URL 구조, 속도, SSR은 별도로 챙겨야 한다
  • 결과 확인은 Search Console페이지 소스 보기
댓글


최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday