ESC

내가 LCP를 개선한 방법

개발

내가 LCP를 개선한 방법

따로 글을 쓰지 않았지만, 최근 블로그를 개선하는 작업을 하고 있습니다. 이 블로그는 2023년 Jekyll를 이용하다, Next.js를 기반으로 Contentlayer라는 종속성에 의존하여 개발되었었습니다. 최근 제가 작성했던 코드들을 개선하고자 블로그를 최근 @next/mdx에 의존하도록 변경하고, 여러 문제점을 해결해나가는 중에 LightHouse 검사의 성능 점수가 낮게 나와 이를 분석하고 해결한 경험에 대해 이야기 해보려 합니다. LCP가 뭔가요? Largest Contentful Paint를 줄여서 LCP라고 부르니 저도 이제부터 그렇게 부르겠습니다. LCP는 사용자가 페이지를 로딩 할 때를 기준으로 표시되는 가장 큰 이미지, 동영상 등의 렌더링 시간을 의미합니다. Google에서는 2.5초 이하면 좋다고 언급하였지만, 일단 검사 결과 개선 방안을 제안해줬으니 살펴보겠습니다. 성능 점수가 왜이리 낮을까? Lighthouse 검사를 블로그 메인 화면에서 실행하면 성능 점수는 87점, LCP는 2.4초였습니다. Lighthouse는 성능을 개선 할 수 있도록, 인사이트를 제공해줍니다. 인사이트의 내용은 다음과 같았습니다. 문제는 이미지가 렌더링 되는 크기에 비해 지나치게 큰 이미지를 로딩하는 것과 이미지 로딩 우선 순위가 정해지지 않았다는 것이였습니다. 두 내용 모두 이미지 최적화가 필요하다는 뜻 입니다. 해결해보자! Lighthouse에서는 이러한 성능 문제를 해결 할 수 있도록 해결 방안도 제시해줍니다. 이미지 로딩 우선 순위가 정해지지 않은 문제의 경우 fetchpriority 속성을 사용해야하고, lazy loading이 적용되지 않았다는 언급이 되어 있습니다. 대부분의 PC의 경우 제 블로그 메인 페이지에 접속하였을 때, 4개의 이미지가 먼저 보입니다. 이 이미지들만 먼저 로딩하도록 최적화 하기로 했습니다. 제 블로그의 글 목록에 표시되는 이미지들은 Next.js에서 제공하는 Image 컴포넌트를 사용합니다. Image 컴포넌트에 상위 4개 이미지에만 fetchPriority 속성을 high, loading 속성을 eager로 설정했습니다. 나머지는 fetchPriority 속성을 low, loading 속성을 lazy로 설정하여 이미지 로딩 우선 순위를 명확히 하였습니다. 이미지가 표시되는 크기에 비해 제공되는 이미지가 너무 크다는 문제에 대해서는 어떠한 개선 방안을 언급해주지는 않았습니다. 하지만, Next.js의 Image 컴포넌트에 대한 공식 문서 중, sizes에 대한 내용을 보고 이를 이용하여 문제를 해결하면 될 것 같았습니다. 블로그의 메인 페이지는 너비 685px 이상의 기기에서 글 목록을 두 칸으로 나누고, 미만의 기기들에서는 글 목록을 한 칸으로 표시합니다. 이를 기준으로 너비 685px 이상의 기기에서는 이미지를 뷰 포트 절반의 너비로 제공하고, 미만의 기기들에서는 뷰 포트 전체의 너비로 제공합니다. 해치웠나 수정 사항을 적용한 결과를 Vercel를 통하여 배포해보고 다시 확인해보았습니다. 결과를 확인해보니, Lighthouse 성능 점수가 향상되었습니다. Lighthouse 검사를 블로그 메인 화면에서 실행하면 성능 점수는 100점, LCP는 0.4초였습니다. 무선 인터넷 품질이 좋지 않은 곳에서 가끔씩 제 블로그에 접속 할 때, 일부 글 목록의 이미지가 렌더링 되지 않는 문제가 더 이상 발생하지 않는 부수적인 효과도 얻었습니다.

이제 Next.js에서 파라미터 쓰는 법

개발

이제 Next.js에서 파라미터 쓰는 법

