diff --git a/posts/Blog/improve-posts-directory-and-images.mdx b/posts/Blog/improve-posts-directory-and-images.mdx new file mode 100644 index 0000000..97f5ce6 --- /dev/null +++ b/posts/Blog/improve-posts-directory-and-images.mdx @@ -0,0 +1,95 @@ +--- +title: 블로그 개선 (1) - 글 파일 구조 및 이미지 개선 +description: 최근 제 블로그의 글 파일 구조 및 이미지를 개선한 경험을 공유합니다. +createdAt: 2024-02-14 +thumbnail: /images/posts/blog/improve-posts-directory-and-images/thumbnail.png +--- + +안녕하세요! 오늘은 제가 최근에했던 **블로그 코드 개선(글 파일 구조 및 이미지)** 경험에 대해서 작성해보겠습니다. 😃 + +앞으로도 블로그 코드 내에서 `기술부채` 항목을 없앤 경험이 있다면 이처럼 글을 작성해보려고 합니다. + +## 1. 글 파일 구조 📜 + +> 읽기전에 아래의 글을 먼저 읽고오시는걸 추천드립니다. 😃 +> [Next.js에서 contentlayer 사용하여 손쉽게 정적블로그 만들기](https://yiyb-blog.vercel.app/posts/nextjs-contentlayer-blog) + +해당 블로그는 [contentlayer](https://contentlayer.dev)라는 도구를 사용해서 만든 블로그인데요. contentlayer 설정 파일에서 마크다운 글 파일들이 위치할 폴더를 지정할 수 있습니다. + +저는 `posts`라는 폴더로 지정을 했었고, 해당 폴더안에 여러개의 마크다운 글 파일들이 위치했습니다. 하지만 평탄화 된 구조의 특성상 글의 갯수가 많아질수록 **카테고리별로 글을 모아보는것이 어렵다**는 문제점이 있었습니다. + +![기존 posts 폴더 구조](/images/posts/blog/improve-posts-directory-and-images/original-posts-directory.png) + +그래서 저는 `posts` 폴더안의 글들을 **카테고리별로 폴더를 분리**하기로 했습니다. + +### 1-1. 카테고리별로 분리하기 + +저의 블로그 메인 페이지의 왼쪽부분에는 글의 카테고리들이 쭉 나와있는데요. 글마다 `메타데이터`를 지정할때 기존에는 해당 글의 카테고리 정보를 적어두기 때문에, 글의 카테고리 데이터들만 뽑아서 목록을 보여줄 수 있었습니다. + +> 관련 코드파일 [바로가기](https://github.com/yiyb0603/yiyb-blog/blob/develop/src/utils/contentlayer/index.ts) + +하지만 카테고리를 `메타데이터`에 적지 않고 `posts/카테고리명`의 폴더를 만들면 자동으로 카테고리 목록에 포함되도록 만들면 어떨까요? **작성자는 카테고리 정보를 글마다 작성하지 않아도 되고**, 위에서 언급했던 **평탄화된 구조의 문제점을 해결**할 수 있습니다. + +![개선 posts 폴더 구조](/images/posts/blog/improve-posts-directory-and-images/improve-posts-directory.png) + +위 이미지처럼 `posts/TypeScript` 폴더를 만들고, TypeScript를 주제로 한 글 파일들이 위치해있죠? 이런식으로만 만들면 `TypeScript`라는 카테고리가 자동으로 만들어지도록 구현해보겠습니다. + +
+ +방법은 간단합니다. `contentlayer.config.ts` 파일에서 `computedFields` 객체를 사용하면 되는데요. `computedFields`는 특정한 조건에 따라서 정해지는 필드값을 지정해야할때 사용할 수 있습니다. + +> `fields`는 정적 필드, `computedFields`는 동적 필드라고 생각하시면 됩니다. + +그리고 글 파일이 위치한 정보를 나타내는 필드 `posts._raw.flattenedPath`를 사용해서 카테고리 필드를 구성할 수 있습니다. 아래처럼 말이죠. + +```typescript +import { defineDocumentType } from 'contentlayer/source-files'; + +export const Post = defineDocumentType(() => ({ + // .... + computedFields: { + category: { + type: 'string', + resolve: (post) => { + const [category] = post._raw.flattenedPath.split('/'); + + return category; + }, + }, + }, +})); +``` + +만약 `posts/TypeScript` 경로에 `tsconfig.mdx` 파일이 위치할때, `flattenedPath`는 `TypeScript/tsconfig`라는 값을 주는데요. 그래서 `split` 메소드를 사용하여 제일 첫번째 값을 카테고리로 지정할 수 있습니다. + +> 관련 코드파일 [바로가기](https://github.com/yiyb0603/yiyb-blog/blob/develop/contentlayer.config.ts) + +그러고나서 기존에 `fields`의 카테고리를 없앤다음, 글 `메타데이터`마다 지정된 카테고리 정보도 지워주면 됩니다. + +![블로그 메인](/images/posts/blog/improve-posts-directory-and-images/blog-main.png) + +이번 작업을 하면서 건드린 파일이 한군데밖에 없다보니, 쉽게쉽게 할 수 있었습니다. + +## 2. 이미지 경로 변경 🖼️ + +저는 지금까지 글에 들어가는 이미지를 `github issues` 파일 업로드 후 생성된 링크를 이미지로 첨부했는데요. 이미지가 외부 링크로 되어있으면 추후 타 플랫폼으로 마이그레이션시, 용이할것이라고 생각했는데요. + +그러나 대부분의 플랫폼에서 글 내용을 복사 후 붙여넣으면 자동으로 이미지 링크를 생성하기에, 최근에 무의미하다고 생각했습니다. + +
+ +그리고 이와 관련하여 문제도 하나 있었는데, github 이미지 서버의 **응답 속도가 빠르지 않고, 캐싱하지 않는 성능문제**가 있었습니다. `Google Search Console`에서도 이에대해 문제가 있었습니다. `(CLS 지표 문제)` + +![코어 웹 바이탈 문제](/images/posts/blog/improve-posts-directory-and-images/core-web-vital-issue.png) + +그래서 github 이미지 서버를 사용하는것이 아닌, **로컬에 이미지를 저장하여 불러오는 방식**으로 모두 변경했습니다. 그덕에 `코어 웹 바이탈`에서 발생하는 문제도 해결할 수 있었네요. + +![코어 웹 바이탈 해결](/images/posts/blog/improve-posts-directory-and-images/core-web-vital-issue.png) + +## 3. 마치며 📌 + +오늘은 글 파일 구조와 이미지 개선을 통한 블로그 개선 경험에 대해서 작성해봤습니다. 이처럼 앞으로도 블로그 내부를 개선한 경험이 더 있다면, 관련 글을 계속 적어보도록 하겠습니다. 😃 + +
+ +이상으로 글을 마치겠습니다. 글 읽어주셔서 감사합니다! diff --git a/posts/Next.js/nextjs-contentlayer-blog.mdx b/posts/Blog/nextjs-contentlayer-blog.mdx similarity index 95% rename from posts/Next.js/nextjs-contentlayer-blog.mdx rename to posts/Blog/nextjs-contentlayer-blog.mdx index 4707e13..73d5e84 100644 --- a/posts/Next.js/nextjs-contentlayer-blog.mdx +++ b/posts/Blog/nextjs-contentlayer-blog.mdx @@ -2,7 +2,7 @@ title: Next.js에서 contentlayer 사용하여 손쉽게 정적블로그 만들기 description: contentlayer 라이브러리를 사용하여 손쉽게 정적블로그를 만드는 과정을 공유합니다. createdAt: 2023-02-26 -thumbnail: /images/posts/next.js/nextjs-contentlayer-blog/thumbnail.png +thumbnail: /images/posts/blog/nextjs-contentlayer-blog/thumbnail.png --- 안녕하세요! 정적 블로그를 만들고나서, 처음으로 글을 작성해보네요. @@ -219,7 +219,7 @@ export default PostDetailPage; 일단 여기까지만 하고나서, `npm run dev` 명령어를 입력해서 잠깐 개발서버를 실행하면 어떤일이 일어나는지 지켜봅시다. -![contentlayer](/images/posts/next.js/nextjs-contentlayer-blog/contentlayer-generated.png) +![contentlayer](/images/posts/blog/nextjs-contentlayer-blog/contentlayer-generated.png) 프로젝트 Root 경로에 `.contentlayer` 명의 폴더가 생기고, 하위 폴더와 파일들이 생겨난것을 볼 수 있습니다! @@ -317,7 +317,7 @@ export const getStaticProps: GetStaticProps = async ({ params }) => { `allPosts` 배열을 불러온다음, 동적으로 받는 id 파라미터를 통해서 렌더링할 마크다운 파일을 찾는 로직을 위와같이 구현할 수 있습니다. 그런 다음 `useMDXComponent` hooks를 통해서 손쉽게 마크다운 코드를 html 형식으로 렌더링을 할 수 있습니다. -![구현 성공](/images/posts/next.js/nextjs-contentlayer-blog/thumb.png) +![구현 성공](/images/posts/blog/nextjs-contentlayer-blog/thumb.png) 지금까지 **글 상세 페이지** 구현을 예제로 코드를 작성해봤는데, 만약 글 목록 페이지를 구현해도 정말 손쉽게 할 수 있겠죠? 😀 그래서 이 과정은 이글에서 생략하겠습니다! (참고링크에서 도움이 됩니다.) @@ -332,11 +332,11 @@ export const getStaticProps: GetStaticProps = async ({ params }) => { 이번 블로그 개발중에 상당히 골치아픈 버그를 하나 만났었는데요, 개발중간에 production 모드로 실행을 해보았는데, **client side exception**이 발생하면서 아래의 오류가 출력되었습니다. -![한글 유니코드 오류](/images/posts/next.js/nextjs-contentlayer-blog/unicode-error.png) +![한글 유니코드 오류](/images/posts/blog/nextjs-contentlayer-blog/unicode-error.png) 해당 오류는 **마크다운 내용에 한글이 들어간 경우**에만 발생했고, 한글 유니코드 관련된 오류로 보였습니다. 저는 한글이 없으면 생존이 불가능한 사람이기에 무조건 오류를 해결해야 했습니다. -![절망의 오류](/images/posts/next.js/nextjs-contentlayer-blog/despair.png) +![절망의 오류](/images/posts/blog/nextjs-contentlayer-blog/despair.png) 하지만 위에 제가 첨부한 **참고링크** 블로그 글, 공식문서, 다른분들이 작성한 contentlayer 프로젝트 코드 등등 닥치는데로 찾아봤지만 이 오류를 해결하는 방법을 전혀 찾을 수 없었습니다. 😥😥 @@ -344,7 +344,7 @@ export const getStaticProps: GetStaticProps = async ({ params }) => { 결국 그렇게 잠이들었고.. 다음날 기상한 저는 **혹시나하고** `next.config.js`의 `swcMinify` 속성을 **false**로 변경하고, production으로 실행해보니 이게 왠일!! **오류가 더이상 나타나지 않았습니다.** -![너무 많은 오류들](/images/posts/next.js/nextjs-contentlayer-blog/so-many-errors.png) +![너무 많은 오류들](/images/posts/blog/nextjs-contentlayer-blog/so-many-errors.png)
@@ -358,7 +358,7 @@ export const getStaticProps: GetStaticProps = async ({ params }) => { ## 4. 앞으로의 계획 -![넌 계획이 다 있구나](/images/posts/next.js/nextjs-contentlayer-blog/you-have-a-plan.png) +![넌 계획이 다 있구나](/images/posts/blog/nextjs-contentlayer-blog/you-have-a-plan.png) 자주는 아니지만 간간히 블로그 글을 작성하면서 블로그에 새로운 기능이나 `third-party`를 하나씩 추가해나가려고 합니다. diff --git a/public/images/posts/blog/improve-posts-directory-and-images/blog-main.png b/public/images/posts/blog/improve-posts-directory-and-images/blog-main.png new file mode 100644 index 0000000..bae9951 Binary files /dev/null and b/public/images/posts/blog/improve-posts-directory-and-images/blog-main.png differ diff --git a/public/images/posts/blog/improve-posts-directory-and-images/core-web-vital-issue.png b/public/images/posts/blog/improve-posts-directory-and-images/core-web-vital-issue.png new file mode 100644 index 0000000..a72b812 Binary files /dev/null and b/public/images/posts/blog/improve-posts-directory-and-images/core-web-vital-issue.png differ diff --git a/public/images/posts/blog/improve-posts-directory-and-images/core-web-vital-solved.png b/public/images/posts/blog/improve-posts-directory-and-images/core-web-vital-solved.png new file mode 100644 index 0000000..43feee5 Binary files /dev/null and b/public/images/posts/blog/improve-posts-directory-and-images/core-web-vital-solved.png differ diff --git a/public/images/posts/blog/improve-posts-directory-and-images/improve-posts-directory.png b/public/images/posts/blog/improve-posts-directory-and-images/improve-posts-directory.png new file mode 100644 index 0000000..a45229b Binary files /dev/null and b/public/images/posts/blog/improve-posts-directory-and-images/improve-posts-directory.png differ diff --git a/public/images/posts/blog/improve-posts-directory-and-images/original-posts-directory.png b/public/images/posts/blog/improve-posts-directory-and-images/original-posts-directory.png new file mode 100644 index 0000000..10199bf Binary files /dev/null and b/public/images/posts/blog/improve-posts-directory-and-images/original-posts-directory.png differ diff --git a/public/images/posts/blog/improve-posts-directory-and-images/thumbnail.png b/public/images/posts/blog/improve-posts-directory-and-images/thumbnail.png new file mode 100644 index 0000000..aa13310 Binary files /dev/null and b/public/images/posts/blog/improve-posts-directory-and-images/thumbnail.png differ diff --git a/public/images/posts/next.js/nextjs-contentlayer-blog/contentlayer-generated.png b/public/images/posts/blog/nextjs-contentlayer-blog/contentlayer-generated.png similarity index 100% rename from public/images/posts/next.js/nextjs-contentlayer-blog/contentlayer-generated.png rename to public/images/posts/blog/nextjs-contentlayer-blog/contentlayer-generated.png diff --git a/public/images/posts/next.js/nextjs-contentlayer-blog/despair.png b/public/images/posts/blog/nextjs-contentlayer-blog/despair.png similarity index 100% rename from public/images/posts/next.js/nextjs-contentlayer-blog/despair.png rename to public/images/posts/blog/nextjs-contentlayer-blog/despair.png diff --git a/public/images/posts/next.js/nextjs-contentlayer-blog/so-many-errors.png b/public/images/posts/blog/nextjs-contentlayer-blog/so-many-errors.png similarity index 100% rename from public/images/posts/next.js/nextjs-contentlayer-blog/so-many-errors.png rename to public/images/posts/blog/nextjs-contentlayer-blog/so-many-errors.png diff --git a/public/images/posts/next.js/nextjs-contentlayer-blog/thumb.png b/public/images/posts/blog/nextjs-contentlayer-blog/thumb.png similarity index 100% rename from public/images/posts/next.js/nextjs-contentlayer-blog/thumb.png rename to public/images/posts/blog/nextjs-contentlayer-blog/thumb.png diff --git a/public/images/posts/next.js/nextjs-contentlayer-blog/thumbnail.png b/public/images/posts/blog/nextjs-contentlayer-blog/thumbnail.png similarity index 100% rename from public/images/posts/next.js/nextjs-contentlayer-blog/thumbnail.png rename to public/images/posts/blog/nextjs-contentlayer-blog/thumbnail.png diff --git a/public/images/posts/next.js/nextjs-contentlayer-blog/unicode-error.png b/public/images/posts/blog/nextjs-contentlayer-blog/unicode-error.png similarity index 100% rename from public/images/posts/next.js/nextjs-contentlayer-blog/unicode-error.png rename to public/images/posts/blog/nextjs-contentlayer-blog/unicode-error.png diff --git a/public/images/posts/next.js/nextjs-contentlayer-blog/you-have-a-plan.png b/public/images/posts/blog/nextjs-contentlayer-blog/you-have-a-plan.png similarity index 100% rename from public/images/posts/next.js/nextjs-contentlayer-blog/you-have-a-plan.png rename to public/images/posts/blog/nextjs-contentlayer-blog/you-have-a-plan.png