1. 서론
사이트를 만들고 배포를 하면 일반적으로 사이트가 바로 구글, 네이버 같은 검색엔진에 자동으로 나오는 줄 알았던 바보
최근 외주를 받으면서 웹사이트를 만들어주고 있다.
회사 사이트인데, 구글 검색, 네이버 검색에 최소한 보여야 하지 않나!
그래서 검색 시 사이트가 나오는 방법을 적용해보도록 한다.
1.1 기본 개념
- SEO(Search Engine OPtimization) : 검색엔진 최적화
2. 본론
2.1. 검색엔진 (google, naver, bing) 사이트 노출 과정
일단 크게 보면 사이트를 배포했다고 구글, 네이버같은 검색엔진에 노출되는 것이 아니다.
검색엔진은 인터넷에 수 많은 사이트를 자동으로 찾아 내용을 읽고, 저장한 뒤, 사용자의 검색어에 맞는 페이지를 찾아 골라주는 과정을 거친다.
2.1.1. 크롤링
구글과 네이버같은 검색엔진들을 각각 검색로봇을 가지고 있다. (구글 검색봇은 googlebot, 네이버는 yeti)
검색로봇은 다른 사이트의 링크, 사이트맵, 검색 도구에 등록된 정보를 바탕으로 웹사이트를 찾아온다. 검색봇이 내 사이트에 들어와서 각 페이지의 주소, 제목, 본문, 이미지 설명, 링크들을 읽는다!
이때 검색 봇의 접근이 막혀있다면 당연히 크롤링이 안되고, 검색 결과에 나타날 수 없을거다.
+ robots.txt 이 파일을 만들어줘야 한다. 일종의 검색봇에게 어떤 페이지를 방문해도 되는지 알려주는 안내문이다.
2.1.2 색인 생성 (크롤링 통해 읽은 내용을 검색 디비에 저장)
검색 봇이 페이지를 읽었다고 검색 결과에 바로 표시가 되는 것이 아님!
검색엔진은 읽어온 내용을 분석해 검색 디비에 저장할지 결정한다 - 색인생성(Indexing)
예를 들어 재단 홈페이지에 '후원 안내' 페이지가 있다면, 검색엔진은 이 페이지가 어떤 주제의 페이지인지 파악하고 관련 검색어와 연결해 사용자들이 검색할떄 해당 사이트를 볼 수 있도록 하는 것이다. 그래서 페이지 제목과 본문이 명확하고, 다른 페이지와 내용이 중복되지 않게 하는 것이 중요하다!!
+ sitemap.xml 검색엔진이 색인을 만들기 쉽게 하기 하려면 사이트의 주요 페이지 목록을 담은 이 파일을 제공하는 것이 좋다
2.1.3. 순위 결정: 검색어에 맞는 결과를 보여주는 과정
사용자가 '--재단의 봉사' 라고 검색하면 검색엔진은 수많은 관련 페이지 중에서 가장 관련성 높고 유용하다고 판단한 결과를 순서대로 보여주게 된다.
단순 특정 단어가 많이 들어가는게 아니라 페이지 내용이 검색어와 잘 맞는지, 정보가 실제로 도움이 되느닞, 사이트가 모바일에서 잘 열리는지, 다른 신뢰할 만한 사이트에서 연결하고 있는지 등 여러 요소를 종합적으로 판단한다
종합적으로 보았을때 seo 는 검색엔진과 사용자 모두가 사이트 내용을 쉽게 이해하도록 만드는 작업이라고 볼 수 있다.
(순위 결정은 참고로 검색엔진 상위 노출 로직과는 다른 이야기다.)
2.3. robots.txt, sitemap.xml 만들기
앞에서 크롤링과 색인 얘기를 했는데, 검색봇이 내 사이트를 제대로 읽어가게 하려면 결국 이 두 파일이 핵심이다. 하나씩 뭔지, 어떻게 만드는지 정리해본다.
2.3.1. robots.txt — 검색봇 출입 안내문
robots.txt는 사이트 루트(https://내도메인/robots.txt)에 위치하는 텍스트 파일로, "이 페이지는 봐도 되고, 이 페이지는 보지 마"를 검색봇에게 알려주는 규칙이다. 강제성은 없고 봇들이 "매너로" 지켜주는 약속에 가깝지만, 구글봇/네이버 예티 같은 정상적인 검색봇은 대부분 이 규칙을 따른다.
< 기본 문법>
User-agent: * # 모든 검색봇에게 적용
Allow: / # 기본적으로 전체 허용
Disallow: /login # 로그인 페이지는 크롤링 금지
Disallow: /admin/* # /admin/으로 시작하는 모든 경로 금지
Sitemap: https://내도메인/sitemap.xml # 사이트맵 위치도 여기 알려줌
- User-agent: 규칙을 적용할 봇 (*는 전체)
- Allow / Disallow: 허용/차단할 경로
- Sitemap: 사이트맵 파일 위치를 여기 적어주면 검색봇이 사이트맵을 더 쉽게 찾아감
왜 필요?
로그인 페이지, 회원가입 페이지, 글쓰기(작성/수정) 페이지처럼 관리자만 접근하는 페이지나 검색 결과에 노출될 필요가 없는 페이지는 여기서 막아주는 게 좋다. 안 그러면 검색봇이 의미 없는 페이지까지 긁어가면서 정작 중요한 페이지(소개, 사업 안내 등) 크롤링에 쓸 리소스가 분산된다
Next.js(App Router)에서 만드는 법 (나는 next 를 사용하기에 이를 반영한다.)
정적 사이트라면 public/robots.txt 파일을 직접 만들어 넣으면 끝이지만, Next.js App Router를 쓰고 있다면 app/robots.ts 파일 하나로 동적으로 생성할 수 있다 이는 본인 프레임워크에 맞게 설정하면 될거다
// app/robots.ts
import type { MetadataRoute } from "next";
export default function robots(): MetadataRoute.Robots {
return {
rules: {
userAgent: "*",
allow: "/",
disallow: [
"/login",
"/signup",
"/gallery/new",
"/notice/new",
],
},
sitemap: "https://내도메인/sitemap.xml",
};
}
2.3.2. sitemap.xml — 사이트 주요 페이지 목록표
sitemap.xml은 사이트에 있는 페이지 URL들을 목록으로 정리해서 검색엔진에게 "우리 사이트엔 이런 페이지들이 있어요"라고 미리 알려주는 파일이다. 검색봇이 링크를 타고 하나하나 찾아다니는 것보다 훨씬 빠르고 정확하게 페이지를 발견하게 해준다.
< 기본 문법 >
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://내도메인/about</loc>
<lastmod>2026-08-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
- loc: 페이지 URL (필수)
- lastmod: 마지막 수정일
- changefreq: 이 페이지가 얼마나 자주 바뀌는지 (daily, weekly, monthly, yearly 등 — 참고용이라 검색엔진이 100% 따르진 않음)
- priority: 사이트 내에서 이 페이지의 상대적 중요도 (0~1)
Next.js(App Router)에서 만드는 법
마찬가지로 app/sitemap.ts 파일 하나로 처리할 수 있다.
// app/sitemap.ts
import type { MetadataRoute } from "next";
export default function sitemap(): MetadataRoute.Sitemap {
return [
{ url: "https://내도메인", changeFrequency: "weekly", priority: 1 },
{ url: "https://내도메인/about", changeFrequency: "monthly", priority: 0.8 },
{ url: "https://내도메인/notice", changeFrequency: "daily", priority: 0.8 },
// ...
];
}
중요!
어떤 게시물의 상세 페이지처럼 관리자가 계속 새로 등록하는 페이지는 위처럼 하드코딩하면 새 글이 올라올 때마다 파일을 고쳐줘야 한다. 이럴 땐 sitemap.ts를 async function으로 만들어서, 빌드/요청 시점에 DB(Supabase 등)에서 목록을 직접 가져와 자동으로 URL 목록을 만들면 된다. !!
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const notices = await fetchNoticesFromDB(); // DB에서 공지 목록 조회
const noticeEntries = notices.map((notice) => ({
url: `https://내도메인/notice/${notice.id}`,
lastModified: notice.updated_at,
}));
return [
{ url: "https://내도메인", priority: 1 },
...noticeEntries,
];
}
이렇게 되면 새 글이 올라올때마다 내가 sitemap 파일을 수동으로 수정할 필요 없이 사이트맵에 자동으로 반영된다.
정적 페이지(메뉴 구조)만 새로 추가되거나 삭제될 때는 이 파일을 직접 손봐줘야 한다는 점은 기억하자..! 수정하기 전에 항상 확인하기
2.4. 구글 서치 콘솔 등록
1. 구글 서치 콘솔 사이트에 들어감
https://search.google.com/search-console/welcome
Google Search Console
로그인 Google 검색 콘솔로 이동
accounts.google.com
2. 웹사이트 추가 버튼을 클릭하면 아래 같은 창이 뜸

그럼 이 url 접두어 란에
배포한 서비스 url 을 그대로 입력해주고 계속 버튼 클릭
3. 소유권 확인 창

넘어가면 위와 같은 소유권 확인이라는 창이 뜬다
이때 제공해준 html 파일을 다운로드 받아면
google-site-verification: --------
이런 코드를 받게 되는데
이 다운받은 파일은 프로젝트의 public/ 경로 아래에 추가해준다.

이는 인증 파일을 만든 것이고 나는 next.js를 사용해서 개발중이기 때문에 /public 폴더는 루트 경로로 서빙되니 배포되면 이 경로로 접근이 가능해진다.
4. 배포한다.
5. 확인

그 다음은 인증파일이 배포가 되었고, 완료 버튼을 누른 후 다시 구글 서치 콘솔로 돌아와 메뉴바에 있는 sitemap 경로를 제출해주면 됩니다
그 후 위에 검색창에 사이트 url 을 입력하면 구글이 페이지를 어떻게 보고 있는지 확인하는 것으로, 실제로 검색결과 db에 등록이 되어있는지 확인하는 방법이에요

보니 아직 등록이 안되었다고 한다. 이럴때는 오른쪽의 "색인 생성 요청" 클릭한 이후로 기다리면 된다.
2.5. 네이버 서치어드마이저 등록
구글 검색에 등록하는 것은 완료가 되었다. 이제는 네이버 검색엔진에 등록해보겠다.
1. 네이버 서치어드마이저에 들어와 로그인부터 해준다.
https://searchadvisor.naver.com/
네이버 서치어드바이저
네이버 서치어드바이저와 함께 당신의 웹사이트를 성장시켜보세요
searchadvisor.naver.com

로그인이 되었다면 옆에 웹마스터도구 클릭
2. 사이트 등록
배포된 주소 사이트 링크를 넣어주고 화살표 버튼을 클릭

3. 소유권 확인

여기서도 파일 업로드 방식으로 진행한다
저기 1번에 있는 초록색 글씨로 확인 파일 버튼을 클릭하면 동일하게
naver-site-verification: ---
이런 키값들이 있을거다
이것도 동일하게 public/ 경로 아래에 파일을 만들고 붙여주면 된다. 그리고 동일하게 배포!

5. 사이트 맵 등록

소유권 확인까지 끝났으면 사이트가 이렇게 등록이 되었을 거다.
해당 사이트 링크를 클릭하면 이런 사이트 관리 페이지 이동이 된다.

사이드바에서 요청에 사이트맵 제출 란을 들어가서
전체 도메인을 포함한 ..../sitemap.xml 을 입력하고 확인하면 끝난다
7. 수집 확인
이제 마지막이다. 요청에서 웹사이트 수집에서 다시 url을 넣어주고 확인만 하면 끝난다. 구글의 색인 생성 요청과 같은 절차라고 보면 된다.
그럼 끝 ! 검색엔진에서 몇시간 후에 확인하면 사이트가 잘 노출되는 것을 확인할 수 있다.
'Bakend' 카테고리의 다른 글
| [Elastic] 엘라스틱 검색엔진 - 쿼리 필수 기본편 (1) (1) | 2025.12.02 |
|---|---|
| Nginx 활용한 https 설정하기 ! (0) | 2025.04.10 |
| ec2 + git action 개발 버전 ci/cd - git action workflow 생성 (2) (0) | 2025.03.14 |
| ec2 + git action 개발 버전 ci/cd - 프리티어 ec2 생성 (1) (0) | 2025.03.12 |
| [트러블 슈팅] ec2 ssh 접속 오류 Permission denied (publickey). (0) | 2025.03.12 |

