App Router를 쓰는 Next.js 15부터 많은 동기 API가 비동기화 되었습니다. 그 중, params와 searchParams가 비동기 Promise화가 되었습니다. Client Component에서는 use() 훅을 통한 동기 접근이 가능해집니다. 이에 대한 변경점에 대해 알아봅니다. params와 searchParams는 왜 Promise가 되었을까? Next.js 15부터는 각 Segment 단위로 비동기 렌더링이 가능해졌습니다. 이러한 변경점 덕분에 각 Segment별로 렌더링 후 준비된 부분만 먼저 렌더링 하는 Streaming Rendering이 가능해졌습니다. 이제 각 Segment를 독립적으로 렌더링 하는 것이 가능해졌기 때문에, 부모 Segment가 아직 렌더 중일 떄 자식 Segment의 파라미터 값을 바로 읽을 수 없는 상황이 발생하게 됩니다. 이러한 상황을 방지하기 위해 아직 렌더링 되지 않은 Segment의 파라미터 값을 가져오는 상황을 방지하기 위해 비동기가 된 것으로 보입니다. Layout에서의 사용 Next.js 15 이전에는 아래와 같은 구조로 비동기 Layout에서 사용이 가능했었습니다. Next.js 15 이후부터는 아래와 같이 params를 Promise 타입으로 변경하고, generateMetadata도 비동기 함수로 변경합니다. 동기 Layout의 경우 React의 use() 훅을 통하여 Promise를 동기적으로 해제합니다. Page에서의 사용 Next.js 15 이전에는 아래와 같은 구조로 비동기 Page에서 사용이 가능했었습니다. Layout과 비슷한 맥락으로 Next.js 15 이후부터는 아래와 같이 params와 searchParams를 Promise 타입으로 변경하고, generateMetadata도 비동기 함수로 변경합니다. Client Component에서는 React의 use() 훅을 통하여 Promise를 동기적으로 해제합니다. Route Handler에서의 사용 Next.js 15 이전에는 아래와 같은 구조로 Route Handler에서 사용이 가능했었습니다. 비슷한 맥락으로 Next.js 15 이후부터는 아래와 같이 params를 Promise 타입으로 변경합니다. 마무리 이제 Next.js의 모든 Component는 params와 searchParams를 Promise로 다루어야 합니다. 서버에서는 await, 클라이언트에서는 use()로 접근하는 것이 올바른 패턴입니다. 이러한 변경점이 있는지 모르고 최신 Next.js 프로젝트에서 기존처럼 파라미터를 사용하려다가 오류가 발생한 경험이 있습니다. 이번 글에서는 왜 이러한 변화가 생겼는지, 이제 어떻게 사용하는 것이 올바른지에 대해서 알아보았습니다. 참고 문서

Next.JS 블로그 사이트맵 만들기

개발

Next.JS 블로그 사이트맵 만들기

Next.JS로 블로그를 개편한 지도 거의 2개월이 되어가는데요. 검색했을 때 블로그가 나오게 하려면 웹마스터 도구에 등록해야 합니다. 하지만 글을 작성할 때마다 글의 주소를 일일이 등록해 주어야 합니다. 하지만 사이트맵이 있다면, 그럴 필요가 없는데요. 만들어 봅시다. 본 내용은 next-contentlayer를 사용한 프로젝트를 기준으로 합니다. 정적 사이트맵 생성을 위한 sitemap.js 만들기 프로젝트 어딘가 본인이 원하는 곳에 sitemap.js를 만들어 주세요. 파일에 모듈을 임포트해 줍니다. 이 모듈은 /posts 폴더 안에 있는 블로그 글 파일의 이름을 불러오기 위한 것입니다. /posts 폴더 안에 있는 파일들의 이름을 불러오도록 해보겠습니다. getFileNames라는 함수에 /posts 폴더 안에 있는 파일들의 이름을 불러오도록 하였습니다. 사이트맵은 날짜와 시간도 필요로 하므로 블로그 글 파일에서 프론트메터에서 불러오도록 해보겠습니다. extractFrontmatter라는 함수에 블로그 파일에서 Date라는 프론트메터 안에 있는 값을 추출합니다. 또한 메인 블로그 페이지와 글들의 우선순위를 지정하고 사이트 변경 횟수를 지정해줍니다. 이제 위에서 정의한 getFileNames를 이용해서 파일 이름을 가져온 후 filenames에 저장하여 블로그 주소 뒤에 추가합니다. extractFrontmatter를 이용하여 프론트매터를 가져온 후 lastmod에 저장합니다. 이제 이 정보들을 사용하여서 XML 형식의 sitemap을 생성해서 /public에 저장합니다. 완성된 sitemap.js은 아래와 같습니다. 빌드 시 sitemap.xml 생성되게 하기 완성된 sitemap.js를 빌드 시 마다 실행되게 해야 하는데요. package.json을 아래와 같이 수정해 줍니다. 이제 빌드 시 sitemap.js가 실행되어 /public 폴더 안에 sitemap.xml이 생성되게 됩니다.

