Skip to content

Conversation

@kickbelldev
Copy link
Owner

@kickbelldev kickbelldev commented Jul 17, 2025

Summary

  • 분리된 entities (posts, categories, tags)를 단일 blog entity로 통합
  • SSG 환경에 최적화된 모듈 레벨 캐싱 구현으로 빌드 성능 개선
  • 복잡한 상호 의존성 문제 해결 및 코드 아키텍처 개선

주요 변경사항

🏗️ Entity 아키텍처 개선

  • 통합 구조: src/entities/blog/ 하나로 통합
  • 모듈 레벨 캐싱: getAllPosts(), getAllCategories() 등 빌드 타임에 한 번만 실행
  • 관심사 분리: logic/posts.ts, logic/categories.ts, logic/tags.ts로 논리적 분리
  • 타입 통합: 모든 타입을 types.ts로 일원화

⚡ 성능 최적화

  • SSG 최적화: 파일을 매번 읽지 않고 모듈 레벨에서 캐싱
  • 태그 그래프 사전 계산: 빌드 타임에 태그 관계 및 클러스터 생성
  • 관련 포스트 캐싱: 사전 계산된 클러스터 데이터 활용

🔧 코드 품질 개선

  • 임포트 경로 통일: 모든 컴포넌트가 @/entities/blog 사용
  • TypeScript 에러 해결: 모든 타입 에러 수정 및 일관성 보장
  • 사용하지 않는 코드 제거: 불필요한 임포트 및 함수 정리

📁 컨텐츠 관리 개선

  • 파일명 표준화: 한글 파일명을 영문으로 변경하여 URL 호환성 개선
  • 카테고리별 분류: dev/life 카테고리 구조와 일치하도록 정리

기술적 세부사항

Before (분리된 구조)

src/entities/
├── posts/     # 포스트 관련 로직
├── categories/ # 카테고리 관련 로직  
└── tags/      # 태그 관련 로직

After (통합 구조)

src/entities/blog/
├── index.ts           # 공개 API + 모듈 레벨 캐싱
├── types.ts           # 통합 타입 정의
└── logic/
    ├── posts.ts       # 포스트 로직
    ├── categories.ts  # 카테고리 로직
    └── tags.ts        # 태그 로직

캐싱 최적화 예시

// 빌드 타임에 한 번만 실행
export const allPosts = await getAllPosts()
export const allCategories = await getAllCategories()
export const tagGraph = createTagGraph(allPosts, allTags)
export const tagClusters = createTagClusters(tagGraph)

// 런타임에는 캐시된 데이터 사용
export function getPostBySlug(slug: string): Post | null {
  return allPosts.find((post) => post.slug === slug) || null
}

Commit History

  1. content: 컨텐츠 파일명 정리 및 카테고리별 분류
  2. refactor: 기존 분리된 entity 구조 제거
  3. feat: 통합 blog entity 구조 구현
  4. refactor: 모든 컴포넌트를 통합 blog entity 사용하도록 업데이트
  5. config: lefthook 설정 업데이트

Test Plan

  • TypeScript 컴파일 에러 없음 (pnpm type)
  • Biome 린팅/포맷팅 통과 (pnpm biome:check)
  • 모든 페이지 라우팅 정상 동작 확인
  • 카테고리별 포스트 필터링 동작 확인
  • 태그 관련 기능 정상 동작 확인
  • 관련 포스트 추천 기능 동작 확인

Breaking Changes

없음. 기존 API와 동일한 인터페이스 유지.

🤖 Generated with Claude Code

