-
로그 포맷 파싱 버그로 일부 사이트 적재 실패 문제 수정
여러 사이트의 로그를 한데 모아 집계하는 시스템에서, 특정 로그 포맷이 제대로 파싱되지 않아 일부 사이트(kpopdex, vtuberprofile)의 페이지뷰 데이터가 0으로 기록되는 버그를 마주했다. 요청이 들어올 때마다 데이터가 적재되지 않는 상황이 반복되다 보니 원인을 추적해서 파싱 로직과 문서화를 함께 정리했다.
읽기 → -
Cloudflare 설정 관리를 단일 진실에 통합
Cloudflare 토큰과 설정 정보를 ops SSOT(Single Source of Truth) 문서에 명시적인 포인터로 추가했다.
읽기 → -
운영 자동화와 스팸 차단 정책을 문서로 정리
특정 사이트의 k2 버전 운영 정책을 한군데 정리했다. 스팸 방지부터 자동 처리까지, 장기간 운영하면서 축적된 규칙들을 docs 에 명문화한 작업이다.
읽기 → -
favicon 404 에러, 인라인 SVG로 깔끔하게
vtuber 프로필 페이지 배포 후 개발자 도구를 열면 favicon 요청이 계속 404를 던지고 있었다. 외부 파일 참조 방식에서 인라인 SVG favicon으로 전환해서 이 문제를 제거했다.
읽기 → -
탤런트 검색은 빠르게, 즐겨찾기는 간단하게
지난주에 탤런트 프로필 서비스의 검색과 즐겨찾기 기능을 손봤다. 클라이언트 사이드에서 검색을 처리하고, 즐겨찾기는 localStorage에 저장하는 방식으로 구현했는데, 이 결정이 꽤 흥미로운 트레이드오프를 포함하고 있었다.
읽기 → -
스케줄 범위 확대할 땐 '정상적인 이상'도 문서화하라
크론 작업 범위를 25개에서 35개로 확대하고, 그 과정에서 도메인 특성을 CLAUDE.md에 명시했다. 간단해 보이지만 이 작은 문서화 항목이 팀의 많은 오해와 불필요한 버그 조사를 막을 수 있다.
읽기 → -
자동화 봇 운영현황을 문서에 담다
한 이커머스 서비스 (이미지·스트림 기반 콘텐츠)의 자동화 시스템이 꽤 복잡해졌다. 탤런트 145명, 그들을 관리하는 봇 4종, 주기적으로 도는 cron 작업들, 그리고 사용자 요청 인터페이스. 이 모든 것이 제각각 문서화되거나 머릿속으로만 떠다니던 상황을 한 번에 정리하는 작업을 했다.
읽기 → -
로스터 145명 규모 확대와 운영 정책 문서화
프로필 데이터 로스터에 신규 11명을 추가하면서 145명 규모까지 확대했다. 단순한 데이터 추가가 아니라, 이 규모에서 팀이 안정적으로 유지보수할 수 있도록 운영 기준과 쿼터 한도를 문서에 명시한 작업이다.
읽기 → -
커뮤니티 제보로 데이터 품질 관리하기
기존엔 서비스 내 캐릭터 정보를 팀에서만 일방적으로 관리했다. 몇십 명의 로스터를 직접 조사·유지하는 방식인데, 규모가 커질수록 오류가 생기기 쉽고, 사용자가 발견한 정보 오류를 반영할 채널이 없었다. 이번 작업은 사용자가 직접 정보 오류를 신고하고 수정을 제안할 수 있도록 위젯을 추가한 것이다. 동시에 글로벌 사용자를 고려해 다국어 지원을 기본 설계로 잡
읽기 → -
프로필 섹션 라벨 8개국어 지원으로 글로벌 UX 강화
국제화(i18n) 작업으로 프로필의 깊이 있는 정보 섹션 라벨을 8개국어로 완성했다. src/i18n/ui.ts 파일에 today, milestones, embed, upcoming, generations, awaiting_data 라벨들을 여러 언어로 번역·적용한 작업인데, 단순해 보이는 번역 작업 하나가 글로벌 서비스의 사용성에 미치는 영향을 개발팀장
읽기 → -
주년 알림 범위 45일로 확대, 빈 화면 문제 해결
vtuberprofile 서비스의 'Today 주년 윈도우' 기능 범위를 14일에서 45일로 확대했다. 이전엔 기념일이 임박했을 때만 표시돼 빈 페이지가 자주 나타났는데, 다가오는 마일스톤을 미리 보여줌으로써 사용자 참여도를 높이고 콘텐츠 가용성도 개선할 수 있게 됐다.
읽기 → -
21일 임박 윈도우로 스케줄 표시 정리
vtuber 프로필의 업커밍 스케줄 목록에서 의미 없는 데이터들이 노출되는 문제를 정리했다. 영구 프리챗, 이미 지난 프레임 같은 항목들이 섞여 있어서 사용자가 실제 참여할 수 있는 다가올 일정을 한눈에 파악하기 어려웠다.
읽기 → -
로스터 확장하며 채널 자동 연동 엔진 구축
vtuber 프로필 데이터 규모가 크게 늘어나면서, 그동안 수동으로 관리하던 로스터와 채널 매핑을 자동화해야 할 시점이 왔다. 이번 작업은 단순 데이터 추가를 넘어 시스템 전체의 확장성을 갖추는 과정이었다.
읽기 → -
영문 리딩 결과 출력 형식 고도화
영문 사주 리딩 기능을 개발하면서 핵심 로직과 표현 계층을 명확하게 분리하고 연결하는 작업을 마쳤다. reading.ts와 humanizer.ts를 1층과 2층으로 구조화하면서 생긴 변화와, 팀 차원에서 배운 점을 정리해본다.
읽기 → -
자동 기사 생성 품질을 높이는 다층 처리 완성
자동화 봇의 기사 생성 파이프라인에서 humanizer의 1층과 2층 처리를 연결했다. 영문 콘텐츠의 자연스러움을 높이기 위해 초안 생성에서 고도화 개선으로 이어지는 체인을 완성한 작업이다.
읽기 → -
정제 로직 계층화로 여러 서비스 수렴
금액 포맷팅(money 패턴)에서 성공한 '1층 enrichment + 2층 presentation' 구조를 텍스트 정제(humanizer) 전반으로 확대했다. 블로그, 정부 데이터, ssul 세 서비스에 동일한 패턴을 적용하는 작업이었다.
읽기 → -
라이브러리의 ESM 포트로 모듈 시스템 현대화
한 프로젝트에서 기존 텍스트 처리 라이브러리를 Node.js 및 ESM 환경에서 사용하려면서, humanizer.mjs 형태의 ESM 포트를 추가했다. 단순한 파일명 변경처럼 보이지만, 그 안에는 모듈 시스템 현대화와 팀 호환성 사이의 여러 선택지가 들어 있었다.
읽기 → -
메타 태그 생성 중 변수 선언 순서 버그 수정
이번엔 꽤 흔하지만 놓치기 쉬운 버그를 잡았다. Astro 레이아웃 파일에서 origin 변수를 나중에 선언했는데, canonical URL이나 OG 이미지를 생성할 때 이미 그 변수를 참조하고 있었던 것. 결국 ReferenceError가 터지면서 페이지 빌드가 실패하는 상황이 생겼다.
읽기 → -
사이트맵에 잘못된 도메인 URL이 박혀 있던 문제 수정
Astro 설정 파일에서 발견한 실수를 고쳤다. astro.config.mjs의 site 옵션이 잘못 설정되어 있어서 sitemap이 잘못된 도메인 URL을 생성하고 있었는데, 이번에 올바른 도메인으로 교정했다.
읽기 → -
여러 서비스 코드, 이제 정리했다
지난 시간 발행 파이프라인은 여러 서비스의 코드가 한곳에 얽혀 있었다. 단일 리포지토리에서 운영하면서 서비스가 늘어나자 점점 더 복잡해졌고, 결국 이번엔 정리를 할 수밖에 없었다. 아울러 검색 최적화 메타데이터도 함께 추가하면서 두 가지 목표를 동시에 달성했다.
읽기 →