Termius 학생 인증 받기

개발

Termius 학생 인증 받기

Termius는 SSH 접근을 돕는 아주 유용한 도구입니다. 깔끔하고 사용하기 편해 아주 인기가 높죠. 하지만 월 $10짜리 Pro 요금제를 구독을 하지 않는다면 Autocomplete, SFTP, Environment Variables와 같은 자동화를 돕는 도구나 SOCKS Proxy, HTTP Proxy 같은 터널링 기능을 사용할 수 없습니다. 조금 웃긴 게, 최초 가입 시 이 요금제를 2주 정도 맛보기로 보여줍니다. 결제 수단 등록 안 하면 이 모든 기능을 빼앗아버리고요. 하지만 학생이라면 GitHub Student Developer Pack으로 인증받게 된다면 월 $10짜리 Pro 요금제가 주어지게 됩니다. 바로 받아봅시다. 받기 이번에는 놀랍도록 간단합니다. account.termius.com/student에 접속합니다. 접속하면 Termius 계정으로 로그인하라고 할 수도 있는데, 로그인해 줍니다. 로그인하면 아래와 같은 화면이 표시될겁니다. 저 화면에서 Link your GitHub account 버튼을 누르면 인증이 완료됩니다. 만약 시도중인 브라우저에서 한번도 GitHub에 로그인한 적 없다면 GitHub에 로그인 해달라고 할 수 있는데, 로그인해주면 됩니다. 사용하기 이제 Autocomplete, Environment Variables 등 다양한 기능을 사용할 수 있게 되었습니다. SSH를 사용할 Host들을 추가 후 사용하면 되겠습니다. 마무리 GitHub Student Developer Pack을 이용해서 Termius에서 학생 인증을 받아보았습니다. 여기까지 GitHub Student Developer Pack을 이용한 혜택을 소개해 보았습니다.

JetBrains 무료 교육용 라이선스 받기

개발

JetBrains 무료 교육용 라이선스 받기

저번에는 GitHub Student Developer Pack을 받아봤습니다. 이제 이것을 이용해서 JetBrains IDE를 무료 교육용 라이선스를 이용해 사용할 수 있는데요. 바로 받아봅시다. 받기 JetBrains 무료 교육용 라이선스를 받기 위해 먼저 www.jetbrains.com/shop/eform/students/에 들어가면 아래와 같이 여러 방법으로 학생임을 인증할 수 있는 방법이 나와있습니다. 이 네 가지 방법 중에서 저희는 GitHub Student Developer Pack을 받았으니 쉽고 간편하게 인증이 가능한 GitHub를 선택해 봅니다. GitHub로 인증 버튼을 누릅니다. 이때 라이선스 발급을 시도 중인 브라우저에서 GitHub에 로그인이 되어있다면 GitHub에 로그인해달라고 하지 않지만, GitHub에 로그인이 되어 있지 않다면 로그인해달라고 할 수도 있습니다. 그 후 채워져 있는 내용이 맞는지 확인하고 동의해야 할 것들에 동의하면 발급이 완료됩니다. 사용하기 모든 과정이 끝났다면 아래와 같은 화면이 표시됩니다. 이제 원하는 JetBrains IDE를 다운로드해 사용하면 됩니다. 마무리 GitHub Student Developer Pack을 이용해서 JetBrains 무료 교육용 라이선스를 발급받아보았습니다. 다음에도 제가 받고 있는 GitHub Student Developer Pack을 이용한 혜택을 소개해 보겠습니다.

GitHub Student Developer Pack 받기

개발

GitHub Student Developer Pack 받기

