종모

종모

Tech Lead · Fullstack Developer

Seoul, Korea

🔧 본업도 개발, 취미도 개발

💥 임베디드부터 소프트웨어까지 우당탕 삽질과 해결 일지

📝 현재 포스팅과 과거 프로젝트 시리즈 연재중

🏷️ Tags

1인 개발 1인개발 504 Timeout AI AI 자동화 API API 문서화 API설계 ARM Admin Portal
Aggregate Aggregation Anthropic Anthropic API Application Layer Application Service Astro AuthGuard Batch BigInt Bounded Context CICD CORS CSS 변수 Claude Claude Code CleanArchitecture Cloud Run Cloud SQL Cloud Scheduler Cloudflare Cloudflare Pages Content Bridge Controller CouchDB Cron Cumulative DAG DDD DI DTO DataProvider Dependency Injection Docker Domain Domain Layer Domain Modeling E-E-A-T E2E FK Fallback Framer Motion GA4 대안 GitHub Actions Google Guard HTTPS Homebrew IntersectionObserver Invalid hook call JWT Jest Legacy 정리 LiveSync Logging MDX Mock N+1 NestJS Nginx Obsidian OpenAPI OpenClaw Oracle Cloud PATCH PK전략 PLATFORM_ADMIN PRD Passport Pixi.js PostMessage PostgreSQL Prisma Problem QA RBAC REST REST API React React Admin Refine RenderTexture Repository SEO SSL SSoT Schema Design Seed Snapshot Soft Delete Swagger TOP Rank Tailwind CSS TransformInterceptor Turborepo TypeScript Umami Unity Use Case Vite Vuplex WebGL WebView Winston WordPress Zod axios class-validator deletedAt enum macOS pnpm prisma generate react-hook-form recursive CTE shadcn tmux useCustom whileInView zod 개발일지 구조화 데이터 권한 권한설계 기술선택 단위 테스트 데이터모델링 도메인 모델링 도메인 이벤트 도메인모델링 디버깅 API 디자인 토큰 런타임 에러 레이스 컨디션 리버스 프록시 리팩토링 마이그레이션 멀티테넌시 멀티테넌트 메모 동기화 모노레포 문서화 배치고사 백엔드 백엔드설계 브릿지 블로그 SEO 비즈니스 로직 빌드 사이드프로젝트 생산성 서드파티 하네스 서버 기동 테스트 성능최적화 셀프호스팅 스키마 스키마설계 스택 오버플로우 스펙변경 아키텍처 오케스트레이션 운영 도구 워크트리 웹 애널리틱스 유틸리티 의존성관리 의존성주입 인증 인증인가 인프라 자동 배포 자동화 재귀 호출 정책 변경 캐시 쿼리 파라미터 타이머 테스트 통합 트러블슈팅 폼 유효성 검사 품질 평가 프록시 회고

📝 최근 글

📚 NestJS + Refine 풀스택 트러블슈팅

NestJS 권한 가드 — 목록은 막고 상세는 뚫린 날

운영자가 본인 담당 클래스 1개만 떠야 하는데 모든 클래스가 떴다. 목록 API에 operatorId 필터를 깔고 끝낸 줄 알았는데, 직접 URL로 미담당 클래스 ID를 두드리니 상세·수정·승인 5개 엔드포인트가 그대로 200을 돌려줬다. 원인은 JWT payload.sub(User ID)와 Operator 테이블 id(Operator ID)의 분리 + validateClassAccess 헬퍼 부재 둘이었다. 라운드 한 번에 BE → QA → 추가 BE → QA 재검증으로 닫은 NestJS ForbiddenException + Prisma classOperator.findFirst 패턴을 정리한다.

NestJSPrismaJWT
📚 NestJS + Refine 풀스택 트러블슈팅

Problem 종속 끊기 — 1,891개 마이그레이션과 단위 테스트 38건

이전 편의 배치고사 MVP 머지가 가능했던 것은 같은 날 오후에 Problem 모델의 콘텐츠 종속을 먼저 끊었기 때문이다. 본 작업은 Problem 테이블이 ContentItem에 종속돼 재사용 불가하던 구조를 끊고, 1,891개 문제를 신 스키마로 옮기고, Admin/Student 8 엔드포인트와 단위 테스트 38건을 한 머지에 묶은 마일스톤이다. 스키마·마이그레이션·API·테스트가 한 dev 머지 사이클에 들어간 BE 작업 기록을 정리한다.

NestJSPrismaProblem
📚 NestJS + Refine 풀스택 트러블슈팅

