개발
코드 / 아키텍처 / 디버깅
-
토큰 버전 관리로 세션 만료 정책과 강제 로그아웃 도입
세션 만료 정책과 강제 로그아웃 인프라를 한 번에 묶어서 배포했다.
읽기 → -
어드민 핵심 페이지 UI를 shadcn 컴포넌트로 일관되게 통일한 과정
어드민 핵심 페이지들 전반에 걸쳐 shadcn/ui 컴포넌트를 일관되게 적용하는 리팩토링 작업을 했다.
읽기 → -
리치 텍스트 에디터 HTML 저장 시 XSS 취약점 수정
TipTap 에디터에서 입력된 HTML을 그대로 DB에 저장하고 있었다는 걸 코드 리뷰 중에 뒤늦게 확인했다.
읽기 → -
어드민 UI에 페이지 헤더 공통 컴포넌트 도입
어드민 UI 전반에 PageHeader 컴포넌트를 만들어서 붙이는 작업을 했다. 커밋 하나짜리 작업이지만, 팀 입장에서는 꽤 의미 있는 시발점이었다.
읽기 → -
어드민 쓰기 액션 전반에 감사 로그 확장
어드민 영역 전반의 쓰기 작업에 감사 로그를 확장한 작업이다.
읽기 → -
어드민 헤더 컴포넌트 제거로 레이아웃 구조 일원화
죽은 컴포넌트를 걷어냈다. AdminHeader.tsx 하나짜리 변경이지만, 이게 왜 오래 살아남았는지를 되짚어보는 게 더 중요하다.
읽기 → -
API 호출 제한 로직을 미들웨어로 통합해 중복 제거
API rate limit 미들웨어를 범용으로 뽑아냈다.
읽기 → -
프론트엔드 보안 응답 헤더 일괄 적용으로 XSS·클릭재킹 방어 강화
보안 응답 헤더를 next.config.mjs에 박아 넣은 이유
읽기 → -
어드민 광고 유닛 폼 공용화와 recharts 차트 도입
운영 화면 전반에 걸친 polish 작업과 공용 컴포넌트 정리, 그리고 recharts 도입까지 한 스프린트에 몰아서 처리했다.
읽기 → -
광고 슬롯 시각화와 어드민 UI 전면 개선
한 번에 꽤 많은 걸 쏟아냈다. 보안 패치, UI 라이브러리 교체, 운영 대시보드 개선, 광고 UX까지 — 커밋 하나에 담기엔 묵직한 범위였다.
읽기 → -
analyses 페이지에 모본 광고 슬롯 연동 추가
analyses 페이지에 광고 유닛을 붙이는 작업을 했다. fetchAdUnits로 광고 데이터를 서버에서 가져오고, MobonSlot 컴포넌트를 실제 페이지에 박아 넣는 흐름이었다.
읽기 → -
블로그 배포 스크립트에 IndexNow 색인 알림 자동화
블로그 배포 스크립트에 IndexNow ping 단계를 끼워 넣었다.
읽기 → -
콘텐츠 생성 파이프라인에 SEO 가이드를 시스템 프롬프트로 내재화
시스템 프롬프트 안에 SEO 가이드를 녹여 넣는 작업을 했다.
읽기 → -
광고 빌드 실패로 막힌 배포 파이프라인 복구
CI/CD 파이프라인에서 npm run build:ads가 죽는 문제를 핀포인트 수정했다.
읽기 → -
CI 배포 파이프라인에서 광고 빌드 실패 시 서버 폴더 전체 삭제를 막는
CI 파이프라인에서 rsync --delete 옵션이 빈 dist 폴더를 바라보면서 서버의 게임 폴더를 통째로 날릴 뻔한 사고를 막은 가드 로직을 추가했다.
읽기 → -
인증 오류가 500으로 터지던 문제를 401로 바로잡다
인증 컨텍스트에서 requireUserId()가 던지는 예외가 500으로 터지고 있었다. 클라이언트 입장에서는 "서버 오류"로 보였지만, 실제 원인은 인증 정보가 없는 요청이었다.
읽기 → -
IAP 결제·Tier 게이팅 단위 테스트 14건 일괄 추가
IAP 결제 검증 + Tier 게이팅 로직에 단위 테스트 14건을 한 번에 추가했다.
읽기 → -
릴리즈 빌드에서 목 폴백을 완전히 제거한 방법
release 빌드에 mock 폴백이 살아 있었다. 조용히, 아무도 모르게.
읽기 → -
배포 스크립트에서 생성 책임만 분리해 단일 역할로 정리
배포 스크립트에서 "생성" 책임만 남기고 나머지를 쳐냈다.
읽기 → -
정적 빌드에서 런타임 DB 조회로 콘텐츠 아키텍처 전환
빌드타임에 묶여 있던 콘텐츠 레이어를 런타임 DB 조회로 전환했다. 영향 범위가 핵심 페이지 전체라 결정 자체보다 "어떻게 안전하게 넘어가느냐"가 더 큰 숙제였던 작업이다.
읽기 →