만약 학생(중학생, 고등학생, 대학생 등)이거나 교직원이라면 GitHub Student Developer Pack을 받을 수 있습니다. 이것을 받게되면 일단 GitHub Profile에 Pro Label이 추가가 되며, GitHub Copilot, JetBrains Licenses를 얻는 등 다양한 혜택이 주어집니다. 바로 받아봅시다. 받기 GitHub Student Developer Pack을 받으려면 우선 education.github.com/students에 접속합니다. 그 후 Teacher인지, Student인지 선택합니다. 선택 했다면 학교 이메일로 인증을 해야하는데요. 밑에 학교에서 사용하는 이메일 주소를 추가해달라고 하니까 추가해줍시다. Add an email address 버튼을 누르면 GitHub의 이메일 설정창으로 보냅니다. 여기서 학교 이메일을 추가해주고, 학교 이메일 계정으로 이메일을 인증해달라는 링크가 담긴 메일이 옵니다. 그 메일에 첨부된 링크를 선택하면 추가된 이메일 주소가 인증됩니다. 그러면 이제 아까 본 화면에서 학교 이메일이 추가되었을겁니다. 만약 저렇게 뜨지 않고 학생증이나 다른 학생인 것을 인증할 수 있는 방법을 요구한다면 그 아무도 아직 학교 이메일로 GitHub Student Developer Pack을 받지 않은 것입니다. 만약 그렇다면 학생임을 인증할 수 있는 생활기록부나 학생증 등을 첨부 후 1일에서 5일 정도를 기다리면 받을 수 있게 되며 그다음 사람은 이러한 인증 절차가 필요하지 않습니다. 사용하기 모든 절차가 끝나고 GitHub Student Developer Pack을 받게 된다면 GitHub Profile에 Pro Label이 추가됩니다. 이제 IntelliJ나 Visual Studio Code 등에서 GitHub Copilot을 사용하거나 월 $4를 내며 구독해야 하는 GitHub Pro와 똑같은 혜택을 받게 되는 등 다른 여러 가지 혜택을 지원받을 수 있습니다. 마무리 생각보다 학생이라는 것만으로 무료로 얻을 수 있는 혜택이 꽤 많이 존재합니다. 다음에는 JetBrains 무료 교육용 라이선스를 받아보는 방법과 Termius에서 학생 인증을 받는 법에 대해 알아보도록 하겠습니다.

Next.JS로 블로그를 다시 만들었습니다.

개발

Next.JS로 블로그를 다시 만들었습니다.

