포스트 카테고리 분류 정리 + 고아 테스트 제거 + CI 검증 게이트 - #141
Merged
Merged
Conversation
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로 등록해야 강제된다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
개요
포스트 카테고리 전수조사에서 시작해, 그 과정에서 드러난 테스트 부채와 CI 공백까지 함께 정리했다. 세 갈래가 섞여 있어 커밋 단위로 나눠 읽는 편이 수월하다.
1. 콘텐츠 — 하위분류 파편화 정리 (
a0e8869)19편 전수조사 결과 1편짜리 고아 하위분류 3개(
Spring/Spring Boot/Next.js)가 있었다.spring-boot-i18next-architecture.mdSpring Boot→Springpgjdbc-jsonb-typehandler.mdJava→Spring, 썸네일java→springboothello-world.mdcategory: 개발→블로그,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 기술 글이 아닌데 혼자 해당 하위분류를 점유했다.변경 후 트리
코드 변경은 없다. 카테고리 트리는 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개를 삭제했으나, 대응 테스트를 함께 정리하지 않았다.두 테스트는 존재하지 않는 모듈을 import해 suite 로드 단계에서 실패하고 있었다. 테스트 외에 두 모듈을 참조하는 코드는 0건이고, 현행 구현은
globals.css의.prose figure .image-frame:hover다. 되살릴 대상이 없어 테스트를 제거했다.커버리지 손실은 없다 — 해당 테스트는 2026-04-07부터 실행조차 되지 않았다.
3. CI — 검증 게이트 추가 (
229fddf,2ba2a69)위 상태가 3.5개월간 방치된 근본 원인은 CI가 테스트를 돌리지 않았기 때문이다.
deploy.yml은npm ci → npm run build → deploy만 실행해 Jest가 깨져도 초록불이었다.229fddfdeploy.yml의 build 앞에npm test추가 — 배포 직전 최종 방어선2ba2a69ci.yml신규 —pull_request(develop)에서 test + builddeploy.yml만으로는 push 시점에만 돌아 머지된 뒤에야 발견된다. PR 단계 검증이 있어야 머지 전에 잡힌다.ci.yml설계permissions: contents: read— 배포 권한 불필요하므로 최소 권한concurrency: ci-${{ github.ref }}— PR별 격리,deploy.yml의pages그룹과 미충돌28 problems (17 errors, 11 warnings), 대부분react-hooks/refs계열이다. 게이트에 넣으면 모든 PR이 즉시 차단된다. 별도 정리 후 검토 대상.테스트
로컬에서 CI 동등 파이프라인(
npm ci → npm test → npm run build)으로 검증했다.빌드 산출물에서 분류를 직접 확인했다.
Spring Boot/Next.js하위분류는 소멸했다. 잔존 문자열은 전부 포스트 제목/본문이다.렌더링 경로도 확인했다.
BlogPostSidebar.tsx:141-164— subcategory 없는 글 전용 분기가 이미 존재. hello-world 정상 렌더RelatedPosts.tsx:10— 빈 목록이면null반환. 유령 섹션 없음CategoryTree.tsx:64,70,94— 하위분류 없는 카테고리는 spacer 렌더thumbnail-blur-data.json—springboot키 존재, blur placeholder 정상머지 후 필요한 수동 설정
ci.yml만으로는 머지가 차단되지 않는다. 실패해도 빨간 체크만 뜨고 머지 버튼은 살아 있다.체크 이름은
verify(job id)다. 이 PR에서ci.yml이 한 번 실행된 뒤에야 목록에 나타난다.