평소에 공부한 내용이나 디버깅 관련된 내용들을 노션을 통해서 정리하는 것을 선호해 Notion API 와 Next.js 를 통해 블로그를 제작하였습니다.
노션 포스팅 데이터베이스에 변경 사항이 발생하는 경우 재배포를 진행해야 하는 번거로움으로 인해 ISR 를 적용하여 배포를 진행하였습니다.
접기/펼치기
├── components
│ ├── Analytics.tsx
│ ├── Search
│ │ ├── hooks
│ │ │ └── useSearch.ts
│ │ ├── index.test.tsx
│ │ ├── index.tsx
│ │ └── styles.ts
│ ├── Theme
│ │ ├── index.tsx
│ │ └── styles.ts
│ ├── common
│ │ ├── Button
│ │ │ ├── index.test.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.ts
│ │ ├── Icon
│ │ │ ├── index.tsx
│ │ │ └── styles.ts
│ │ ├── Image.tsx
│ │ ├── Loading
│ │ │ ├── index.test.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.ts
│ │ ├── Profile
│ │ │ ├── index.tsx
│ │ │ └── styles.ts
│ │ ├── Seo.test.tsx
│ │ └── Seo.tsx
│ ├── layout
│ │ ├── Footer
│ │ │ ├── index.test.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.ts
│ │ ├── Header
│ │ │ ├── hooks
│ │ │ │ └── useStickyHeader.ts
│ │ │ ├── index.test.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.ts
│ │ ├── MainTitleSection
│ │ │ ├── index.test.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.ts
│ │ ├── Navigation
│ │ │ ├── index.tsx
│ │ │ ├── interface.ts
│ │ │ └── styles.ts
│ │ ├── NotFound
│ │ │ ├── index.tsx
│ │ │ └── styles.ts
│ │ ├── PageLayout
│ │ │ ├── index.tsx
│ │ │ ├── interface.ts
│ │ │ └── styles.ts
│ │ ├── PostListContent
│ │ │ ├── index.tsx
│ │ │ ├── interface.ts
│ │ │ └── styles.ts
│ │ ├── TagList
│ │ │ ├── index.test.tsx
│ │ │ └── index.tsx
│ │ └── TagPageTitleSection
│ │ ├── index.tsx
│ │ └── styles.ts
│ └── notion
│ ├── NotionPage
│ │ ├── components.tsx
│ │ ├── index.tsx
│ │ └── interface.ts
│ ├── NotionPageItem
│ │ ├── Skeleton.tsx
│ │ ├── index.test.tsx
│ │ ├── index.tsx
│ │ └── styles.ts
│ ├── NotionPageList
│ │ ├── Skeleton.tsx
│ │ ├── index.test.tsx
│ │ ├── index.tsx
│ │ └── styles.ts
│ ├── NotionPageSeries
│ │ ├── index.test.tsx
│ │ ├── index.tsx
│ │ ├── interface.ts
│ │ └── styles.ts
│ ├── NotionTagItem
│ │ ├── index.test.tsx
│ │ ├── index.tsx
│ │ ├── interface.ts
│ │ └── styles.ts
│ ├── NotionTagList
│ │ ├── index.test.tsx
│ │ └── index.tsx
│ └── NotionTagSideList
│ ├── index.test.tsx
│ ├── index.tsx
│ ├── interface.ts
│ └── styles.ts
├── config.ts
├── e2e
│ ├── common
│ │ ├── common.spec.ts
│ │ ├── post-item.spec.ts
│ │ └── side-tag-list.spec.ts
│ ├── main-page.spec.ts
│ ├── post-detail-page.spec.ts
│ ├── posts-page.spec.ts
│ ├── tag-posts-page.spec.ts
│ └── tags-page.spec.ts
├── hooks
│ ├── __test__
│ │ ├── useDebounce.test.tsx
│ │ ├── useRefCurrent.test.tsx
│ │ └── useThrottle.test.tsx
│ ├── useDebounce.ts
│ ├── useRefCurrent.ts
│ ├── useTheme.ts
│ └── useThrottle.ts
├── jest.config.ts
├── jest.setup.ts
├── lib
│ ├── gtag.ts
│ └── notion
│ ├── __test__
│ │ └── getDatabaseInfo.test.ts
│ ├── config.ts
│ ├── getDatabaseInfo.ts
│ ├── page
│ │ ├── getPageItem.ts
│ │ ├── getPageProperty.ts
│ │ ├── getPageSeries
│ │ │ ├── PageSeries.ts
│ │ │ ├── __test__
│ │ │ │ ├── PageSeries.test.ts
│ │ │ │ └── index.test.ts
│ │ │ └── index.ts
│ │ ├── getPathPage.test.ts
│ │ └── getPathPage.ts
│ ├── pages
│ │ ├── __test__
│ │ │ ├── getPageItems.test.ts
│ │ │ └── getPathPages.test.ts
│ │ ├── getPageItems.ts
│ │ └── getPathPages.ts
│ ├── search
│ │ └── getSearchResult.ts
│ ├── tags
│ │ ├── __test__
│ │ │ ├── getPathTagPages.test.ts
│ │ │ ├── getTagItems.test.ts
│ │ │ └── getTagWithPostCnt.test.ts
│ │ ├── getPathTagPages.ts
│ │ ├── getTagItems.ts
│ │ └── getTagsWithPostCnt.ts
│ └── utils
│ ├── mapImageUrl.ts
│ └── previewImages.ts
├── pages
│ ├── 404.tsx
│ ├── [pageId]
│ │ └── index.tsx
│ ├── _app.tsx
│ ├── _document.tsx
│ ├── api
│ │ ├── revalidate
│ │ │ ├── __test__
│ │ │ │ ├── revalidate.test.tsx
│ │ │ │ ├── revalidatePages.test.ts
│ │ │ │ ├── revalidatePosts.test.ts
│ │ │ │ └── revalidateTagPages.test.ts
│ │ │ ├── index.ts
│ │ │ ├── revalidatePages.ts
│ │ │ ├── revalidatePosts.ts
│ │ │ └── revalidateTagPages.ts
│ │ └── search.ts
│ ├── index.tsx
│ ├── pages
│ │ └── [pageNum].tsx
│ ├── server-sitemap.xml
│ │ └── index.tsx
│ └── tags
│ ├── [tagName]
│ │ └── pages
│ │ └── [pageNum].tsx
│ └── index.tsx
├── public
├── shared
│ ├── enums
│ │ └── SwrFallbackKeys.ts
│ ├── types
│ │ ├── NavPageOptions.ts
│ │ ├── NavPageOptionsFallback.ts
│ │ ├── PostSeries.ts
│ │ ├── PostSeriesFallback.ts
│ │ ├── TagsWithCnt.ts
│ │ └── TagsWithCntFallback.ts
│ └── variable.ts
├── sitemap.config.js
├── styles
│ ├── device.ts
│ ├── global.ts
│ ├── mixin.ts
│ ├── notion.ts
│ ├── reset.ts
│ ├── theme.ts
│ └── variable.ts
├── types
│ ├── notion.d.ts
│ └── style.d.ts
├── utils
│ ├── __test__
│ │ ├── convertPascalCase.test.ts
│ │ ├── convertUuidToPostId.test.ts
│ │ ├── formatDate.test.ts
│ │ ├── getPaginationItems.test.ts
│ │ ├── getPaginationLength.test.ts
│ │ └── parseDatabaseItems.test.ts
│ ├── convertBlankToHyphen.ts
│ ├── convertHyphenToBlank.ts
│ ├── convertPascalCase.ts
│ ├── convertUuidToPostId.ts
│ ├── formatDate.ts
│ ├── getPaginationItems.ts
│ ├── getPaginationLength.ts
│ ├── normalizeTitleKo.ts
│ └── parseDatabaseItems.ts
- 포스트 시리즈 기능 구현 (feat. Notion API)
- Vercel 환경 Github Actions 적용
- [회고] Github Actions 를 통한 CI/CD 파이프라인 구축 (feat. Vercel)
- [회고] Playwright 를 통한 E2E 테스트
- [회고] Jest, React Testing Library 테스트
- [회고] 1년 이상 묵은 블로그 리팩토링
- SWR 를 통한 데이터 fetching
- Intersection Observer 를 활용한 Infinite Scroll Pagination 구현 (feat. Notion API)
- Next.js On-Demand Revalidation 관련 이슈 (feat. Vercel)
- Next.js - ISR
- Next.js 구글 애널리틱스 4 적용
- Next.js 다크 모드 구현 (feat. data attribute)
- Next.js 다크 모드 구현 (feat. Styled components)
- position fixed 가 동작하지 않는 이슈 (feat. backdrop-filter)
Figma 에서 확인 가능합니다.