블로그가 개설된 지 2개월 하고도 1주일이 지났습니다. 올릴 글은 많았지만 올리지 않았습니다. 블로그가 개설된 이후 제가 짜 놓은 코드 꼬락서니가 마음에 들지 않았고 그래서 글도 쓰기 싫어 방치했습니다. 사실 그것도 있고 시간이 많이 없었는데요. 어떤 기회로 Next-Contentlayer를 사용하는 프로젝트를 할 기회가 있어서 그 프로젝트로 어느 정도 감을 잡은 후에 제 블로그를 갈아엎어야겠다는 계획을 세웠습니다. 그리고 지금 블로그를 완벽하게 완성시켰죠. 어떻게 만드는지 과정을 공유해 볼까 합니다. 당장 이 블로그 소스 궁금하신 분은 github.com/dohun0310/d3h1-Blog에 올려놨으니까 그거 보시면 되겠습니다. 갈아 엎을 시간 Jekyll 기반의 블로그는 엉망이었습니다. SCSS 파일을 썼는데 한 파일에 블로그의 모든 스타일링을 다 때려 박았으니 알아보기도 엄청나게 힘들었고 그냥 코드를 엄청나게 이상하게 짰습니다. 그리고 디자이너가 준 디자인을 개발하기 힘들다고 갈아엎은 것도 마음에 안 들었어요. 아니 그냥 다 변명이고 제 마음에 안 들었어요. 그래서 생각했죠. 새로 만들고 다 갈아엎어버려야겠다고요. 그래서 어떻게 만들까 하다가 제가 좋아하는 React로 만들려고 했는데 제가 존경하는 어떤 분께서 Next.JS가 쉽고 좋다고 추천을 해줘서 Next.JS를 사용하기로 했고 Next.JS에 정적 사이트를 쉽게 만들 수 있도록 도와주는 Next-Contentlayer라는 모듈이 있길래 그거 끌고 와서 만들었어요. 이제 뭐 쓸지 다 정했으니까 디자인 받아와야겠죠? 전에 디자인해 주신 분께 모바일 어떻게 만들어야 할지 모르겠다고 말하니까 또 금방 하나 찍어내주셨어요. 멋진 걸로요. 제작 시작 이제 Next.JS로 블로그 제작을 시작해 봅시다. 모두 Node.JS랑 npm 아니면 yarn 아니면 pnpm랑 create-next-app 하나 정도는 있으시죠? 터미널에 아래와 같이 입력하면 프로젝트 파일이 만들어집니다. 만드셨으면 필요한 모듈들 설치를 해야 합니다. 아래와 같이 진행해 주시면 됩니다. 자신이 사용하는 패키지 매니저에 따라서 알아서 해주시면 되고요. 이 모듈들은 블로그 제작을 돕고 CSS in JS를 할 수 있게 해주고 코드 블록을 이쁘게 꾸며주는 플러그인들입니다. 모듈 설치다 했으면 이제 본격적으로 코드 짜봐야겠죠. 그전에 설정부터 먼저 해줍시다. 먼저 프로젝트 최상단에 위치한 next.config.js 파일에 들어가서 수정해 주세요. 먼저 프로젝트 최상단에 위치한 tsconfig.json도 알맞게 수정해주세요. 여기까지 하셨으면 최상단에 contentlayer.config.ts라는 파일 하나 생성해주시고 아래처럼 작성하시면 됩니다. 다른 포털에도 표시 되어야 하니까 최상단에 next-sitemap.config.js 파일 하나 만들어서 아래처럼 작성해야 sitemap이 생성되기 때문에 다른 포털에 표시될 수 있고요. 모듈 설정 끝났으니까 코드 짜봅시다. 마크다운 렌더링 하기 Next.JS가 폴더로 라우팅해서 편하게 우리가 쓸 수 있죠. 저는 도메인 바로 뒤에 아이디가 오는 형식으로 구성하고 싶어서 app/[...slug] 경로에 page.tsx 파일을 만들었어요. 이거 마음에 안 드시면 공식 문서 참고하셔서 다르게 하셔도 되고요. 이제 posts라는 폴더를 프로젝트 최상단에 만들고 그 폴더 안에 example.md 파일을 만들어보세요. 그리고 그 안에는 아래와 같이 작성하세요. 그리고 터미널에 자신의 패키지 매니저에 맞게 아래와 같은 명령을 입력 후 실행해 보세요. 이제 터미널에 뭐라뭐라 뜰겁니다. 이 문구 밑에 뜨는 - ready ~~~를 주목하세요. 거기에 url: 이라고 되어 있는데에 어떤 주소가 있을텐데 그곳을 Ctrl + 클릭하면 브라우저 창이 하나 열릴겁니다. 주소 뒤에 /example을 입력하고 접속해보면 우리가 쓴 글이 잘 렌더링 된 것을 확인 할 수 있죠. 마음에 안드는 부분은 page.tsx에 @emotion/styled를 바로 가져와서 사용하거나 따로 style.tsx로 빼서 스타일링 해서 사용하시면 됩니다. 나는 CSS in JS가 싫다고 하시면 알아서 하시면 되고요. 글 목록 가져오기 우리 이제 글 표시할 수 있으니까 글 목록을 만들어봐야겠죠. app 폴더 밑에 page.tsx라는 파일이 있을 겁니다. 거기에 우리는 글 목록을 표시해 볼 거예요. 그 파일 열고 아래와 같이 작성하세요. 이렇게 page.tsx를 작성하면 아까 우리가 /example을 붙였던 주소에 /example을 지우고 다시 접속해 보면 글 목록이 표시될 겁니다. 쉽죠? 생긴 게 마음에 안 드실 텐데 그것도 나중에 @emotion/styled 쓰시거나 다른 방법으로 스타일링을 하면 됩니다. 마무리 예전에 Jekyll 블로그 만든 건 그냥 코드를 다 빼다 박았는데 이번에는 초보자분들이 알아서 해볼 수 있도록 글을 작성해 봤어요. 제가 저번 주 토요일부터 이걸 만들기 시작했으니까 대충 만드는데 5일 정도 걸렸네요. 이번 블로그는 매우 마음에 듭니다. 제가 코드를 이상하게 짠 거 같지도 않고 훌륭한 분의 도움을 받아 코드가 탄탄하거든요. 제 우분투 세팅 법도 공유하고 싶고 Today at Apple 갔다 온 후기도 써봐야겠습니다. 따라 오시느려고 수고 많으셨습니다. 이제 자신만의 멋진 블로그를 만들어보세요.

