Skip to content

포스트 카테고리 분류 정리 + 고아 테스트 제거 + CI 검증 게이트 - #141

Merged
kmg733 merged 4 commits into
developfrom
feature/post-category-cleanup
Jul 22, 2026
Merged

포스트 카테고리 분류 정리 + 고아 테스트 제거 + CI 검증 게이트#141
kmg733 merged 4 commits into
developfrom
feature/post-category-cleanup

Conversation

@kmg733

@kmg733 kmg733 commented Jul 22, 2026

Copy link
Copy Markdown
Owner

개요

포스트 카테고리 전수조사에서 시작해, 그 과정에서 드러난 테스트 부채와 CI 공백까지 함께 정리했다. 세 갈래가 섞여 있어 커밋 단위로 나눠 읽는 편이 수월하다.


1. 콘텐츠 — 하위분류 파편화 정리 (a0e8869)

19편 전수조사 결과 1편짜리 고아 하위분류 3개(Spring/Spring Boot/Next.js)가 있었다.

파일 변경
spring-boot-i18next-architecture.md Spring BootSpring
pgjdbc-jsonb-typehandler.md JavaSpring, 썸네일 javaspringboot
hello-world.md category: 개발블로그, subcategory: Next.js 제거

판단 근거

  • Spring/Spring Boot: 같은 스택이 1편씩 갈려 있었다. spring-transactional-postgresql-abort는 subcategory만 Spring이고 썸네일은 springboot라 자체적으로도 불일치였다.
  • pgjdbc-jsonb-typehandler: 목차 대부분이 MyBatis TypeHandler 등록 경로와 글로벌 설정이다. Java 언어 스펙 글(JVM 3부작, 제네릭)과 성격이 달랐다.
  • hello-world: gh-pages 운영 이유와 기술 스택 소개를 담은 회고글이다. Next.js 기술 글이 아닌데 혼자 해당 하위분류를 점유했다.

변경 후 트리

개발 (17)                     블로그 (1)
├─ Database (2)
├─ Java (4)      ← 언어/런타임 스펙으로 통일
├─ JavaScript (3)
├─ Spring (3)    ← 1+1 파편 → 3편 통합
├─ 아키텍처 (2)
└─ 웹 (3)

코드 변경은 없다. 카테고리 트리는 frontmatter에서 파생되고(src/lib/category.ts), 카테고리 라우트가 없어 URL 경로도 그대로다.

기존 ?category=개발&subcategory=Spring Boot 형태의 공유 링크는 useCategoryFilter.ts:30이 subcategory만 null로 떨궈 개발 카테고리 목록으로 폴백한다. 깨지지 않는다.


2. 테스트 부채 — 고아 테스트 제거 (bf87068)

6262723(2026-04-07)이 hover 프리뷰를 React 컴포넌트+훅에서 CSS 제자리 확대로 전환하며 구현 파일 2개를 삭제했으나, 대응 테스트를 함께 정리하지 않았다.

D  src/components/ImageHoverPreview.tsx   ← 6262723에서 삭제
D  src/hooks/useImageHoverPreview.ts      ← 6262723에서 삭제
   src/components/__tests__/ImageHoverPreview.test.tsx    ← 남음
   src/hooks/__tests__/useImageHoverPreview.test.ts       ← 남음

두 테스트는 존재하지 않는 모듈을 import해 suite 로드 단계에서 실패하고 있었다. 테스트 외에 두 모듈을 참조하는 코드는 0건이고, 현행 구현은 globals.css.prose figure .image-frame:hover다. 되살릴 대상이 없어 테스트를 제거했다.

커버리지 손실은 없다 — 해당 테스트는 2026-04-07부터 실행조차 되지 않았다.

git log --diff-filter=D로는 이 삭제가 안 잡힌다. path-limited log의 history simplification이 머지 커밋이 삼킨 변경을 숨기기 때문이다. --full-history가 필요했다.


3. CI — 검증 게이트 추가 (229fddf, 2ba2a69)

위 상태가 3.5개월간 방치된 근본 원인은 CI가 테스트를 돌리지 않았기 때문이다. deploy.ymlnpm ci → npm run build → deploy만 실행해 Jest가 깨져도 초록불이었다.

커밋 변경
229fddf deploy.yml의 build 앞에 npm test 추가 — 배포 직전 최종 방어선
2ba2a69 ci.yml 신규 — pull_request(develop)에서 test + build

deploy.yml만으로는 push 시점에만 돌아 머지된 뒤에야 발견된다. PR 단계 검증이 있어야 머지 전에 잡힌다.

ci.yml 설계

  • permissions: contents: read — 배포 권한 불필요하므로 최소 권한
  • concurrency: ci-${{ github.ref }} — PR별 격리, deploy.ymlpages 그룹과 미충돌
  • lint 제외 — 현재 develop 기준 28 problems (17 errors, 11 warnings), 대부분 react-hooks/refs 계열이다. 게이트에 넣으면 모든 PR이 즉시 차단된다. 별도 정리 후 검토 대상.

테스트

로컬에서 CI 동등 파이프라인(npm ci → npm test → npm run build)으로 검증했다.

Test Suites: 52 passed, 52 total     (머지 전 54 중 2 failed → 0 failed)
Tests:       551 passed, 551 total
Build:       통과 (TypeScript 클린, 정적 페이지 29개)
워킹트리:     clean

빌드 산출물에서 분류를 직접 확인했다.

category      개발 17, 블로그 1
subcategory   Database 2, Java 4, JavaScript 3, Spring 3, 아키텍처 2, 웹 3, 없음 1

