이 글은 개발 블로그 개발 여정의 게시글이예요
해당 포스트는 NextJS를 이용하여 개발 블로그를 만들며 작성한 포스트입니다.
기술 블로그의 전체 코드는 🪢 yonglog github 에서 확인 하실 수 있습니다.
이전 포스팅에선 /
경로의 routing
로직을 모두 처리해주었다.
이제 /
경로에서 PostItem
을 클릭하면 해당 Post
들을 렌더링 해주기 위한 routing
로직과 렌더링 로직을 생성해주자
Dynamic Routing 과 Dynamic rendering 의 개념
NextJS
의 App router
방식에선 폴더 기반 routing
을 지원하기 때문에 app
폴더 하위에서 라우팅 경로에 따른 폴더의 이름과 내부 파일인 page , layout
파일들을 이용해 렌더링을 해줄 수 있다.
이 때 라우팅 경로와 대응되는 폴더 명을 []
로 감싸주면 런타임 시 결정되는 라우팅 경로인 dynamic routing
경로와 1:1 대응이 가능하다.
예를 들어 app/[postId]/page.tsx
는 /123
이란 경로가 존재 할 때 page.tsx
서버 컴포넌트에게 params
를 123
으로 props
로 건내주고 렌더링 된다.
이렇게 dynamic routing
을 이용해 렌더링 하는 방식을 dynamic rendering
이라 한다.
해당 개념은 공식 문서를 참조하도록 하자
🪢 NextJS - Dynamic Routing
라우팅을 위한 랜덤한 PostId 생성하기
각 포스트 별 PostID
를 mdx
파일에서 어떻게 생성 못하나 고민하던 와중 서버에서 실행하는 코드를 이용한다는 장점을 이용해
file system
에 직접적으로 접근 가능한 fs
모듈을 이용해 PostId
를 생성해주자
동기적으로 파일을 다시 저장 할 수 있는 메소드를 이용해 pstId
가 존재하지 않는 md,mdx
파일들에 PostId
를 추가해주었다.
추가로 하는 김에 date , time
도 매번 입력하기 귀찮아서 관련 로직을 추가해주었다.
build time
시 생성되는 new Date().getTime()
으로 인해 포스트 들을 최신 순으로 정렬하기도 편해졌다. :)
PostItem 에 라우팅 기능 추가하기
이후 렌더링 되는 PostItem
에 Link
컴포넌트를 이용해 라우팅 기능을 추가해주었다.
이를 통해 특정 포스트를 클릭하면 해당 PostId
에 대한 경로로 라우팅 되도록 만들었다.
Dynamic rendering 을 위한 컴포넌트 생성
이제 위에서 말했듯 Dynamic Rendering
을 위해 app/[postId]/page.tsx
를 생성해주자
다음과 같이 [postId]
경로에서 렌더링 될 PostPage
컴포넌트에서 getPostContent
를 이용해 postId
에 맞는 Post
를 가져오고 MDXRemote
를 이용해 페이지를 렌더링 해주도록 하자
ㅋㅋ 아 굿 ~~ MDXRemote
를 이용해 단순 text
형태인 글들을 적절한 html
파일로 Bable loader
가 변환 한 후 컴포넌트로 변환해 렌더링 되고 있는 모습을 볼 수 있다.
이제 하나씩 문제점을 손대면서 완성해보자 :)
mdx, mdx 파일을 이쁘게 꾸미기 위해 커스텀 컴포넌트 만들기
현재 해당 부분에서 content
를 jsx
로 변환 될 때엔 특별한 스타일링이 존재하지 않는 jsx
로 변한된다.
그렇기 때문에 렌더링 되는 contnet
가 매우 심심해보인다.
스타일링 할 커스텀 컴포넌트로 정의하고 props
로 넘겨주자 :)
MDXRemote
컴포넌트는 props
로 MDXRemoteProps
를 받는다.
이 때 MDXRemoteProps
의 components
를 보면 MDXProvider['components']
즉 , MDXComponents
를 props
로 받는다.
MDXComponents
는 StringComponent
를 키로 갖고 특정 JSX
객체를 반환하는 컴포넌트를 value
로 갖는데 다음과 같이 생겼다.
다음과 같은 값들을 객체로 반환하는 useMDXComponets
훅을 생성해주자
useMDXComponents
훅이 반환하는 MDXComponents
는 MDXRemote
컴포넌트의 props
로 전달되어
MDXRemote
가 Babel loader
를 이용해 md
파일을 jsx
객체들로 반환 했을 때 사용 할 jsx
객체들의 스타일을 담고 있다.
즉 , 만약 MDXRemote
가 어떤 문장을 단순한 p
태그로 컴파일 했을 때 , MDXComponents
의
를 호출하여 사용한다.
다음과 같이 /[postId]
경로에서 렌더링 될 페이지에서 MDXRemote
에게 컴파일 시킬 md
파일을 source
에 담아 보내주고 스타일링 할 때 사용 할 components
에 useMDXComponents
가 반환하는 MDXComponent
를 건내주자
잘 작동한다 :)
제목 영역 꾸미기
현재는 단순히 content
부분을 MDXRemote
에서 컴파일 시켜 렌더링 하고 있다.
상단에 존재할 제목 영역을 meta
데이터를 이용해 꾸며주자 :)
다음과 같이 meta
데이터를 props
로 받아서 렌더링 하는 PostTitle
컴포넌트를 생성해주었다.
짜자잔