[{"data":1,"prerenderedAt":1686},["ShallowReactive",2],{"navigation_docs_ko":3,"-ko-project-brolog-brolog-seo":195,"-ko-project-brolog-brolog-seo-surround":1681},[4,124,181],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":27},"Note (개발 지식)","emojione-v1:note-pad","\u002Fko\u002Fnote","ko\u002F1.note",[10,28,42,68,78,88,104,114],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":27},"Spring","logos:spring-icon","\u002Fko\u002Fnote\u002Fspring","ko\u002F1.note\u002F0.spring",[16],{"title":17,"icon":18,"path":19,"stem":20,"children":21,"page":27},"Spring Ai","custom:ai","\u002Fko\u002Fnote\u002Fspring\u002Fspring-ai","ko\u002F1.note\u002F0.spring\u002F1.spring-ai",[22],{"title":23,"path":24,"stem":25,"icon":26},"Spring AI 핵심 개념과 LLM 애플리케이션 구조 이해","\u002Fko\u002Fnote\u002Fspring\u002Fspring-ai\u002Fspring-ai","ko\u002F1.note\u002F0.spring\u002F1.spring-ai\u002F1.spring-ai","lucide:file-text",false,{"title":29,"icon":30,"path":31,"stem":32,"children":33,"page":27},"Javascript","skill-icons:javascript","\u002Fko\u002Fnote\u002Fjavascript","ko\u002F1.note\u002F1.javascript",[34,38],{"title":35,"path":36,"stem":37,"icon":26},"Promise.all과 구조 분해 할당을 활용한 데이터 처리 패턴","\u002Fko\u002Fnote\u002Fjavascript\u002Fdestructuring","ko\u002F1.note\u002F1.javascript\u002F1.destructuring",{"title":39,"path":40,"stem":41,"icon":26},"JavaScript 배열 고차 함수와 데이터 처리 패턴 이해","\u002Fko\u002Fnote\u002Fjavascript\u002Ffilter","ko\u002F1.note\u002F1.javascript\u002F2.filter",{"title":43,"icon":44,"path":45,"stem":46,"children":47,"page":27},"Nuxt4","logos:nuxt-icon","\u002Fko\u002Fnote\u002Fnuxt4","ko\u002F1.note\u002F2.nuxt4",[48,52,56,60,64],{"title":49,"path":50,"stem":51,"icon":26},"Nuxt 4를 선택한 이유와 아키텍처 및 실무 가이드","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-info","ko\u002F1.note\u002F2.nuxt4\u002F1.nuxt-info",{"title":53,"path":54,"stem":55,"icon":26},"Nuxt useAsyncData 동작 원리와 SSR 데이터 페칭 최적화","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-use_async_data","ko\u002F1.note\u002F2.nuxt4\u002F2.nuxt-use_async_data",{"title":57,"path":58,"stem":59,"icon":26},"Nuxt Content v3 데이터 모델과 Query 시스템 이해","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-content-v3","ko\u002F1.note\u002F2.nuxt4\u002F3.nuxt-content-v3",{"title":61,"path":62,"stem":63,"icon":26},"Nuxt Auto-imports 내부 동작과 컴파일 과정 분석","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-auto-import","ko\u002F1.note\u002F2.nuxt4\u002F4.nuxt-auto-import",{"title":65,"path":66,"stem":67,"icon":26},"Nuxt 렌더링 방식 이해: SSR, SSG, ISR, CSR 구현 방법","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-rendering-strategy","ko\u002F1.note\u002F2.nuxt4\u002F5.nuxt-rendering-strategy",{"title":69,"icon":70,"path":71,"stem":72,"children":73,"page":27},"Nitro","unjs:nitro","\u002Fko\u002Fnote\u002Fnitro","ko\u002F1.note\u002F3.nitro",[74],{"title":75,"path":76,"stem":77,"icon":26},"Nitro 아키텍처와 서버 엔진 구조","\u002Fko\u002Fnote\u002Fnitro\u002Fnitro","ko\u002F1.note\u002F3.nitro\u002Fnitro",{"title":79,"icon":80,"path":81,"stem":82,"children":83,"page":27},"Devops","vscode-icons:file-type-pipeline","\u002Fko\u002Fnote\u002Fdevops","ko\u002F1.note\u002F4.devops",[84],{"title":85,"path":86,"stem":87,"icon":26},"서버사이드 WebAssembly(Wasm)와 차세대 실행 환경","\u002Fko\u002Fnote\u002Fdevops\u002Fwebassembly","ko\u002F1.note\u002F4.devops\u002F1.webAssembly",{"title":89,"icon":90,"path":91,"stem":92,"children":93,"page":27},"Tooling","lucide:wrench","\u002Fko\u002Fnote\u002Ftooling","ko\u002F1.note\u002F4.tooling",[94],{"title":95,"icon":96,"path":97,"stem":98,"children":99,"page":27},"Package Manager","devicon:npm","\u002Fko\u002Fnote\u002Ftooling\u002Fpackage-manager","ko\u002F1.note\u002F4.tooling\u002F1.package-manager",[100],{"title":101,"path":102,"stem":103,"icon":26},"Package Lock 파일의 역할과 의존성 관리 원리","\u002Fko\u002Fnote\u002Ftooling\u002Fpackage-manager\u002Fpackage-lock","ko\u002F1.note\u002F4.tooling\u002F1.package-manager\u002F1.package-lock",{"title":105,"icon":106,"path":107,"stem":108,"children":109,"page":27},"Web","streamline-plump:web","\u002Fko\u002Fnote\u002Fweb","ko\u002F1.note\u002F4.web",[110],{"title":111,"path":112,"stem":113,"icon":26},"웹 애플리케이션 렌더링 아키텍처 이해","\u002Fko\u002Fnote\u002Fweb\u002Frendering-modes","ko\u002F1.note\u002F4.web\u002F2.rendering-modes",{"title":115,"icon":116,"path":117,"stem":118,"children":119,"page":27},"SEO","icon-park-solid:seo","\u002Fko\u002Fnote\u002Fseo","ko\u002F1.note\u002F6.seo",[120],{"title":121,"path":122,"stem":123,"icon":26},"[SEO] 개발 블로그 검색 노출을 위한 robots.txt와 SEO 설정 가이드","\u002Fko\u002Fnote\u002Fseo\u002Fseo","ko\u002F1.note\u002F6.seo\u002F1.seo",{"title":125,"icon":126,"path":127,"stem":128,"children":129,"page":27},"Project (개발일지)","icon-park-solid:branch-two","\u002Fko\u002Fproject","ko\u002F2.project",[130],{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":27},"Brolog","custom:symbol","\u002Fko\u002Fproject\u002Fbrolog","ko\u002F2.project\u002F1.brolog",[136,140,144,148,152,156,160,164,168,173,177],{"title":137,"path":138,"stem":139,"icon":26},"Brolog 프로젝트 개요","\u002Fko\u002Fproject\u002Fbrolog\u002Foutline","ko\u002F2.project\u002F1.brolog\u002F1.outline",{"title":141,"path":142,"stem":143,"icon":26},"[Brolog] Nuxt Multi Layer 프로젝트 Vercel 배포 (3) - Runtime 기능 문제 분석과 AI Assistant 전환","\u002Fko\u002Fproject\u002Fbrolog\u002Fvercel-deploy3-ai-integration","ko\u002F2.project\u002F1.brolog\u002F10.vercel-deploy3-ai-integration",{"title":145,"path":146,"stem":147,"icon":26},"[Brolog] AI Assistant 적용 과정 - Agent 구조와 API 사용량 관리 시 고려사항","\u002Fko\u002Fproject\u002Fbrolog\u002Fai-assistant-application-process","ko\u002F2.project\u002F1.brolog\u002F11.ai-assistant-application-process",{"title":149,"path":150,"stem":151,"icon":26},"[Brolog] 검색 엔진 노출을 위한 SEO 적용 과정","\u002Fko\u002Fproject\u002Fbrolog\u002Fbrolog-seo","ko\u002F2.project\u002F1.brolog\u002F12.brolog-seo",{"title":153,"path":154,"stem":155,"icon":26},"Brolog 프로젝트 구조","\u002Fko\u002Fproject\u002Fbrolog\u002Fstructure","ko\u002F2.project\u002F1.brolog\u002F2.structure",{"title":157,"path":158,"stem":159,"icon":26},"[Nuxt Content] 네비게이션 아이콘 커스텀 빌드","\u002Fko\u002Fproject\u002Fbrolog\u002Fcustom-icon","ko\u002F2.project\u002F1.brolog\u002F3.custom-icon",{"title":161,"path":162,"stem":163,"icon":26},"[Nuxt 4] Auto-imports 동작 원리와 자동 import 시스템 이해","\u002Fko\u002Fproject\u002Fbrolog\u002Fnuxt-auto-import","ko\u002F2.project\u002F1.brolog\u002F4.nuxt-auto-import",{"title":165,"path":166,"stem":167,"icon":26},"[Brolog] 개발 블로그 메인 페이지 구현","\u002Fko\u002Fproject\u002Fbrolog\u002Fdevelop-main","ko\u002F2.project\u002F1.brolog\u002F5.develop-main",{"title":169,"path":170,"stem":171,"icon":172},"[Brolog] 브랜드 아이덴티티 적용 - Custom 404 페이지와 Default No Image 구현","\u002Fko\u002Fproject\u002Fbrolog\u002Fcustom-error-and-default-thumbnail","ko\u002F2.project\u002F1.brolog\u002F6.custom-error-and-default-thumbnail","lucide:image",{"title":174,"path":175,"stem":176,"icon":26},"[Brolog] Nuxt Multi Layer 프로젝트 Vercel 배포 (1)","\u002Fko\u002Fproject\u002Fbrolog\u002Fvercel-deploy1","ko\u002F2.project\u002F1.brolog\u002F8.vercel-deploy1",{"title":178,"path":179,"stem":180,"icon":26},"[Brolog] Nuxt Multi Layer 프로젝트 Vercel 배포 (2) - Build Pipeline 오류 분석과 Nuxt 실행 구조 이해","\u002Fko\u002Fproject\u002Fbrolog\u002Fvercel-deploy2-error-analyze","ko\u002F2.project\u002F1.brolog\u002F9.vercel-deploy2-error-analyze",{"title":182,"icon":183,"path":184,"stem":185,"children":186,"page":27},"Error (트러블슈팅)","emojione:stop-sign","\u002Fko\u002Ftrouble-shooting","ko\u002F3.trouble-shooting",[187],{"title":131,"icon":132,"path":188,"stem":189,"children":190,"page":27},"\u002Fko\u002Ftrouble-shooting\u002Fbrolog","ko\u002F3.trouble-shooting\u002F1.brolog",[191],{"title":192,"path":193,"stem":194,"icon":26},"[Nuxt Content] Nuxt Icon 오류 해결과 Custom Collection 기반 오프라인 아이콘 구성","\u002Fko\u002Ftrouble-shooting\u002Fbrolog\u002Fnuxt-icon-restricted-network-troubleshooting","ko\u002F3.trouble-shooting\u002F1.brolog\u002F1.nuxt-icon-restricted-network-troubleshooting",{"id":196,"title":149,"body":197,"date":1668,"description":1669,"extension":1670,"links":1671,"meta":1672,"navigation":1676,"path":150,"seo":1677,"stem":151,"__hash__":1680},"docs_ko\u002Fko\u002F2.project\u002F1.brolog\u002F12.brolog-seo.md",{"type":198,"value":199,"toc":1666},"minimark",[200,1662],[201,202,204,209,213,216,219,222,225,228,240,243,247,250,253,256,263,266,268,272,275,278,281,294,297,300,303,310,313,357,359,363,366,372,375,378,384,387,392,395,398,409,412,415,417,421,424,427,430,433,438,441,444,446,450,453,456,480,487,608,611,618,620,624,627,630,633,702,705,708,714,717,719,723,726,729,734,737,740,743,760,763,765,769,772,775,778,785,788,795,798,810,818,830,832,836,843,846,853,859,865,872,875,878,880,884,887,890,897,900,907,910,930,937,944,946,950,953,956,963,966,969,975,978,983,986,989,992,1152,1155,1157,1161,1164,1167,1170,1279,1282,1296,1299,1302,1304,1308,1311,1314,1317,1325,1328,1346,1349,1351,1355,1358,1361,1364,1370,1373,1381,1383,1387,1390,1592,1595,1606,1609,1611,1615,1618,1625,1628,1630,1634,1637,1640,1643,1650,1653,1656,1659],"u-page-card",{":spotlight":203},"true",[205,206,208],"h1",{"id":207},"brolog-검색-엔진-최적화seo-적용-시작","🔍 Brolog 검색 엔진 최적화(SEO) 적용 시작",[210,211,212],"p",{},"Brolog를 처음 공개했을 때는 단순히 Vercel에 배포만 하면 Google이나 네이버 같은 검색 엔진에서 자연스럽게 검색될 것이라고 생각했다.",[210,214,215],{},"하지만 실제로는 배포만으로는 검색 엔진이 사이트를 바로 인식하지 않았다.",[210,217,218],{},"검색 결과에 노출되기 위해서는 검색 엔진이 사이트를 방문하고(Crawling), 페이지를 분석한 뒤(Indexing), 검색 결과에 반영하는 과정이 필요하다.",[210,220,221],{},"즉, 단순히 웹사이트를 공개하는 것과 검색 엔진에 노출되는 것은 전혀 다른 이야기였다.",[210,223,224],{},"이번 작업에서는 Brolog를 실제 검색 엔진에서 정상적으로 수집하고 노출할 수 있도록 SEO 환경을 구성했다.",[210,226,227],{},"이번 글에서 진행한 작업은 다음과 같다.",[229,230,237],"pre",{"className":231,"code":233,"filename":234,"language":235,"meta":236},[232],"language-text","robots.txt 추가\n\n↓\n\nsitemap.xml 생성\n\n↓\n\nGoogle Search Console 등록\n\n↓\n\nCanonical URL 확인\n\n↓\n\nSEO Metadata 정리\n\n↓\n\n대표 OG Image 제작\n\n↓\n\nfavicon 및 manifest 적용\n\n↓\n\n검색 엔진 최종 점검\n","SEO 적용 항목","text","",[238,239,233],"code",{"__ignoreMap":236},[241,242],"hr",{},[205,244,246],{"id":245},"검색-엔진은-어떻게-내-사이트를-찾을까","🤔 검색 엔진은 어떻게 내 사이트를 찾을까?",[210,248,249],{},"검색 엔진은 모든 사이트를 사람이 직접 등록하는 것이 아니라 크롤러(Crawler)가 인터넷을 돌아다니며 웹사이트를 수집한다.",[210,251,252],{},"대표적으로 Google에서는 Googlebot이 이러한 역할을 수행한다.",[210,254,255],{},"전체적인 흐름은 다음과 같다.",[229,257,261],{"className":258,"code":259,"filename":260,"language":235,"meta":236},[232],"웹사이트 배포\n\n↓\n\nCrawler 방문\n\n↓\n\nrobots.txt 확인\n\n↓\n\n페이지 수집\n\n↓\n\nsitemap.xml 확인\n\n↓\n\nIndex 생성\n\n↓\n\n검색 결과 노출\n","검색 엔진 동작 과정",[238,262,259],{"__ignoreMap":236},[210,264,265],{},"즉, 검색 엔진이 사이트를 제대로 이해할 수 있도록 여러 가지 정보를 제공하는 것이 SEO의 시작이다.",[241,267],{},[205,269,271],{"id":270},"robotstxt-추가","🤖 robots.txt 추가",[210,273,274],{},"가장 먼저 적용한 것은 robots.txt였다.",[210,276,277],{},"robots.txt는 검색 엔진 크롤러가 사이트에 방문했을 때 가장 먼저 확인하는 파일이다.",[210,279,280],{},"이 파일을 통해",[282,283,284,288,291],"ul",{},[285,286,287],"li",{},"어떤 경로를 탐색할 수 있는지",[285,289,290],{},"어떤 경로를 탐색하지 말아야 하는지",[285,292,293],{},"사이트맵이 어디에 있는지",[210,295,296],{},"등을 알려줄 수 있다.",[210,298,299],{},"Brolog는 대부분의 콘텐츠를 검색 엔진에 공개하는 기술 블로그이므로 특별히 차단해야 할 영역은 없었다.",[210,301,302],{},"따라서 다음과 같이 매우 단순한 robots.txt를 작성했다.",[229,304,308],{"className":305,"code":306,"filename":307,"language":235,"meta":236},[232],"User-agent: *\n\nAllow: \u002F\n\nSitemap: https:\u002F\u002Fbrolog.co.kr\u002Fsitemap.xml\n","robots.txt",[238,309,306],{"__ignoreMap":236},[210,311,312],{},"각 설정의 의미는 다음과 같다.",[314,315,316,329],"table",{},[317,318,319],"thead",{},[320,321,322,326],"tr",{},[323,324,325],"th",{},"설정",[323,327,328],{},"의미",[330,331,332,341,349],"tbody",{},[320,333,334,338],{},[335,336,337],"td",{},"User-agent",[335,339,340],{},"적용할 크롤러 지정",[320,342,343,346],{},[335,344,345],{},"Allow",[335,347,348],{},"모든 페이지 접근 허용",[320,350,351,354],{},[335,352,353],{},"Sitemap",[335,355,356],{},"사이트맵 위치 안내",[241,358],{},[205,360,362],{"id":361},"disallow는-언제-사용할까","🚫 Disallow는 언제 사용할까?",[210,364,365],{},"robots.txt를 찾아보면 대부분 다음과 같은 설정도 함께 등장한다.",[229,367,370],{"className":368,"code":369,"filename":307,"language":235,"meta":236},[232],"User-agent: *\n\nDisallow: \u002Fadmin\u002F\nDisallow: \u002Fprivate\u002F\nDisallow: \u002Fapi\u002F\n",[238,371,369],{"__ignoreMap":236},[210,373,374],{},"Disallow는 특정 경로를 크롤링하지 말아 달라고 요청하는 옵션이다.",[210,376,377],{},"하지만 중요한 점은",[379,380,381],"blockquote",{},[210,382,383],{},"Disallow는 보안 기능이 아니다.",[210,385,386],{},"검색 엔진에게",[379,388,389],{},[210,390,391],{},"\"이 경로는 수집하지 말아주세요.\"",[210,393,394],{},"라고 요청하는 기능일 뿐이며 실제 접근 자체를 막지는 않는다.",[210,396,397],{},"따라서",[282,399,400,403,406],{},[285,401,402],{},"관리자 페이지",[285,404,405],{},"내부 API",[285,407,408],{},"로그인 페이지",[210,410,411],{},"같은 영역은 robots.txt가 아니라 서버 인증과 권한 관리로 보호해야 한다.",[210,413,414],{},"Brolog처럼 대부분의 콘텐츠를 공개하는 블로그라면 Disallow를 사용할 일이 거의 없기 때문에 이번 프로젝트에서는 별도로 추가하지 않았다.",[241,416],{},[205,418,420],{"id":419},"️-sitemap-생성","🗺️ Sitemap 생성",[210,422,423],{},"검색 엔진이 사이트를 방문한다고 해서 모든 페이지를 자동으로 발견하는 것은 아니다.",[210,425,426],{},"특히 페이지 수가 많아질수록 일부 문서는 링크를 따라가지 못해 검색 엔진이 발견하지 못하는 경우도 발생할 수 있다.",[210,428,429],{},"이를 해결하기 위해 사용하는 것이 Sitemap이다.",[210,431,432],{},"Sitemap은 말 그대로",[379,434,435],{},[210,436,437],{},"\"우리 사이트에는 이런 페이지들이 있습니다.\"",[210,439,440],{},"를 검색 엔진에게 알려주는 목록이다.",[210,442,443],{},"검색 엔진은 Sitemap을 참고하여 새로운 글이나 수정된 페이지를 더욱 빠르게 수집할 수 있다.",[241,445],{},[205,447,449],{"id":448},"️-nuxt에서-sitemap-적용","⚙️ Nuxt에서 Sitemap 적용",[210,451,452],{},"Brolog는 Nuxt 기반 프로젝트이므로 Sitemap Module을 사용했다.",[210,454,455],{},"먼저 모듈을 설치한다.",[229,457,462],{"className":458,"code":459,"filename":460,"language":461,"meta":236,"style":236},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm install @nuxtjs\u002Fsitemap\n","Terminal","bash",[238,463,464],{"__ignoreMap":236},[465,466,469,473,477],"span",{"class":467,"line":468},"line",1,[465,470,472],{"class":471},"sBMFI","npm",[465,474,476],{"class":475},"sfazB"," install",[465,478,479],{"class":475}," @nuxtjs\u002Fsitemap\n",[210,481,482,483,486],{},"이후 ",[238,484,485],{},"nuxt.config.ts","에서 모듈을 등록한다.",[229,488,492],{"className":489,"code":490,"filename":485,"language":491,"meta":236,"style":236},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n\n  modules: [\n    '@nuxtjs\u002Fsitemap'\n  ],\n\n  sitemap: {\n    siteUrl: 'https:\u002F\u002Fbrolog.co.kr'\n  }\n\n})\n","ts",[238,493,494,515,522,535,547,556,561,572,588,594,599],{"__ignoreMap":236},[465,495,496,500,503,507,511],{"class":467,"line":468},[465,497,499],{"class":498},"s7zQu","export",[465,501,502],{"class":498}," default",[465,504,506],{"class":505},"s2Zo4"," defineNuxtConfig",[465,508,510],{"class":509},"sTEyZ","(",[465,512,514],{"class":513},"sMK4o","{\n",[465,516,518],{"class":467,"line":517},2,[465,519,521],{"emptyLinePlaceholder":520},true,"\n",[465,523,525,529,532],{"class":467,"line":524},3,[465,526,528],{"class":527},"swJcz","  modules",[465,530,531],{"class":513},":",[465,533,534],{"class":509}," [\n",[465,536,538,541,544],{"class":467,"line":537},4,[465,539,540],{"class":513},"    '",[465,542,543],{"class":475},"@nuxtjs\u002Fsitemap",[465,545,546],{"class":513},"'\n",[465,548,550,553],{"class":467,"line":549},5,[465,551,552],{"class":509},"  ]",[465,554,555],{"class":513},",\n",[465,557,559],{"class":467,"line":558},6,[465,560,521],{"emptyLinePlaceholder":520},[465,562,564,567,569],{"class":467,"line":563},7,[465,565,566],{"class":527},"  sitemap",[465,568,531],{"class":513},[465,570,571],{"class":513}," {\n",[465,573,575,578,580,583,586],{"class":467,"line":574},8,[465,576,577],{"class":527},"    siteUrl",[465,579,531],{"class":513},[465,581,582],{"class":513}," '",[465,584,585],{"class":475},"https:\u002F\u002Fbrolog.co.kr",[465,587,546],{"class":513},[465,589,591],{"class":467,"line":590},9,[465,592,593],{"class":513},"  }\n",[465,595,597],{"class":467,"line":596},10,[465,598,521],{"emptyLinePlaceholder":520},[465,600,602,605],{"class":467,"line":601},11,[465,603,604],{"class":513},"}",[465,606,607],{"class":509},")\n",[210,609,610],{},"설정을 완료하면 다음 주소에서 사이트맵을 확인할 수 있다.",[229,612,616],{"className":613,"code":614,"filename":615,"language":235,"meta":236},[232],"https:\u002F\u002Fbrolog.co.kr\u002Fsitemap.xml\n","Sitemap URL",[238,617,614],{"__ignoreMap":236},[241,619],{},[205,621,623],{"id":622},"nuxt가-아닌-일반-웹사이트에서는","🌐 Nuxt가 아닌 일반 웹사이트에서는?",[210,625,626],{},"Sitemap은 Nuxt에서만 사용하는 기능은 아니다.",[210,628,629],{},"정적 HTML 사이트나 다른 프레임워크에서도 동일하게 사용할 수 있다.",[210,631,632],{},"가장 기본적인 Sitemap 형태는 다음과 같다.",[229,634,639],{"className":635,"code":636,"filename":637,"language":638,"meta":236,"style":236},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n\u003Curlset xmlns=\"http:\u002F\u002Fwww.sitemaps.org\u002Fschemas\u002Fsitemap\u002F0.9\">\n\n  \u003Curl>\n    \u003Cloc>https:\u002F\u002Fbrolog.co.kr\u002F\u003C\u002Floc>\n  \u003C\u002Furl>\n\n  \u003Curl>\n    \u003Cloc>https:\u002F\u002Fbrolog.co.kr\u002Fnote\u003C\u002Floc>\n  \u003C\u002Furl>\n\n\u003C\u002Furlset>\n","sitemap.xml","xml",[238,640,641,646,650,655,659,664,669,674,678,682,687,691,696],{"__ignoreMap":236},[465,642,643],{"class":467,"line":468},[465,644,645],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[465,647,648],{"class":467,"line":517},[465,649,521],{"emptyLinePlaceholder":520},[465,651,652],{"class":467,"line":524},[465,653,654],{},"\u003Curlset xmlns=\"http:\u002F\u002Fwww.sitemaps.org\u002Fschemas\u002Fsitemap\u002F0.9\">\n",[465,656,657],{"class":467,"line":537},[465,658,521],{"emptyLinePlaceholder":520},[465,660,661],{"class":467,"line":549},[465,662,663],{},"  \u003Curl>\n",[465,665,666],{"class":467,"line":558},[465,667,668],{},"    \u003Cloc>https:\u002F\u002Fbrolog.co.kr\u002F\u003C\u002Floc>\n",[465,670,671],{"class":467,"line":563},[465,672,673],{},"  \u003C\u002Furl>\n",[465,675,676],{"class":467,"line":574},[465,677,521],{"emptyLinePlaceholder":520},[465,679,680],{"class":467,"line":590},[465,681,663],{},[465,683,684],{"class":467,"line":596},[465,685,686],{},"    \u003Cloc>https:\u002F\u002Fbrolog.co.kr\u002Fnote\u003C\u002Floc>\n",[465,688,689],{"class":467,"line":601},[465,690,673],{},[465,692,694],{"class":467,"line":693},12,[465,695,521],{"emptyLinePlaceholder":520},[465,697,699],{"class":467,"line":698},13,[465,700,701],{},"\u003C\u002Furlset>\n",[210,703,704],{},"즉,",[210,706,707],{},"어떤 프레임워크를 사용하든",[229,709,712],{"className":710,"code":711,"language":235},[232],"도메인\u002Fsitemap.xml\n",[238,713,711],{"__ignoreMap":236},[210,715,716],{},"만 제공된다면 검색 엔진은 이를 활용하여 페이지를 탐색할 수 있다.",[241,718],{},[205,720,722],{"id":721},"google-search-console-등록","🔎 Google Search Console 등록",[210,724,725],{},"robots.txt와 Sitemap만 추가한다고 해서 Google이 바로 사이트를 검색 결과에 반영하는 것은 아니다.",[210,727,728],{},"Google에게",[379,730,731],{},[210,732,733],{},"\"이 사이트는 내가 운영하는 사이트입니다.\"",[210,735,736],{},"라는 사실을 알려주는 과정이 필요하다.",[210,738,739],{},"이를 위해 사용하는 서비스가 Google Search Console이다.",[210,741,742],{},"Google Search Console에서는",[282,744,745,748,751,754,757],{},[285,746,747],{},"사이트 등록",[285,749,750],{},"검색 노출 현황",[285,752,753],{},"색인 상태",[285,755,756],{},"검색 키워드",[285,758,759],{},"크롤링 오류",[210,761,762],{},"등을 확인할 수 있다.",[241,764],{},[205,766,768],{"id":767},"소유권-인증","🔐 소유권 인증",[210,770,771],{},"도메인을 등록하면 가장 먼저 사이트 소유권을 확인하는 과정이 진행된다.",[210,773,774],{},"여러 인증 방법이 있지만 이번에는 HTML 파일 업로드 방식을 사용했다.",[210,776,777],{},"Google은 다음과 같은 이름의 HTML 파일을 제공한다.",[229,779,783],{"className":780,"code":781,"filename":782,"language":235,"meta":236},[232],"googlexxxxxxxxxxxxxxxx.html\n","Google Search Console",[238,784,781],{"__ignoreMap":236},[210,786,787],{},"이 파일을 프로젝트의 public 디렉터리에 그대로 추가했다.",[229,789,793],{"className":790,"code":791,"filename":792,"language":235,"meta":236},[232],"public\u002F\n\n└── googlexxxxxxxxxxxxxxxx.html\n","Project Structure",[238,794,791],{"__ignoreMap":236},[210,796,797],{},"파일 내용도 Google이 제공한 그대로 유지한다.",[229,799,804],{"className":800,"code":801,"filename":802,"language":803,"meta":236,"style":236},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","google-site-verification: googlexxxxxxxxxxxxxxxx.html\n","googlexxxxxxxxxxxxxxxx.html","html",[238,805,806],{"__ignoreMap":236},[465,807,808],{"class":467,"line":468},[465,809,801],{"class":509},[210,811,812,813,817],{},"이후 Search Console에서 ",[814,815,816],"strong",{},"확인"," 버튼을 누르면 Google이 해당 파일에 접근하여 사이트 소유권을 인증한다.",[819,820,824],"div",{"className":821},[822,823],"flex","justify-center",[825,826],"img",{"alt":827,"src":828,"width":829},"google-site-verification","\u002Fimages\u002Fgoogle-site-verification.png",600,[241,831],{},[205,833,835],{"id":834},"️-google-search-console에-sitemap-등록하기","🗺️ Google Search Console에 Sitemap 등록하기",[210,837,838,839,842],{},"소유권 인증을 완료한 이후에는 검색 엔진이 사이트의 페이지를 효율적으로 수집할 수 있도록 ",[814,840,841],{},"Sitemap을 등록","했다.",[210,844,845],{},"Sitemap은 사이트에 존재하는 페이지 목록을 검색 엔진에게 알려주는 역할을 하며, 새로운 글을 작성하거나 페이지가 추가될 때 검색 엔진이 이를 빠르게 인식하는 데 도움을 준다.",[210,847,848,849,852],{},"Google Search Console 좌측 메뉴의 ",[814,850,851],{},"Sitemaps"," 항목으로 이동한 뒤, 생성해둔 Sitemap 경로를 입력하여 등록했다.",[229,854,857],{"className":855,"code":856,"filename":782,"language":235,"meta":236},[232],"Google Search Console\n\n↓\n\nSitemaps\n\n↓\n\n새 사이트맵 추가\n\n↓\n\nsitemap.xml 입력\n\n↓\n\n제출\n",[238,858,856],{"__ignoreMap":236},[210,860,861,862,864],{},"Brolog에서는 ",[238,863,543],{}," 모듈을 적용해 Sitemap을 자동 생성하도록 구성했기 때문에 별도의 XML 파일을 직접 관리할 필요는 없었다.",[819,866,868],{"className":867},[822,823],[825,869],{"alt":870,"src":871,"width":829},"sitemap","\u002Fimages\u002Fsitemap.png",[210,873,874],{},"등록이 완료되면 Google은 해당 Sitemap을 주기적으로 확인하면서 새로운 페이지나 변경된 페이지를 자동으로 수집한다.",[210,876,877],{},"Sitemap이 정상적으로 등록된 이후에는 각 게시글이 실제로 색인(Index)에 포함되는지 확인하기 위해 URL 검사 기능을 이용했다.",[241,879],{},[205,881,883],{"id":882},"url-검사와-색인-요청","🔍 URL 검사와 색인 요청",[210,885,886],{},"사이트 소유권 인증을 완료했다고 해서 바로 검색 결과에 노출되는 것은 아니다.",[210,888,889],{},"Google은 사이트를 다시 방문하여 페이지를 수집(Indexing)해야 실제 검색 결과에 반영한다.",[210,891,892,893,896],{},"Search Console에서는 이를 위해 ",[814,894,895],{},"URL 검사(URL Inspection)"," 기능을 제공한다.",[210,898,899],{},"이번에는 Brolog의 메인 페이지와 주요 문서들을 직접 검사했다.",[229,901,905],{"className":902,"code":903,"filename":904,"language":235,"meta":236},[232],"https:\u002F\u002Fbrolog.co.kr\u002F\n\nhttps:\u002F\u002Fbrolog.co.kr\u002Fnote\n\nhttps:\u002F\u002Fbrolog.co.kr\u002Fproject\n\nhttps:\u002F\u002Fbrolog.co.kr\u002Ferror\n","URL 검사 예시",[238,906,903],{"__ignoreMap":236},[210,908,909],{},"URL을 입력하면 Google이 현재 페이지의 상태를 분석하여 다음과 같은 정보를 제공한다.",[282,911,912,915,918,921,924,927],{},[285,913,914],{},"Google 색인 여부",[285,916,917],{},"마지막 크롤링 시점",[285,919,920],{},"robots.txt 차단 여부",[285,922,923],{},"Canonical URL",[285,925,926],{},"모바일 사용성",[285,928,929],{},"페이지 접근 가능 여부",[210,931,932,933,936],{},"색인이 아직 이루어지지 않은 페이지는 ",[814,934,935],{},"색인 생성 요청(Request Indexing)"," 기능을 통해 Google에게 다시 크롤링을 요청할 수 있다.",[819,938,940],{"className":939},[822,823],[825,941],{"alt":942,"src":943,"width":829},"urlInspection","\u002Fimages\u002Furl-inspection.png",[241,945],{},[205,947,949],{"id":948},"canonical-url-확인","🔗 Canonical URL 확인",[210,951,952],{},"기술 블로그를 운영하다 보면 하나의 콘텐츠가 여러 URL에서 접근 가능한 상황이 생길 수 있다.",[210,954,955],{},"예를 들어",[229,957,961],{"className":958,"code":959,"filename":960,"language":235,"meta":236},[232],"https:\u002F\u002Fexample.com\u002Fpost\u002F1\n\nhttps:\u002F\u002Fwww.example.com\u002Fpost\u002F1\n\nhttps:\u002F\u002Fexample.com\u002Fpost\u002F1?ref=home\n","Duplicate URL Example",[238,962,959],{"__ignoreMap":236},[210,964,965],{},"검색 엔진 입장에서는 모두 동일한 글처럼 보이지만 서로 다른 페이지로 인식할 수도 있다.",[210,967,968],{},"이 경우 SEO 점수가 분산되는 문제가 발생할 수 있다.",[210,970,971,972,974],{},"이를 방지하기 위해 사용하는 것이 ",[814,973,923],{},"이다.",[210,976,977],{},"Canonical은 검색 엔진에게",[379,979,980],{},[210,981,982],{},"\"이 페이지의 대표 주소는 이것입니다.\"",[210,984,985],{},"라고 알려주는 역할을 한다.",[210,987,988],{},"Brolog에서는 이미 Layout에서 Canonical URL을 자동 생성하도록 구성해 두었기 때문에 별도의 추가 작업은 필요하지 않았다.",[210,990,991],{},"현재 적용된 코드는 다음과 같다.",[229,993,996],{"className":489,"code":994,"filename":995,"language":491,"meta":236,"style":236},"useHead({\n  link: computed(() => {\n    const links = []\n\n    if (canonicalUrl.value) {\n      links.push({\n        rel: 'canonical',\n        href: canonicalUrl.value\n      })\n    }\n\n    return links\n  })\n})\n","app.vue",[238,997,998,1007,1028,1042,1046,1068,1082,1099,1114,1121,1126,1130,1138,1145],{"__ignoreMap":236},[465,999,1000,1003,1005],{"class":467,"line":468},[465,1001,1002],{"class":505},"useHead",[465,1004,510],{"class":509},[465,1006,514],{"class":513},[465,1008,1009,1012,1014,1017,1019,1022,1026],{"class":467,"line":517},[465,1010,1011],{"class":527},"  link",[465,1013,531],{"class":513},[465,1015,1016],{"class":505}," computed",[465,1018,510],{"class":509},[465,1020,1021],{"class":513},"()",[465,1023,1025],{"class":1024},"spNyl"," =>",[465,1027,571],{"class":513},[465,1029,1030,1033,1036,1039],{"class":467,"line":524},[465,1031,1032],{"class":1024},"    const",[465,1034,1035],{"class":509}," links",[465,1037,1038],{"class":513}," =",[465,1040,1041],{"class":527}," []\n",[465,1043,1044],{"class":467,"line":537},[465,1045,521],{"emptyLinePlaceholder":520},[465,1047,1048,1051,1054,1057,1060,1063,1066],{"class":467,"line":549},[465,1049,1050],{"class":498},"    if",[465,1052,1053],{"class":527}," (",[465,1055,1056],{"class":509},"canonicalUrl",[465,1058,1059],{"class":513},".",[465,1061,1062],{"class":509},"value",[465,1064,1065],{"class":527},") ",[465,1067,514],{"class":513},[465,1069,1070,1073,1075,1078,1080],{"class":467,"line":558},[465,1071,1072],{"class":509},"      links",[465,1074,1059],{"class":513},[465,1076,1077],{"class":505},"push",[465,1079,510],{"class":527},[465,1081,514],{"class":513},[465,1083,1084,1087,1089,1091,1094,1097],{"class":467,"line":563},[465,1085,1086],{"class":527},"        rel",[465,1088,531],{"class":513},[465,1090,582],{"class":513},[465,1092,1093],{"class":475},"canonical",[465,1095,1096],{"class":513},"'",[465,1098,555],{"class":513},[465,1100,1101,1104,1106,1109,1111],{"class":467,"line":574},[465,1102,1103],{"class":527},"        href",[465,1105,531],{"class":513},[465,1107,1108],{"class":509}," canonicalUrl",[465,1110,1059],{"class":513},[465,1112,1113],{"class":509},"value\n",[465,1115,1116,1119],{"class":467,"line":590},[465,1117,1118],{"class":513},"      }",[465,1120,607],{"class":527},[465,1122,1123],{"class":467,"line":596},[465,1124,1125],{"class":513},"    }\n",[465,1127,1128],{"class":467,"line":601},[465,1129,521],{"emptyLinePlaceholder":520},[465,1131,1132,1135],{"class":467,"line":693},[465,1133,1134],{"class":498},"    return",[465,1136,1137],{"class":509}," links\n",[465,1139,1140,1143],{"class":467,"line":698},[465,1141,1142],{"class":513},"  }",[465,1144,607],{"class":509},[465,1146,1148,1150],{"class":467,"line":1147},14,[465,1149,604],{"class":513},[465,1151,607],{"class":509},[210,1153,1154],{},"Google Search Console의 URL 검사에서도 Canonical URL이 정상적으로 인식되는 것을 확인했다.",[241,1156],{},[205,1158,1160],{"id":1159},"seo-metadata-정리","📝 SEO Metadata 정리",[210,1162,1163],{},"검색 엔진은 HTML뿐 아니라 페이지 메타데이터도 함께 분석한다.",[210,1165,1166],{},"기존에는 단순한 title 정도만 설정되어 있었지만, 이번 작업에서는 모든 게시글에 SEO Metadata를 추가했다.",[210,1168,1169],{},"현재 모든 게시글은 다음과 같은 형태를 가진다.",[229,1171,1176],{"className":1172,"code":1173,"filename":1174,"language":1175,"meta":236,"style":236},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\ntitle: \"게시글 제목\"\n\ndescription: \"게시글 설명\"\n\nseo:\n  title: \"SEO Title\"\n  description: \"SEO Description\"\n\nimage: \"\u002Fimages\u002Fthumbnail.png\"\n---\n","Markdown Frontmatter","yaml",[238,1177,1178,1183,1199,1203,1217,1221,1229,1243,1257,1261,1275],{"__ignoreMap":236},[465,1179,1180],{"class":467,"line":468},[465,1181,1182],{"class":471},"---\n",[465,1184,1185,1188,1190,1193,1196],{"class":467,"line":517},[465,1186,1187],{"class":527},"title",[465,1189,531],{"class":513},[465,1191,1192],{"class":513}," \"",[465,1194,1195],{"class":475},"게시글 제목",[465,1197,1198],{"class":513},"\"\n",[465,1200,1201],{"class":467,"line":524},[465,1202,521],{"emptyLinePlaceholder":520},[465,1204,1205,1208,1210,1212,1215],{"class":467,"line":537},[465,1206,1207],{"class":527},"description",[465,1209,531],{"class":513},[465,1211,1192],{"class":513},[465,1213,1214],{"class":475},"게시글 설명",[465,1216,1198],{"class":513},[465,1218,1219],{"class":467,"line":549},[465,1220,521],{"emptyLinePlaceholder":520},[465,1222,1223,1226],{"class":467,"line":558},[465,1224,1225],{"class":527},"seo",[465,1227,1228],{"class":513},":\n",[465,1230,1231,1234,1236,1238,1241],{"class":467,"line":563},[465,1232,1233],{"class":527},"  title",[465,1235,531],{"class":513},[465,1237,1192],{"class":513},[465,1239,1240],{"class":475},"SEO Title",[465,1242,1198],{"class":513},[465,1244,1245,1248,1250,1252,1255],{"class":467,"line":574},[465,1246,1247],{"class":527},"  description",[465,1249,531],{"class":513},[465,1251,1192],{"class":513},[465,1253,1254],{"class":475},"SEO Description",[465,1256,1198],{"class":513},[465,1258,1259],{"class":467,"line":590},[465,1260,521],{"emptyLinePlaceholder":520},[465,1262,1263,1266,1268,1270,1273],{"class":467,"line":596},[465,1264,1265],{"class":527},"image",[465,1267,531],{"class":513},[465,1269,1192],{"class":513},[465,1271,1272],{"class":475},"\u002Fimages\u002Fthumbnail.png",[465,1274,1198],{"class":513},[465,1276,1277],{"class":467,"line":601},[465,1278,1182],{"class":471},[210,1280,1281],{},"이렇게 작성하면",[282,1283,1284,1287,1290,1293],{},[285,1285,1286],{},"브라우저 제목",[285,1288,1289],{},"검색 결과 설명",[285,1291,1292],{},"Open Graph",[285,1294,1295],{},"SNS 미리보기",[210,1297,1298],{},"등이 모두 함께 구성된다.",[210,1300,1301],{},"특히 Brolog에서는 SEO 정보를 기반으로 Open Graph 메타 태그도 자동 생성되도록 구현되어 있어 별도로 OG 태그를 작성하지 않아도 된다.",[241,1303],{},[205,1305,1307],{"id":1306},"️-대표-open-graph-이미지-제작","🖼️ 대표 Open Graph 이미지 제작",[210,1309,1310],{},"검색 엔진뿐 아니라 Discord, KakaoTalk, Slack, X(Twitter) 같은 SNS에서는 페이지를 공유할 때 Open Graph 이미지를 사용한다.",[210,1312,1313],{},"처음에는 별도의 대표 이미지가 없어 링크를 공유하면 원하는 형태로 출력되지 않았다.",[210,1315,1316],{},"그래서 이번에 Brolog 전용 대표 이미지를 새롭게 제작했다.",[819,1318,1320],{"className":1319},[822,823],[825,1321],{"alt":1322,"src":1323,"width":1324},"ogimage","\u002Fimages\u002Fbrolog-ogimage.png",500,[210,1326,1327],{},"이후 모든 페이지에서 동일한 대표 이미지를 사용할 수 있도록 메타데이터에 적용했다.",[229,1329,1331],{"className":1172,"code":1330,"filename":1174,"language":1175,"meta":236,"style":236},"image: \"\u002Fimages\u002Fogimage.png\"\n",[238,1332,1333],{"__ignoreMap":236},[465,1334,1335,1337,1339,1341,1344],{"class":467,"line":468},[465,1336,1265],{"class":527},[465,1338,531],{"class":513},[465,1340,1192],{"class":513},[465,1342,1343],{"class":475},"\u002Fimages\u002Fogimage.png",[465,1345,1198],{"class":513},[210,1347,1348],{},"덕분에 링크를 공유했을 때 Brolog만의 브랜드 이미지를 함께 전달할 수 있게 되었다.",[241,1350],{},[205,1352,1354],{"id":1353},"favicon-변경","🎨 favicon 변경",[210,1356,1357],{},"SEO와 직접적인 관련은 없지만 브랜드 아이덴티티 측면에서 favicon도 함께 교체했다.",[210,1359,1360],{},"기존 브라우저 기본 아이콘 대신 Brolog 전용 아이콘을 제작하여 적용했다.",[210,1362,1363],{},"프로젝트 구조는 다음과 같다.",[229,1365,1368],{"className":1366,"code":1367,"filename":792,"language":235,"meta":236},[232],"public\u002F\n\n├── favicon.ico\n\n├── favicon.svg\n\n└── apple-touch-icon.png\n",[238,1369,1367],{"__ignoreMap":236},[210,1371,1372],{},"브라우저 탭에서도 Brolog를 쉽게 구분할 수 있게 되었다.",[819,1374,1376],{"className":1375},[822,823],[825,1377],{"alt":1378,"src":1379,"width":1380},"favicon","\u002Flogo\u002Fsymbol.png",100,[241,1382],{},[205,1384,1386],{"id":1385},"manifestwebmanifest-추가","📱 manifest.webmanifest 추가",[210,1388,1389],{},"PWA를 위한 필수 요소는 아니었지만 브라우저와 검색 엔진이 사이트 정보를 더욱 잘 이해할 수 있도록 Manifest 파일도 함께 추가했다.",[229,1391,1396],{"className":1392,"code":1393,"filename":1394,"language":1395,"meta":236,"style":236},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"name\": \"Brolog\",\n  \"short_name\": \"Brolog\",\n  \"display\": \"standalone\",\n  \"theme_color\": \"#ffffff\",\n  \"background_color\": \"#ffffff\",\n  \"icons\": [\n    {\n      \"src\": \"\u002Ffavicon.svg\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image\u002Fsvg+xml\"\n    }\n  ]\n}\n","manifest.webmanifest","json",[238,1397,1398,1402,1423,1442,1462,1482,1501,1514,1519,1540,1560,1578,1582,1587],{"__ignoreMap":236},[465,1399,1400],{"class":467,"line":468},[465,1401,514],{"class":513},[465,1403,1404,1407,1410,1413,1415,1417,1419,1421],{"class":467,"line":517},[465,1405,1406],{"class":513},"  \"",[465,1408,1409],{"class":1024},"name",[465,1411,1412],{"class":513},"\"",[465,1414,531],{"class":513},[465,1416,1192],{"class":513},[465,1418,131],{"class":475},[465,1420,1412],{"class":513},[465,1422,555],{"class":513},[465,1424,1425,1427,1430,1432,1434,1436,1438,1440],{"class":467,"line":524},[465,1426,1406],{"class":513},[465,1428,1429],{"class":1024},"short_name",[465,1431,1412],{"class":513},[465,1433,531],{"class":513},[465,1435,1192],{"class":513},[465,1437,131],{"class":475},[465,1439,1412],{"class":513},[465,1441,555],{"class":513},[465,1443,1444,1446,1449,1451,1453,1455,1458,1460],{"class":467,"line":537},[465,1445,1406],{"class":513},[465,1447,1448],{"class":1024},"display",[465,1450,1412],{"class":513},[465,1452,531],{"class":513},[465,1454,1192],{"class":513},[465,1456,1457],{"class":475},"standalone",[465,1459,1412],{"class":513},[465,1461,555],{"class":513},[465,1463,1464,1466,1469,1471,1473,1475,1478,1480],{"class":467,"line":549},[465,1465,1406],{"class":513},[465,1467,1468],{"class":1024},"theme_color",[465,1470,1412],{"class":513},[465,1472,531],{"class":513},[465,1474,1192],{"class":513},[465,1476,1477],{"class":475},"#ffffff",[465,1479,1412],{"class":513},[465,1481,555],{"class":513},[465,1483,1484,1486,1489,1491,1493,1495,1497,1499],{"class":467,"line":558},[465,1485,1406],{"class":513},[465,1487,1488],{"class":1024},"background_color",[465,1490,1412],{"class":513},[465,1492,531],{"class":513},[465,1494,1192],{"class":513},[465,1496,1477],{"class":475},[465,1498,1412],{"class":513},[465,1500,555],{"class":513},[465,1502,1503,1505,1508,1510,1512],{"class":467,"line":563},[465,1504,1406],{"class":513},[465,1506,1507],{"class":1024},"icons",[465,1509,1412],{"class":513},[465,1511,531],{"class":513},[465,1513,534],{"class":513},[465,1515,1516],{"class":467,"line":574},[465,1517,1518],{"class":513},"    {\n",[465,1520,1521,1524,1527,1529,1531,1533,1536,1538],{"class":467,"line":590},[465,1522,1523],{"class":513},"      \"",[465,1525,1526],{"class":471},"src",[465,1528,1412],{"class":513},[465,1530,531],{"class":513},[465,1532,1192],{"class":513},[465,1534,1535],{"class":475},"\u002Ffavicon.svg",[465,1537,1412],{"class":513},[465,1539,555],{"class":513},[465,1541,1542,1544,1547,1549,1551,1553,1556,1558],{"class":467,"line":596},[465,1543,1523],{"class":513},[465,1545,1546],{"class":471},"sizes",[465,1548,1412],{"class":513},[465,1550,531],{"class":513},[465,1552,1192],{"class":513},[465,1554,1555],{"class":475},"512x512",[465,1557,1412],{"class":513},[465,1559,555],{"class":513},[465,1561,1562,1564,1567,1569,1571,1573,1576],{"class":467,"line":601},[465,1563,1523],{"class":513},[465,1565,1566],{"class":471},"type",[465,1568,1412],{"class":513},[465,1570,531],{"class":513},[465,1572,1192],{"class":513},[465,1574,1575],{"class":475},"image\u002Fsvg+xml",[465,1577,1198],{"class":513},[465,1579,1580],{"class":467,"line":693},[465,1581,1125],{"class":513},[465,1583,1584],{"class":467,"line":698},[465,1585,1586],{"class":513},"  ]\n",[465,1588,1589],{"class":467,"line":1147},[465,1590,1591],{"class":513},"}\n",[210,1593,1594],{},"Manifest를 추가하면",[282,1596,1597,1600,1603],{},[285,1598,1599],{},"앱 설치 정보",[285,1601,1602],{},"아이콘",[285,1604,1605],{},"브라우저 표시 방식",[210,1607,1608],{},"등을 정의할 수 있다.",[241,1610],{},[205,1612,1614],{"id":1613},"최종-seo-점검","✅ 최종 SEO 점검",[210,1616,1617],{},"모든 작업을 마친 후 다음 항목들을 다시 확인했다.",[229,1619,1623],{"className":1620,"code":1621,"filename":1622,"language":235,"meta":236},[232],"✔ robots.txt\n\n✔ sitemap.xml\n\n✔ Google Search Console 등록\n\n✔ HTML 파일 소유권 인증\n\n✔ URL 검사\n\n✔ 색인 요청\n\n✔ Canonical URL\n\n✔ SEO Metadata\n\n✔ Open Graph\n\n✔ 대표 OG Image\n\n✔ favicon\n\n✔ manifest.webmanifest\n","SEO Checklist",[238,1624,1621],{"__ignoreMap":236},[210,1626,1627],{},"Google Search Console에서도 robots.txt와 Sitemap이 정상적으로 인식되고, URL 검사 결과 역시 문제없이 확인할 수 있었다.",[241,1629],{},[205,1631,1633],{"id":1632},"개발을-마치며","💡 개발을 마치며",[210,1635,1636],{},"이번 작업을 진행하기 전에는 SEO를 단순히 검색 결과에 잘 나오게 만드는 기술 정도로만 생각했다.",[210,1638,1639],{},"하지만 실제로 적용해 보니 검색 엔진이 사이트를 이해할 수 있도록 여러 정보를 체계적으로 제공하는 작업이라는 점을 알 수 있었다.",[210,1641,1642],{},"특히 이번 작업을 진행하며 가장 크게 느낀 부분은 다음과 같다.",[229,1644,1648],{"className":1645,"code":1646,"filename":1647,"language":235,"meta":236},[232],"배포\n\n≠\n\n검색 노출\n","Key Point",[238,1649,1646],{"__ignoreMap":236},[210,1651,1652],{},"웹사이트를 배포했다고 해서 검색 엔진이 자동으로 모든 페이지를 수집하는 것은 아니다.",[210,1654,1655],{},"robots.txt와 Sitemap을 제공하고, Google Search Console에 사이트를 등록하고, Canonical과 메타데이터를 정리하는 과정을 통해 검색 엔진이 사이트를 올바르게 이해할 수 있는 환경을 만들어 주어야 한다.",[210,1657,1658],{},"이번 SEO 적용을 통해 Brolog는 단순히 접속 가능한 웹사이트를 넘어 검색 엔진에서도 정상적으로 수집되고 공유 시에도 브랜드 아이덴티티를 유지할 수 있는 형태로 한 단계 발전하게 되었다.",[210,1660,1661],{},"앞으로도 새로운 콘텐츠가 추가될 때마다 Search Console과 Sitemap을 함께 관리하며 지속적으로 검색 노출을 최적화해 나갈 예정이다.",[1663,1664,1665],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":236,"searchDepth":517,"depth":517,"links":1667},[],"2026-07-29","Brolog에 robots.txt, sitemap.xml, Google Search Console, Canonical URL, Open Graph, Manifest 등을 적용하며 검색 엔진 최적화를 진행한 과정을 기록합니다.","md",null,{"tags":1673,"image":1675},[131,115,307,353,782,1674,1292],"Canonical","\u002Fimages\u002Fbro-seo-thumbnail.png",{"icon":26},{"title":1678,"description":1679},"Brolog SEO 적용기 - robots.txt부터 Search Console까지","개인 기술 블로그 Brolog에 검색 엔진 최적화(SEO)를 적용하며 robots.txt, sitemap.xml, Google Search Console, Canonical URL 등을 구성한 개발 기록입니다.","hNadkaPEYicqcpj2sTF-Lg163E1rSb52o0cCvPQTQog",[1682,1684],{"title":145,"path":146,"stem":147,"description":1683,"icon":26,"children":-1},"AI Assistant를 적용하면서 확인한 Agent 구조의 API 호출 흐름과 MCP Tool 사용 과정에서 발생하는 API 사용량 증가, 무료 API 환경에서 고려해야 할 운영 요소를 정리합니다.",{"title":153,"path":154,"stem":155,"description":1685,"icon":26,"children":-1},"개발 기록을 위한 개인 블로그 프로젝트의 정보 및 기술스택",1785305902048]