Jekyll를 이용해 블로그를 만들었습니다.

개발

Jekyll를 이용해 블로그를 만들었습니다.

안녕하세요. 오늘은 블로그를 개설하고 처음 제대로 된 글을 작성해보려고 합니다. 이 블로그를 만든 경험과 사용된 코드들을 공유하려고도 합니다. 블로그가 가지고 싶어! 어느 날, 자기 전에 블로그가 가지고 싶다는 생각이 들었습니다. 급하게 이불을 걷어 차고 책상 앞에 앉아 주로 사용되는 티스토리와 네이버 블로그를 비교하기 시작했습니다. 티스토리: 수익 창출 가능, 커스텀 가능, 서버의 불안정성 높음, 커스텀을 많이 할 경우 느려짐 네이버 블로그: 수익 창출 불가능, 커스텀 불가능, 서버의 안정성 높음, 기본 UI도 깔끔함 이렇게 비교를 하고 보니까 티스토리와 네이버 블로그 모두 사용하고 싶지 않아졌습니다. 일단 마음대로 커스텀 할 수 있는 티스토리는 커스텀을 하면 할수록 블로그가 느려지고 네이버는 커스텀 가능한 부분 자체도 적었고 개인 사용자는 수익 창출이 불가능이나 마찬가지였고 구글에서 검색을 할 경우 노출도 잘되지 않거든요. 게다가 두 플랫폼 모두 에디터가 엄청나게 무겁고 별로입니다. 그래서 그냥 직접 만들기로 하였습니다. 블로그를 만들자! React.JS를 사용할지 Next.JS를 사용할지 생각하다가 '백엔드는 어떻게 하지?'라는 생각이 들었습니다. 사실 React.JS나 Next.JS를 이용해 프론트엔드를 작업하고 포스팅할 때마다 js 파일을 생성하면 백엔드 작업이 그렇게 복잡해지지 않을 텐데 그러면 뭔가 별로라는 생각이 들어 다른 대안이 있지 않을까 열심히 검색해 보았습니다. 검색을 한 결과 Jekyll를 이용해서 블로그를 만들면 제가 원하는 블로그를 만들 수 있다는 결과에 도달했습니다. 테마가 다양하고, 내 입맛대로 커스텀 할 수 있고, 수익 창출이 가능하고 제가 등록만 한다면 모든 포털 사이트에 제 블로그를 노출시킬 수 있는 방법이었으니까요. Jekyll 시작하기 저는 WSL2를 이용해 VSC를 사용하는 개발 환경입니다. 제 환경에서 Jekyll 프로젝트를 시작하기 위해서는 아래와 같은 명령을 터미널에 입력해 필요한 패키지를 설치하면 되었습니다. 필요한 패키지들을 모두 설치하였으면 Jekyll 프로젝트를 만들고 싶은 경로에 진입하여 아래와 같은 명령어를 입력하면 Jekyll 프로젝트가 생성됩니다. 이렇게 프로젝트를 생성하고 나서 생성된 폴더로 들어가 아래와 같은 명령어를 입력합니다. 이렇게 하고 127.0.0.1:4000를 웹 브라우저의 주소창에 입력하고 접속하면 Jekyll의 기본 테마인 minima가 적용된 Jekyll 화면을 아래와 같이 확인 할 수 있습니다. Jekyll 프로젝트에 테마 적용하기? 이렇게 Jekyll 프로젝트를 처음 만들게 되면 심심하다 못해 재미없어 보이는 Jekyll의 기본 테마가 적용된 모습을 확인할 수 있는데요. 하지만 저는 이런 재미없는 테마보다는 더욱 개성 있고 이쁜 테마를 Jekyll에 적용해 보고 싶었습니다. 그래서 Jekyll의 테마가 모여있는 Jekyll Themes에 접속하여 인기 있는 테마 몇몇 개를 적용해 보았습니다. 하지만 제 마음에 드는 테마가 없었고 그래서 제 블로그를 제 입맛에 맞게 제가 직접 한번 꾸며보려고 하였습니다. 마침 주변에 멋진 디자인을 만드는 멋진 사람이 있었고 부탁을 해 마음에 꼭 맞는 디자인을 받아볼 수 있었습니다. 만들기 어려워보이는 부분이 있어 제가 조금 다듬고 그것에 맞추어 저만의 블로그를 만들기 시작했습니다. Jekyll 프로젝트 완성하기 저는 PWA(Progressive Web App)을 매우 좋아하는 편이여서 가장 먼저 적용하기로 하였습니다. PWABuilder를 사용하여서 PWA에 사용할 manifest.json과 아이콘 파일들을 다운로드해서 manifest.json은 Jekyll 프로젝트 경로 최상단에, 아이콘 파일들은 assets 폴더에 저장하였습니다. 그다음 head.html의 head 태그가 끝나기 전 아래와 같은 코드 한 줄을 추가해 주면 PWA는 활성화됩니다. head.html을 건드린 김에 OpenGraph와 favicon, title도 적용해 보겠습니다. 먼저 favicon을 적용시켜보겠습니다. Favicon & App Icon Generator를 사용하여 favicon.ico 파일을 얻습니다. 그 후, 얻은 favicon.ico 파일을 assets 폴더에 favicon.ico 파일을 저장하고, head.html의 head 태그가 끝나기 전 아래와 같은 코드 한 줄을 추가해 주면 favicon이 표시되는 것을 확인할 수 있습니다. 이제 OpenGraph와 title을 적용시켜보겠습니다. OpenGraph에서 표시될 이미지를 opengraph.png로 이름을 변경 후 assets 파일 안에 저장하고, head.html의 head 태그가 끝나기 전 아래와 같은 코드들을 추가 후 알맞게 수정해 준다면 OpenGraph와 title이 표시될 것입니다. 이 코드는 _post에 작성될 글에 아래와 같이 선언되어 있어야 완벽하게 작동합니다. 이제, 외관을 꾸며보겠습니다. 먼저 home.html부터 수정해 보겠습니다. category 버튼들은 a 태그를 사용해 만들고 해당 category 페이지에 있을 때 active 되어서 다른 버튼들과는 다르게 표시됩니다. 위에서처럼 posts 폴더에 작성될 글에 잘 선언이 되어 있다면 post-list에 teaser와 date, title, description까지 정상적으로 출력됩니다. 또한 category 기능이 정상적으로 동작하기 위해서는 category.html이라는 파일을 layouts 폴더 안에 아래와 같이 작성해야 합니다. category.html까지 작성이 완료 되었다면, Jekyll 프로젝트의 최상단에 category라는 폴더를 생성 후 그 폴더 밑에 원하는 카테고리 이름.md라는 파일을 생성 후 그 파일을 다음과 같이 작성하면 됩니다. header.html은 다음과 같이 작성하면 됩니다. 이제 html 수정을 맞쳤으니 scss를 작성 해보겠습니다. 먼저 header를 화면에 계속 표시하고 블러를 적용하겠습니다. 다음은 home에 대한 scss를 적용해보겠습니다. 위 코드는 다음과 같은 역활을 합니다. content에 표시되는 page title의 글자 크기를 26px로 지정하고, 왼쪽 정렬하게 만듭니다. category가 active일 때 검정색으로 나오게 만들고 hover 시 ease-out 효과와 함께 #f0f0f0으로 표시되게 만듭니다. post의 간격을 8px로 설정하고 post에 hover 시 teaser의 outline에 애니메이션과 색 변환을 합니다. 이 외에도 모든 스타일링에 관여합니다. 코드블럭을 조금 더 이쁘게 강조하고 싶다면, Rouge Theme Preview Page를 사용하여서 자신이 원하는 테마를 찾고 적용하면 됩니다. 마무리 이렇게 제가 Jekyll를 활용해 블로그를 만든 경험을 공유해 보았습니다. 아직 블로그가 완성되었다고 보기에는 어려운 부분이 많습니다. 아직 paginate도 적용하지 못하였고, 검색바도 완성하지 못하였고 광고 등 제가 원했던 기능들을 귀찮거나 어려워서 아직 넣지 못하였는데, 블로그를 일단 어느 정도 완성시킨 후 시간이 날 때마다 관련 내용을 포스팅하며 완성시키는 것도 좋을 것 같아 필수적인 부분들만 완성해 보았습니다. 아직 블로그에 무엇을 주제로 올릴지 결정하지 못해 블로그가 조금 난해해질 수도 있는데, 이쁘게 완성시킨 블로그인 만큼 천천히 시간을 들여가며 이쁘게 사용해 보겠습니다. 긴 글 읽어주셔서 감사합니다!