Spring Boot/Next.js 하위분류는 소멸했다. 잔존 문자열은 전부 포스트 제목/본문이다.

렌더링 경로도 확인했다.

  • BlogPostSidebar.tsx:141-164 — subcategory 없는 글 전용 분기가 이미 존재. hello-world 정상 렌더
  • RelatedPosts.tsx:10 — 빈 목록이면 null 반환. 유령 섹션 없음
  • CategoryTree.tsx:64,70,94 — 하위분류 없는 카테고리는 spacer 렌더
  • thumbnail-blur-data.jsonspringboot 키 존재, blur placeholder 정상

머지 후 필요한 수동 설정

ci.yml만으로는 머지가 차단되지 않는다. 실패해도 빨간 체크만 뜨고 머지 버튼은 살아 있다.

Settings → Branches → develop 보호 규칙
  → Require status checks to pass before merging
  → verify 선택

체크 이름은 verify(job id)다. 이 PR에서 ci.yml이 한 번 실행된 뒤에야 목록에 나타난다.

kmg733 added 4 commits July 22, 2026 10:50
1편짜리로 흩어져 있던 하위분류를 통합하고, 내용과 맞지 않는 분류를
재배정했다.

- Spring Boot -> Spring 통합: 같은 스택이 1편씩 두 하위분류로 갈려 있었다.
- pgjdbc-jsonb-typehandler: Java -> Spring. 내용이 MyBatis TypeHandler
  등록·설정이라 언어/런타임 스펙 글(JVM 3부작, 제네릭)과 성격이 달랐다.
  썸네일도 java -> springboot로 맞췄다.
- hello-world: category 개발 -> 블로그, subcategory Next.js 제거.
  블로그 개설 회고글이라 Next.js 기술 글이 아니었다.

결과적으로 Spring이 3편으로 묶이고, 1편짜리 고아 하위분류
(Spring/Spring Boot/Next.js) 3개가 모두 해소됐다.

카테고리 트리는 frontmatter에서 파생되므로(src/lib/category.ts) 코드
변경은 없다. 카테고리 라우트가 없어 URL 경로도 그대로다. 기존
?category=개발&subcategory=Spring Boot 형태의 공유 링크는
useCategoryFilter가 subcategory만 null로 떨궈(useCategoryFilter.ts:30)
개발 카테고리 목록으로 폴백한다.
6262723에서 hover 프리뷰를 React 컴포넌트+훅에서 CSS 제자리 확대
방식으로 전환하며 구현 파일을 삭제했으나, 대응 테스트 2개를 함께
정리하지 않았다.

- src/components/ImageHoverPreview.tsx      (6262723에서 삭제)
- src/hooks/useImageHoverPreview.ts         (6262723에서 삭제)

두 테스트는 존재하지 않는 모듈을 import해 suite 로드 단계에서
실패하고 있었다. 테스트 외에 두 모듈을 참조하는 코드는 없으며,
현행 구현은 globals.css의 .prose figure .image-frame:hover 이다.

되살릴 대상이 없으므로 테스트를 제거한다. 커버리지 손실은 없다 —
해당 테스트는 2026-04-07부터 실행조차 되지 않고 있었다.

Test Suites: 52 passed, 52 total (기존 54 중 2 failed -> 0 failed)
deploy.yml이 npm ci -> npm run build -> deploy 만 실행해 테스트가
깨져도 CI가 통과했다. 그 결과 hover 프리뷰 고아 테스트가
2026-04-07부터 약 3.5개월간 develop에서 실패한 채 방치됐다.

build 앞에 npm test 스텝을 추가해 테스트 실패 시 배포를 차단한다.

앞 커밋(고아 테스트 제거)이 선행돼야 이 게이트가 통과한다.
deploy.yml의 테스트 스텝은 push(develop) 시점에만 돈다. 저장소가 PR
기반으로 운영되므로 PR 시점에는 검증이 전혀 없었고, 깨진 코드가
develop에 머지된 뒤에야 배포가 막히는 구조였다. 조기 발견은 되지만
머지 자체를 막지는 못한다.

pull_request(develop) 트리거로 test + build를 실행하는 ci.yml을
추가해 머지 전에 검증한다.

- permissions는 contents: read 만 부여 (배포 권한 불필요)
- concurrency group은 github.ref 기준이라 PR별로 격리되고
  deploy.yml의 "pages" 그룹과 충돌하지 않는다
- lint는 제외한다. 현재 develop 기준 17 errors 상태(react-hooks v6)라
  게이트에 넣으면 모든 PR이 즉시 차단된다. 별도 정리 후 검토 대상.

deploy.yml의 테스트 스텝은 배포 직전 최종 방어선으로 유지한다.

주의: 이 워크플로만으로는 머지가 차단되지 않는다. GitHub 저장소
설정에서 required status check로 등록해야 강제된다.
@kmg733 kmg733 added refactor Code refactoring without changing functionality cleanup Code cleanup and dead code removal test 테스트 관련 변경 blog 블로그 포스트 추가/수정 labels Jul 22, 2026
@kmg733 kmg733 self-assigned this Jul 22, 2026
@kmg733
kmg733 merged commit caf4a16 into develop Jul 22, 2026
1 check passed
@kmg733
kmg733 deleted the feature/post-category-cleanup branch July 22, 2026 02:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

blog 블로그 포스트 추가/수정 cleanup Code cleanup and dead code removal refactor Code refactoring without changing functionality test 테스트 관련 변경

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant