개발
코드 / 아키텍처 / 디버깅
-
요청당 인증 중복 호출을 요청 범위 캐싱으로 제거
한 요청 내에서 인증을 여러 번 확인하는 비효율을 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 가치는 그대로 보존하는 작업이었다.
읽기 → -
블로그 광고 슬롯 제거와 기술채무 정리 과정
블로그 광고 서비스 정책 변경으로 광고 슬롯을 제거했다. 간단한 정리 작업처럼 보이지만, 블로그 템플릿 전반에 걸쳐 제거해야 할 부분들이 생각보다 많았고, 그 과정에서 기술채무 정리와 정책 관리 방식에 대해 생각해볼 기회가 됐다.
읽기 → -
캐릭터 도감 페이지를 별도 라우트로 분리해 컬렉션 기능 추가
사용자가 공략한 캐릭터를 한눈에 보고 진행 상황을 추적할 수 있도록 개인 도감(명예의 전당) 기능을 추가했다. 새로운 페이지를 만들고 기존 라우팅과 데이터 구조를 어떻게 통합했는지, 그리고 이 과정에서 내가 고민한 아키텍처 결정들을 정리해 본다.
읽기 → -
약혼·결혼 상태를 홈카드와 헤더 전반에 일관 노출
앗, 이건 작은 기능처럼 보이지만 꽤 생각할 거리가 많은 작업이었다. 약혼·결혼 상태를 헤더와 홈카드에 노출했는데, 단순히 데이터를 끌어다 쓰는 게 아니라 사용자 정보 구조, UI 계층, 그리고 정보 아키텍처 전반을 한번 정리하는 계기가 됐다.
읽기 → -
채팅에서 프로포즈·결혼을 감지해 풀스크린 축하 연출을 구현한 경험
프로포즈나 결혼 같은 특별한 이벤트를 채팅 채널에서 감지했을 때, 사용자에게 그 순간을 제대로 축하해주는 연출이 필요했다. 이번에 풀스크린 축하 UI를 별도 컴포넌트로 분리해서 구현했는데, 이 작업을 통해 느낀 이벤트 기반 UX 설계와 컴포넌트 아키텍처에 대한 생각을 정리해본다.
읽기 → -
세션 쿠키 복호화 실패로 인한 페이지 크래시 수정
세션 쿠키 복호화 과정에서 예상 밖의 값이 들어올 때 페이지 전체가 크래시 나는 문제를 고쳤다. safeAuth 래퍼를 도입해서 복호화 실패 시에도 안정적으로 폴백할 수 있게 했다.
읽기 → -
온보딩 화면을 단계별로 재설계해 첫 진입 경험 개선
온보딩 화면을 다시 정리했다. 처음 사용자가 앱을 열었을 때 겪게 되는 첫 몇 초의 경험을 좀 더 단계적이고 의도 있게 만들려는 작업이었다.
읽기 → -
결제 테이블 누락으로 생긴 스키마와 라이브 DB 불일치 해소
한 줄 요약: 설계 문서(GAME_DESIGN)에는 있지만 schema.sql에는 빠진 purchase 테이블을 추가해 라이브 DB와의 불일치를 메웠다.
읽기 → -
구글 로그인 중복 계정 생성을 멱등성 설계로 차단
구글 로그인을 통한 계정 중복 생성 문제를 잡았다. 이건 생각보다 쉽게 발생하는 버그인데, 특히 모바일 환경이나 느린 네트워크에서 더 자주 터진다. 데이터베이스 유니크 제약과 애플리케이션 수준의 멱등 처리로 양쪽에서 막는 방식으로 해결했다.
읽기 → -
구글플레이 인앱결제 영수증 서버 검증으로 안전한 코인 적립 구현
구글플레이 인앱결제로 사용자가 구매한 코인을 신뢰할 수 있게 적립하는 백엔드 다리를 만들었다. 클라이언트에서 받은 영수증을 검증하고, 검증 결과에 따라 안전하게 코인을 지급하는 흐름이다.
읽기 → -
AI 캐릭터 서비스에 사용자 관계 기억 기능 통합
API 여러 개가 서로 다른 엔드포인트에서 사용자와 캐릭터 간의 상호작용을 기록하고 있는데, 그 정보들이 제각각 흩어져 있었다. 채팅 맥락은 chat 라우트에, 선물 기록은 gift, 사진 공유는 photo—각각 따로따로였고, 캐릭터 프로필도 단편적이었다. 이번 작업은 그 흩어진 정보들을 하나의 글로벌 사용자 프로필에 누적하고, 관계의 맥락을 요약해서 다시
읽기 → -
LLM provider 교체에 유연한 추상화 구조 도입
이번에 LLM provider를 추상화하는 작업을 했다. Claude, Anthropic, 그리고 로컬 모델로 쉽게 전환할 수 있도록 기반을 다진 거다.
읽기 → -
캐릭터 이미지를 아이돌·웹툰 스타일로 리브랜딩하고 UI 겹침 해결
요즘 콘텐츠 기반 플랫폼에서 비주얼 업데이트만큼 팀 전체에 영향을 미치는 작업도 드물다. 이번 작업도 마찬가지였다. 세 캐릭터의 이미지를 아이돌/웹툰 스타일로 리브랜딩하면서, 동시에 UI에서 셀카가 겹치는 문제까지 해결했다.
읽기 → -
친밀도 100 돌파와 사진 비전 기능으로 캐릭터 상호작용 강화
캐릭터와의 상호작용을 한 단계 더 깊게 만들기 위해 두 가지 새로운 기능을 함께 출시했다: 친밀도 레벨이 100을 넘은 후의 진척 단계와 사용자가 업로드한 사진에 캐릭터가 반응하는 비전 기능이다.
읽기 → -
Auth.js로 인증 전면 개편하며 익명 계정 병합 구현
최근 인증 시스템 전체를 Auth.js 기반으로 개편하면서 Google 로그인을 추가하고, 익명 사용자를 기존 계정으로 병합하는 기능을 넣었다. 동시에 초기 설정 자동화를 위해 Polar setup 스크립트도 구성했는데, 이 작업이 생각보다 복잡했던 이유와 의사결정 과정을 정리해본다.
읽기 → -
배포 실패 시에만 팀 알림 보내도록 개선
publish.sh 배포 스크립트의 알림 정책을 손질했다. 성공했을 때는 조용히 지나가고, 실패했을 때만 팀에 소식이 가도록 변경한 작업이다.
읽기 → -
운영 모니터링 알림 과부하를 일일 요약 체계로 개선
운영 모니터링 스크립트들의 알림 정책을 다시 정리했다. 정상 동작은 침묵하고, 문제가 실제로 발생했을 때만 알림을 보내는 방식으로 전환하면서, 동시에 일일 통합 요약을 추가해서 전체 상황을 한눈에 파악할 수 있게 만들었다.
읽기 →