path
Jin's Lab
코드로 실험하고 기록하는 개발 일지 · J.Lab

Jin's Lab

코드로 실험하고 기록하는 개발 일지. 커리어와 삶의 방향을 탐색하며 기록하는 공간입니다

Base64Encoding

Blogger XML 테마에서 Base64 SVG 파비콘 삽입하는 법

J.Lab ·
목차
    안녕하세요, J.Lab입니다. 블로그를 운영하다 보면 정말 사소한 디테일 하나하나가 눈에 밟힐 때가 많죠. 최근 J.Lab 블로그들의 테마를 전반적으로 손보면서 저를 가장 괴롭혔던 것 중 하나가 바로 '파비콘'이었습니다. 처음에는 별거 아니겠지 했는데, 생각보다 깊은 삽질의 세계로 빠져들었네요.

    기존에 사용하던 단축 아이콘들은 뭔가 밋밋하고 오래된 느낌이었습니다. 특히 여러 블로그(이슈로그, KidStory, IT Story)를 운영하다 보니 각각의 개성을 살린 파비콘이 꼭 필요하다고 느꼈죠. 이왕 바꾸는 김에 '확장성이 좋은 SVG로 교체하자!'는 야심 찬 계획을 세웠습니다.

    하지만 Blogger XML 테마에 SVG 파비콘을 적용하는 것이 생각처럼 간단치 않더군요. 일반적인 HTML 웹사이트와는 접근 방식이 조금 달라서 여러 번 시행착오를 겪어야 했습니다. 결국 Base64 인코딩이라는 방법을 통해 이 문제를 해결했는데, 오늘은 그 과정을 여러분과 공유하려 합니다.

    새로운 단축 아이콘, 왜 SVG여야만 했나?

    솔직히 파비콘이 웹사이트의 첫인상에 큰 영향을 미치지는 않습니다. 하지만 브라우저 탭에 작게 표시되는 그 아이콘 하나가 블로그의 정체성을 보여주는 중요한 요소라고 생각해요. J.Lab은 특히 여러 분야의 블로그를 운영하고 있어서 각 블로그의 주제를 명확히 보여줄 단축 아이콘이 절실했습니다.

    그래서 과감하게 기존 이미지 파일을 버리고 SVG 포맷을 선택했습니다. SVG는 벡터 기반이라 어떤 크기로 확대해도 이미지가 깨지지 않고 선명하다는 장점이 있죠. 또한 파일 크기도 상대적으로 작아서 웹 성능에도 긍정적인 영향을 줍니다. 이런 이유로 이슈로그, KidStory, IT Story 블로그 각각의 아이덴티티에 맞는 SVG 단축 아이콘을 제작하기로 결정했어요.

    이 과정에서 KidStory 블로그의 작성자명을 'KidMomJin'에서 'Jin.Mom'으로 변경하고, 이슈로그 블로그명도 '이슈로그'에서 'IssueLog'로 영문 전환하는 등 블로그 전반의 브랜딩 작업을 함께 진행했습니다. 작은 변경이지만 전체적인 통일감을 주는 데 큰 도움이 되었습니다. 이 모든 변화에 어울리는 새로운 파비콘이 필요했던 거죠.

    Blogger XML 테마와 Base64 인코딩의 만남

    자, 이제 SVG 파일을 준비했으니 Blogger XML 테마에 삽입하는 일만 남았습니다. 일반적인 HTML에서는 <link rel='icon' type='image/svg+xml' href='/path/to/favicon.svg'> 이런 식으로 간단하게 처리할 수 있죠. 저도 처음엔 이렇게 시도했습니다. 하지만 Blogger의 XML 테마에서는 이게 제대로 작동하지 않더군요.

    테마 편집기에 들어가 <head> 섹션에 이 코드를 넣어봤더니, XML 파싱 에러가 나거나 아예 무시되는 현상이 발생했습니다. Blogger의 XML 파서는 일반적인 HTML 파서와는 다르게 SVG 태그나 특정 속성들을 허용하지 않는 경우가 많았습니다. CSS 파일에 background-image로 넣어볼까도 생각했지만, favicon은 link 태그로 처리하는 것이 일반적이라 다른 방법을 찾아야만 했죠.

    며칠간 구글링과 삽질을 반복하다가 결국 한 가지 해법을 발견했습니다. 바로 SVG 이미지를 Base64로 인코딩하여 data:image/svg+xml;base64,... 형태로 사용하는 것이었습니다. 이 방법은 이미지를 직접 HTML/CSS 코드 안에 문자열 형태로 포함시키는 것이라 외부 파일 참조의 제약을 우회할 수 있습니다. J.Lab 블로그처럼 외부 서버를 직접 제어하기 어려운 환경에서 아주 유용한 꼼수죠.

    개발자가 복잡한 코드 오류 화면을 보고 좌절하는 모습의 아이소메트릭 일러스트. Blogger XML 테마에서 SVG 파비콘 적용에 어려움을 겪는 상황을 묘사.

    실제 적용 과정과 깨알 팁

    해결책을 찾았으니 이제 적용하는 일만 남았습니다. 먼저 제작한 SVG 파일을 Base64 인코딩 툴을 이용해 문자열로 변환했습니다. 온라인에 무료로 사용할 수 있는 Base64 인코더들이 많으니 적절한 것을 선택하면 됩니다. 변환된 문자열은 상상 이상으로 길어서 처음엔 당황했지만, 이게 맞더군요.

    다음으로, Blogger 테마 편집기로 이동해서 <head> 섹션 안에 아래와 같은 link 태그를 삽입했습니다. 이 태그의 href 속성에 아까 인코딩한 Base64 문자열을 통째로 넣어주는 겁니다. 이때 type을 image/svg+xml로 명시하는 것이 중요합니다.

    즉, <link rel='icon' type='image/svg+xml' href='data:image/svg+xml;base64,인코딩된-SVG-문자열-여기에-붙여넣기'/> 와 같은 형태가 됩니다. 저는 여기에 더해서 rel='shortcut icon'도 함께 사용했습니다. 구형 브라우저 호환성을 위한 것이죠.

    이렇게 설정하고 저장한 뒤 블로그를 새로고침했더니, 드디어 제가 원했던 SVG 파비콘이 브라우저 탭에 선명하게 나타나는 것을 확인할 수 있었습니다. 이 감격이란! KidStory, IssueLog, IT Story 모든 블로그에 각각의 개성을 담은 새로운 파비콘이 적용된 것을 보니 뿌듯함이 밀려왔습니다.

    브라우저 탭에 SVG 파비콘이 선명하게 표시되고, 배경에는 Base64 인코딩된 코드가 보이는 성공적인 적용 모습 일러스트.

    적용 후 주의할 점은 브라우저 캐시 문제였습니다. 파비콘은 브라우저가 강력하게 캐시하는 요소 중 하나라, 변경 사항이 즉시 반영되지 않을 수 있습니다. Ctrl+F5(강제 새로고침)를 여러 번 시도하거나, 아예 시크릿 모드 또는 다른 브라우저에서 확인하는 것이 좋습니다. 만약 여러 개의 파비콘 태그가 있다면, 가장 마지막에 선언된 것이 우선순위를 갖는다는 점도 기억해두세요.

    마무리하며: 삽질은 성장의 자양분

    간단해 보였던 파비콘 교체 작업이 이렇게 길고 복잡한 여정이 될 줄은 몰랐습니다. 하지만 이 작은 단축 아이콘 하나를 완벽하게 적용하기 위해 고군분투하면서, Blogger XML 테마의 특성과 Base64 인코딩의 활용법에 대해 더 깊이 이해하게 되었습니다. 역시 삽질은 개발자의 성장을 위한 필수 코스인 것 같네요.

    J.Lab은 앞으로도 블로그의 작은 디테일 하나하나까지 신경 쓰며 사용자 경험을 개선해나갈 계획입니다. 이번 경험을 바탕으로 다른 블로그 요소에도 SVG를 적극 활용하는 방안을 모색해야겠습니다. 다음번에는 또 어떤 재밌는(?) 문제와 마주할지 벌써부터 기대가 됩니다! 여러분도 혹시 Blogger 파비콘 SVG 문제로 고민하고 계셨다면, 이 방법이 도움이 되기를 바랍니다.

    J.Lab의 추상적인 아바타가 다양한 SVG 파비콘이 적용된 여러 브라우저 탭을 보며 미래를 구상하는 일러스트. 블로그 개선에 대한 J.Lab의 생각.
    Base64Encoding BloggerFavicon FrontendTips SVGIcon WebDevelopment XMLTheme
    ← 이전 글
    최근 게시물
    다음 글 →
    이전 게시물
    ≡ 글 목록으로
    소개
    path
    J.Lab

    커리어와 삶의 방향을 탐색하며
    기록하는 공간입니다

    카테고리
    403 Forbidden Error 1 AdSense 1 AdSense Bot Detection 1 AI Automation 1 AI Image Generation 1 ai-automation 2 AI-Prompting 1 AIBlogAutomation 1 AICodeLog 1 AIContentGeneration 1 AIImageGeneration 1 AIWritingErrors 1 API Automation 2 API Retry Design 1 api-automation 1 API-Deprecation 1 api-error 1 api-fallback 1 api-retry-strategy 1 api-troubleshooting 1 APIDebugging 1 APIError 1 APIErrorHandling 1 APIIntegration 1 APITokenRenewal 1 AppsScript 1 appsScriptAutomation 1 AutomatedBlogging 1 automation 1 Automation 2 AutomationTroubleshooting 1 Backoff Algorithm 1 Base64Encoding 1 BatchProcessing 1 blog-automation 1 blog-customization 1 blog-migration 3 Blog-Sorting 1 blog-strategy 1 blog-theme-customization 1 blog-workflow 1 blogautomation 1 BlogAutomation 2 Blogger 4 Blogger API 2 Blogger Automation 1 Blogger SEO 1 blogger-api 3 blogger-automation 1 blogger-error-400 1 blogger-labels 1 blogger-seo 1 blogger-tips 1 Blogger-Tips 1 BloggerAPI 3 BloggerBypath 1 BloggerCustomization 2 BloggerFavicon 1 BloggerTemplate 1 BloggerTemplateEditing 1 BloggerTheme 1 BloggerThemeCustomization 1 BloggerXMLStructure 1 Blogging-Automation 1 BloggingTools 1 BlogQuality 1 BlogSpot 1 BWidgetBIncludable 1 CardClickHandler 1 CDATA 1 clamping-text 1 Code Integration 1 codelog 1 CodeLog 1 codeRefactoring 1 contentsequencing 1 cost-reduction 1 CSSOverlay 1 data-parsing 1 DatabaseDesign 1 DataRecovery 1 DateInjection 1 Debugging 2 dev-journey 1 DeveloperJourney 2 DevJourney 1 display-none-seo 1 dom-manipulation 1 dynamic-menu 1 Error-Handling 1 ErrorHandling 1 Execution Timeout 1 ExecutionLimit 1 exponential-backoff 1 FactChecking 1 FaviconEmbedding 1 Feed-API 1 filesystem 1 Flat Illustration 1 FluxModel 1 FreeAIImage 1 FrontEndDev 1 FrontendTips 1 GAS Blogger API 1 gas-automation 1 gas-optimization 1 gas-trigger 1 GASTimeout 1 gasTriggerManagement 1 GCP Project Linkage 1 Gemini 1 Gemini API 1 gemini-api 1 GeminiAPI 1 GeminiPrompt 1 GeminiPromptEngineering 1 GmailRestrictions 1 Google Apps Script 7 Google Discover 1 google-apps-script 3 Google-Apps-Script 1 google-blogger 1 googleAppsScript 1 GoogleAppsScript 6 googlesapps-script 1 hero-image 1 HTMLWidgetBlogger 1 http-429 1 HuggingFace 1 HuggingFaceAPI 1 ico-generator 1 Image Optimization 1 image-automation 1 image-optimization 1 In-App Browser 1 invalid-argument 1 javascript 3 JavaScript 2 javascript-automation 1 javascript-toc 1 jlab-codelog 1 JLabDevLog 1 json-schema 1 label-length-limit 1 linux 1 meta-description 1 Negative Prompt 1 notion-api 1 notion-database 1 notion-gas-integration 1 NotionAPI 1 NotionAutomation 1 notionintegration 1 NotionIntegration 1 OAuth Scope 1 pagination 1 payload-validation 1 permalink-management 1 PersonaDesign 1 pil-image-processing 1 Pinterest 1 Pollinations 1 Pollinations Flux 1 pollinations-api 1 PollinationsAI 1 PositionAbsolute 1 Prompt Design 1 Prompt Engineering 1 prompt-engineering 1 Prompt-Engineering 1 PromptEngineering 1 publishorder 1 python-favicon 1 queue-stuck 1 RandomDelay 1 rate-limiting 1 Refactoring 1 rfc3339 2 Robots Meta Tag 1 RSS Feed 1 scriptNotFound 1 Search Engine Optimization 2 Search-Engine-Optimization 1 SEO Tips 1 seo-optimization 4 SEO-Optimization 1 seriesmanagement 1 SidebarLinks 1 SNSMarketing 1 SVGIcon 1 table-of-contents 1 TechJournal 1 Template 1 ThreadsAPI 1 tistory-migration 1 transparent-favicon 1 triggerCleanup 1 Troubleshooting 1 unzip 1 URL Slug 1 vanilla-js 1 Web Development 1 Web Publishing 2 Web Security 1 web-development 1 Web-Development 1 web-development-tips 1 web-performance 1 web-scraping 1 WebAccessibility 1 WebDevelopment 3 WebDevelopmentTips 1 WebDevJourney 1 windows 1 WorkflowAutomation 1 XMLParser 1 XMLSpecialCharacters 1 XMLTheme 1 zip 1
    인기 글
    GAS에서 Blogger API 403 오류 완전 정복 — appsscript.json 스코프와 GCP 프로젝트 연결
    GAS에서 Blogger API 403 오류 완전 정복 — appsscript.json 스코프와 GCP 프로젝트 연결
    Google Apps Script 실행 시간 6분 제한 — Gmail 계정 함정과 랜덤 딜레이 설계
    Google Apps Script 실행 시간 6분 제한 — Gmail 계정 함정과 랜덤 딜레이 설계
    Blogger 테마 XML 직접 뜯어봤더니 알게 된 것들
    Blogger 테마 XML 직접 뜯어봤더니 알게 된 것들
    다른 블로그
    IssueLog
    IssueLog
    issuelog.jinbytes.com
    KidStory
    KidStory
    kidstory.jinbytes.com
    IT Story
    IT Story
    jinbytes.com
    © Jin's Lab · J.Lab · All Rights Reserved
    jinbytes.com · Powered by Blogger