배치고사 MVP 후속 — 명세를 코드로 옮기고 레거시 571줄을 일괄 삭제하다

이전 편에서 배치고사 명세를 자동 레벨 배치 폐기로 정리했다. 같은 날 저녁 그 명세를 실제 코드·테스트·시드 데이터로 한 번에 옮긴 마일스톤이다. 도메인·응용 갱신, Legacy 컨트롤러 3개 + 도메인 서비스 3개 + DTO 9건 571줄 삭제, 단위 테스트 22개, 회원 시드 보강, QA E2E 5 시나리오까지 5개 커밋이 한 머지 사이클에 들어간 운영 기록을 정리한다.

NestJSPrisma배치고사
📚 NestJS + Refine 풀스택 트러블슈팅

Unity Lobby + 배치고사 씬 통합 — 두 클라이언트가 같은 회원을 보는 첫 빌드

Unity 네이티브 클라이언트의 Lobby 씬과 배치고사 씬을 같은 빌드 안에 묶었다. NestJS 응답 모델과 Unity C# 모델의 필드명 불일치, NetworkManager 단일 진입점 래퍼, AuthGuard 패턴, 배치고사 완료 시 첫 숙제 자동 발행 체인, contentUrl 전체 경로 정책까지 6가지 설계 결정과 트레이드오프를 정리한다.

UnityNestJSVuplex
📚 NestJS + Refine 풀스택 트러블슈팅

1인 개발 QA 5라운드 — 타이머·시드·스키마로 옮긴 버그들

혼자서 BE·FE·QA·PM 네 역할을 갈아끼우며 학습 클라이언트 웹 프로토타입의 QA 라운드 3~7을 연속으로 돌렸다. 라운드 3의 타이머 NaN·시드 부족부터 라운드 7의 BundleContent nullable·다음 번들 자동 생성까지, 5라운드 동안 버그가 BE·시드·스키마를 차례로 옮긴 흐름과 혼자서 여러 역할을 맡는 QA의 회고.

QA1인 개발워크트리
📚 NestJS + Refine 풀스택 트러블슈팅

타이머가 NaN:NaN으로 떴다 — Bundle API 응답 누락 필드와 비어 있는 콘텐츠 후보

QA Round 2에서 EC-3 엣지 케이스가 잡은 타이머 NaN:NaN 버그. 같은 컴포넌트가 같은 코드로 한 화면에서 정상, 다른 화면에서 NaN:NaN으로 뜨던 패턴이다. 원인은 BE 응답 DTO에서 한 필드 누락 + FE 무방어 + seed 데이터 부족 세 가지의 합이었다. 응답 스키마 검증과 콘텐츠 후보 0건 방어를 같이 깐 라운드 회고.

ReactTypeScriptNestJS

🔥 시리즈별 최신

📚 블로그 SEO 실험실

Google E-E-A-T를 개인 블로그에 실제로 적용하는 방법 — 공식 문서 기반 실전 가이드

Google E-E-A-T(경험, 전문성, 권위, 신뢰)를 개인 기술 블로그에 실제로 적용한 과정을 정리합니다. 품질 평가 가이드라인을 읽고, 환경 명시 박스·레퍼런스 박스·구조화 데이터·시리즈 구조를 도입하기까지 — 공식 문서에서 근거를 찾고 하나씩 적용한 기록입니다.

SEOE-E-A-TGoogle
📚 1인 인프라 구축기

Claude Max 플랜으로 API 호출하면 429가 뜨는 이유 — 인증 체계 5단계 완전 정리

Claude Max 플랜의 OAuth 토큰(sk-ant-oat)으로 Messages API를 직접 호출하면 429 Rate Limit이 뜹니다. Claude Code의 인증 우선순위 5단계, sk-ant-oat vs sk-ant-api 차이, 그리고 스크립트에서 Max 플랜을 활용하는 우회법을 실제 트러블슈팅 사례와 함께 정리합니다.

ClaudeClaude CodeAnthropic API
📚 NestJS 실전 트러블슈팅

prisma generate 누락 — 빌드는 되는데 런타임 에러가 나는 이유

NestJS + Prisma 프로젝트에서 schema.prisma에 새 필드를 추가한 뒤 prisma generate를 빠뜨리면, TypeScript 빌드는 as any 캐스팅 덕에 통과하지만 런타임에서 Prisma Client가 새 필드를 모른다. pnpm build와 prisma generate가 별개 명령인 구조적 함정, prebuild 훅으로 자동화하는 해결법, Docker와 CI에서 놓치지 않는 예방 전략을 실전 코드와 함께 정리한다.

NestJSPrismaprisma generate