kickbelldev and others added 14 commits July 17, 2025 15:16
- getPostBySlug 함수를 캐시된 allPosts에서 조회하도록 변경
- findPostPathBySlug 함수 제거하여 중복 파일 스캔 방지
- getAllMdxFiles, getPostByFilePath 함수 추가로 재귀적 MDX 파일 처리 개선
- SSG 빌드 시 파일을 한 번만 읽도록 최적화

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- 태그 그래프를 모듈 레벨에서 캐시하여 중복 생성 방지
- 태그 클러스터 계산 결과 캐싱으로 성능 개선
- findRelatedPostsByTagsOptimized 함수 추가로 캐시된 클러스터 활용
- getTagGraph, getTagRelationships, getTagClusters 함수 동기화로 성능 향상

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- parsePostData 함수에 카테고리 추론 로직 추가
- extractCategoryFromPath 함수로 파일 경로에서 카테고리 자동 추출
- CategoryId 타입 추가로 타입 안정성 향상
- parsePostData, extractCategoryFromPath 관련 테스트 케이스 추가

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- 프로젝트 구조에 graphology 라이브러리 추가
- 디렉토리 구조를 카테고리 기반 라우팅으로 업데이트
- 새로운 엔티티(categories) 및 컴포넌트 구조 반영
- MDX 컴포넌트 및 테스트 디렉토리 추가
- GEMINI.md 문서 추가

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- 카테고리 도메인 로직 및 타입 정의
- getAllCategories, getCategoryById 등 핵심 함수 구현
- 카테고리별 포스트 필터링 및 통계 기능 추가
- 카테고리 유효성 검증 로직 포함
- 테스트 케이스 작성으로 안정성 확보

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- contents/ 루트에 카테고리별 디렉토리 구조 생성
- src/contents/에서 카테고리별로 포스트 재조직
- dev, life 카테고리용 category.json 설정 파일 추가
- 기존 테스트 포스트들을 적절한 카테고리로 이동

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- NavLink 컴포넌트 추가로 재사용 가능한 네비게이션 링크 구현
- Header 컴포넌트를 카테고리 기반 네비게이션으로 업데이트
- 동적 카테고리 메뉴 생성으로 확장 가능한 구조 제공
- 카테고리별 포스트 개수 표시 지원

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- [category]/[slug] 동적 라우팅으로 카테고리별 포스트 상세 페이지 구현
- [category] 페이지로 카테고리별 포스트 목록 제공
- 기존 posts 컴포넌트들을 카테고리 기반으로 마이그레이션
- PostContent, PostHeader, PostNavigation 등 재사용 가능한 컴포넌트
- CategoryBadge, CategoryList 등 카테고리 전용 컴포넌트 추가

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- extractCategoryFromPath에서 하드코딩된 카테고리 제한 제거
- 모든 서브디렉토리를 유효한 카테고리로 인식하도록 변경
- 파일 경로 구조 검증 로직 개선 (contents/category/file.mdx 구조 필수)
- 관련 테스트 케이스 업데이트

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- 한글 파일명을 영문으로 변경하여 URL 호환성 개선
- 컨텐츠를 dev/life 카테고리별로 적절히 분류
- 파일 위치 최적화로 라우팅 구조와 일치시킴

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- posts, categories, tags 개별 entity 삭제
- 복잡한 상호 의존성 문제 해결을 위한 구조 정리
- 통합된 blog entity로 리팩토링 준비

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- 단일 책임 원칙을 따르는 통합 blog entity 생성
- 모듈 레벨 캐싱으로 SSG 최적화 (빌드 타임에 한 번만 파일 읽기)
- logic/ 하위 디렉토리로 관심사별 분리 (posts, categories, tags)
- 통합된 types.ts로 타입 일관성 보장
- 공개 API를 index.ts로 일원화

주요 개선사항:
- getAllPosts, getAllCategories 등 모든 데이터 모듈 레벨 캐싱
- 태그 그래프 및 클러스터 사전 계산
- 상호 의존성 문제 해결

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- @/entities/posts, @/entities/categories, @/entities/tags
  → @/entities/blog로 모든 임포트 경로 변경
- 타입 정의 통합으로 일관성 개선
- Category 타입에 color, icon 속성 추가 (CategoryBadge 호환성)
- 사용하지 않는 임포트 제거 및 최적화
- 모든 컴포넌트의 TypeScript 에러 해결

변경된 컴포넌트:
- Header, CategoryBadge, CategoryList, CategoryPage
- PostContent, PostFooter, PostHeader, PostNavigation
- RelatedPosts, RelatedPostItem 등 모든 포스트 관련 컴포넌트

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- Git 훅 설정 최적화
- 코드 품질 검사 단계 개선

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
@kickbelldev kickbelldev changed the title feat: 엔티티 최적화 및 카테고리 시스템 구현 feat: 통합 blog entity 구조 및 SSG 최적화 Jul 17, 2025
@kickbelldev kickbelldev merged commit 5448c58 into main Jul 17, 2025
2 checks passed
@kickbelldev kickbelldev deleted the feat/entity-optimization-and-category-system branch July 17, 2025 07:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants