개발
코드 / 아키텍처 / 디버깅
-
AI 기반 워치페이스 자동 생성 시스템 구축
스마트워치 시계 화면(워치페이스)을 하나하나 수동으로 디자인하는 대신, Gemini AI를 활용해서 다이얼 자동 생성 + 라이트/다크 모드 손 색상 자동 매칭으로 11개 페이스를 한 번에 만드는 팩토리 시스템을 구축했다.
읽기 → -
누적된 DB 마이그레이션을 스키마에 통합해 혼동 해소
마이그레이션 파일이 50개, 100개 쌓이면서 schema.sql이 현재 운영 DB와 맞지 않기 시작했다. 이번에 누적된 마이그레이션을 모두 schema.sql에 통합하는 폴드인 작업을 진행했다.
읽기 → -
블로그 초기 데이터 로딩 시 제목 구분자 누락 버그 수정
초기 데이터 로딩 스크립트에서 블로그 제목의 구분자를 제대로 처리하지 못하던 버그를 고쳤다. 가만 보니 이런 작은 데이터 정제 버그가 누적되면 꽤 큰 문제가 될 수 있더라.
읽기 → -
하루 세계관 14명 캐릭터 스토리 비츠 시드 완비
전 캐릭터에 대한 story_beats 시드 데이터를 완성했다. sql/seed-story-haru.sql 파일을 업데이트해서 하루(haru) 세계관의 14명 캐릭터 전원이 일관된 내러티브 구조를 갖추도록 정리한 작업이다.
읽기 → -
LAN·외부 기기에서 채팅 연결 안 되던 개발 환경 cross-origin
로컬이나 LAN을 통해 개발 서버에 접속할 때 채팅 기능이 연결되지 않는 문제가 발생했다. Next.js의 HMR 설정에서 cross-origin 차단이 원인이었는데, allowedDevOrigins 설정을 추가해서 해결했다.
읽기 → -
병렬 워크트리 생성 시 발생하던 레이스 컨디션 수정
brainstorm 실행 파이프라인을 손보다가 발견한 미묘한 버그를 고쳤다. 여러 프로세스가 동시에 git worktree를 생성/삭제할 때, 이전 작업이 온전히 정리되지 않은 상태로 새 worktree 추가를 시도하면서 간헐적으로 실패하거나 상태가 꼬이는 문제였다.
읽기 → -
운세 생성 타임아웃 연장으로 간헐적 실패 해결
어느 날 운세 생성 스크립트가 자주 실패한다는 보고를 받았다. 같은 프롬프트로 실행해도 어떨 때는 성공하고 어떨 때는 도중에 끝나버리는 식이었다. 원인을 추적하다 보니 **Claude API 호출 타임아웃이 90초로 설정되어 있었는데, 복잡한 생성 작업이 이를 초과하는 경우가 빈번**했던 것. 이를 300초로 늘리는 간단한 수정인데, 생각보다 많은 걸 배우
읽기 → -
스태틱 사이트 배포 파이프라인 자동화로 장애 대응 속도 개선
스태틱 사이트를 배포할 때 발생하는 수동 작업의 반복을 자동화했다. 빌드, 동기화, 헬스체크, 롤백까지 한 번에 처리하는 배포 파이프라인을 scripts/brainstorm_exec.py에 구현했는데, 이 작업을 통해 팀 운영 효율과 배포 안정성이 함께 개선되는 경험을 했다.
읽기 → -
brainstorm 실행 스크립트의 심링크가 커밋에 섞이는 문제 수정
brainstorm 모듈의 실행 스크립트에서 node_modules 심링크가 실제 코드 변경과 함께 commit 되는 문제를 발견하고 수정했다. 작아 보이는 이슈지만, 이런 환경 파일들이 코드 변경 커밋에 포함되기 시작하면 리뷰 노이즈도 많아지고 머지 충돌도 잦아진다.
읽기 → -
날짜 기반 메타 회전으로 SEO 다양성 확보
today 페이지의 메타 정보(제목, 설명)를 날짜와 단일 키워드 조합으로 동적으로 생성하는 회전식 시스템을 구현했다. 매일 접속할 때마다 다른 소제목과 메타데이터가 노출되도록 함으로써, SEO 다양성을 확보하면서도 사용자 경험에는 일관성을 유지하는 방식이다.
읽기 → -
스테일 워크트리 정리로 브레인스토밍 재시도 차단 해결
브레인스토밍 자동화 스크립트에서 재시도할 때마다 워크트리/브랜치 생성이 실패하는 문제를 발견했다. 원인은 이전 시도에서 남겨진 스테일한 상태를 정리하지 않았기 때문이었다.
읽기 → -
광고 동기화 스크립트의 자동화 파이프라인 실패 원인 해결
site/package.json에서 sync-ads 스크립트가 --env-file-if-exists 옵션을 받도록 수정하고, CommonJS 대신 .mjs 포맷을 가리키도록 변경했다. 자동화된 게이팅 시스템에서 환경 파일이 항상 존재하는 것을 보장할 수 없던 상황에서 나온 실질적인 수정이다.
읽기 → -
빌드 파이프라인에서 환경 파일 없어도 실패 안 하게 수정
빌드 자동화 게이트에서 .env 파일이 없으면 빌드가 실패하는 문제를 고쳤다. package.json의 빌드 스크립트에 --env-file-if-exists 플래그를 추가해서, 환경 파일이 없어도 빌드가 계속 진행되도록 만들었다.
읽기 → -
신규 캐릭터 5명 추가로 드러난 게임 에셋 관리의 현실
5명의 캐릭터와 초상화를 새로 추가했다. 보기엔 단순한 작업이지만, 게임이나 서비스가 성장하면서 부딪히는 에셋 관리의 많은 문제를 담고 있다.
읽기 → -
인증 로그 노이즈 제거로 모니터링 신뢰도 개선
Auth.js 라이브러리의 로거 설정을 조정해서 JWTSessionError로 인한 콘솔 노이즈를 억제했다. 사실 작은 수정 같지만, 이게 개발/운영 경험과 모니터링 품질에 꽤 큰 영향을 미쳤다.
읽기 → -
채팅 페이월 도입으로 무료 횟수 제한과 프리미엄 전환 유도 구현
이번에는 서비스의 첫 마네타이제이션 기능을 구현했다. 평생 무제한 무료로 제공하던 채팅을 무료 사용자는 10회, 프리미엄은 무제한으로 제한하는 페이월 시스템이다.
읽기 → -
요청당 인증 중복 호출을 요청 범위 캐싱으로 제거
한 요청 내에서 인증을 여러 번 확인하는 비효율을 React의 cache() 함수로 제거했다. safeAuth를 캐싱하면서 auth() 호출을 1회로 제한하는 작업이었다.
읽기 → -
구 세션 쿠키로 홈 렌더가 깨지는 문제를 안전한 인증 처리로 해결
구 세션 쿠키가 남아있을 때 JWTSessionError가 처리되지 않아 홈 렌더가 실패하는 문제를 겪었다. currentUserId 로직을 safeAuth 패턴으로 변경해서 에러를 안전하게 처리하도록 개선했다.
읽기 → -
광고 승인 전 빈 슬롯 라벨을 숨겨 페이지 완성도 개선
블로그와 포트폴리오의 사이드레일에 AdSense 광고를 붙였는데, 광고가 승인되기 전까지 빈 슬롯에 'AD' 라벨이 노출되는 게 신경 쓰였다. 사실 기술적으로 문제는 아니지만, 방문자 입장에서는 뭔가 덜 완성된 페이지처럼 느껴진다. 이번에 그 라벨을 숨기는 작업을 했다.
읽기 → -
블로그 URL을 ID 기반으로 전환하고 기존 slug 링크 보존
블로그 포스트의 URL을 기존 slug 방식에서 /p/{id} 형태의 ID 기반 canonical URL로 전환했다. 기존 slug URL은 301 permanent redirect로 처리해서 기존 링크와 SEO 가치는 그대로 보존하는 작업이었다.
읽기 →