개발
코드 / 아키텍처 / 디버깅
-
멀티사이트 모니터링에 전용 로그와 관리자 UI 추가
여러 사이트의 페이지뷰를 중앙에서 모니터링하는 시스템에 kpopdex.com을 추가하면서, 동시에 전용 로그 저장 옵션과 관리자가 사이트 목록을 직접 등록할 수 있는 기능을 구현했다.
읽기 → -
Discord 콘텐츠 채널 등록 구조 마련
Discord 채널을 JSON 파일로 관리하는 체계를 처음 도입했다. kpopdex 콘텐츠 채널을 등록하면서, 향후 여러 채널을 구조적으로 운영하기 위한 기초를 다졌다는 의미다. 단순한 채널 추가로 보이지만, 이건 팀의 Discord 통합 방식을 정리하는 첫 번째 공식 선언이었다.
읽기 → -
뉴스 발행 진행률을 소스별로 분리 추적하도록 개선
서비스에서 콘텐츠를 정기적으로 발행하는 작업은 단순해 보이지만, 실제로는 여러 데이터 소스에서 동시에 들어오는 정보를 조율해야 한다. 이번에 발행 진행 상황을 추적하는 스크립트를 개선하면서 깨달은 게, 단순히 "전체 진행률"만 보는 것으로는 문제를 빠르게 진단할 수 없다는 점이었다.
읽기 → -
콘텐츠 필터 탈락 후 반복되던 재시도 제거
크롤링해서 발행하려는 글이 필터링 기준(게이트)을 통과하지 못할 땐, 더 이상 재시도할 이유가 없다. 이전엔 이걸 제대로 구분하지 못해 불가능한 글에 대해 계속 재시도하느라 리소스를 낭비하고 있었다. 이번에 그 부분을 걸러내는 로직을 추가해서 불필요한 작업을 줄였다.
읽기 → -
타임아웃으로 오인되는 거짓 알림 제거
슬롯 점검 스크립트에서 bash 프로세스가 죽거나 응답 없을 때 무조건 timeout으로 판정하던 버그를 고쳤다. 이제는 프로세스 상태와 무관하게 실제 발행수를 재확인한 뒤 최종 판정한다.
읽기 → -
정책 페이지 4종이 이제 다국어를 지원합니다
네 개의 정책 페이지에 다국어 라우팅을 추가했다. 쿠키 정책, 연락처, 정정 요청, 소스 정책이 사용자의 언어 설정에 맞게 로드되도록 한 것인데, 생각보다 반성할 점이 많은 작업이었다.
읽기 → -
정책 페이지를 7개국어로 지원하며 글로벌 진출 준비하기
정책 페이지 8종을 일괄로 국제화했다. About, Copyright, Privacy, Terms, Cookies, Contact, Source Policy, Correction Request 페이지를 7개국어로 동시에 제공하는 구조를 만들었다.
읽기 → -
다국어 뉴스 자동 번역 인프라 완성
이번에 뉴스 서비스의 다국어 지원을 위해 110건의 뉴스를 7개 언어로 번역하고, 그 데이터를 범용 i18n 헬퍼/컴포넌트와 연결했다. 이 작업은 단순한 "데이터 채우기"가 아니라, 글로벌 확장을 대비한 인프라 정비의 첫 단계였다.
읽기 → -
사이트맵 hreflang으로 다국어 색인 정확히 하기
이번에 사이트맵에 hreflang 대체본을 완전하게 추가했다. 기존에는 영어만 명시하거나 일부 언어만 처리했는데, 이제 우리가 지원하는 모든 언어를 각 URL마다 명시하고 x-default까지 포함하는 방식으로 개선했다. 단순히 "태그 추가"처럼 보일 수 있지만, 다국어 SEO의 기초를 바로잡는 중요한 작업이었다.
읽기 → -
사이트맵 타임스탠프 오류로 검색 순위 떨어지던 문제 수정
사이트맵(sitemap.xml) 생성 로직에서 일부 데이터 소스의 타임스탠프 컬럼이 잘못 선택되고 있었다. K-pop 뉴스와 멤버 정보를 다루는 쿼리에서 updated_at 대신 created_at을 사용해야 하는데 반대로 적용되고 있던 것. 이번 작업은 단순 컬럼 교정에 그치지 않고, 여러 데이터 소스를 조회할 때의 에러 처리 방식도 함께 개선했다.
읽기 → -
얇은 콘텐츠 페이지 검색 제외, 핵심 콘텐츠만 노출
얼마 전 검색 엔진 최적화(SEO) 차원에서 사이트의 페이지 인덱싱 정책을 개선했다. 앨범, 회사, 팬덤 관련 페이지들은 검색 결과에서 제외하고, 그룹·뉴스·멤버 같은 가치 있는 콘텐츠만 명시적으로 구글에 노출하는 작업이었다.
읽기 → -
도메인 변경, 메타데이터 누락이 SEO 페널티 되지 않도록
도메인을 kpop.hedvion.com에서 kpopdex.com으로 통으로 갈아 엎었다. 단순 DNS 레코드 수정이 아니라 SEO와 크롤링 관점에서 검색 엔진이 혼동하지 않도록 모든 메타데이터를 동시에 갱신해야 하는 작업이었다.
읽기 → -
광고 플랫폼 인증을 위한 ads.txt 배포
ads.txt 파일을 프로젝트의 public 폴더에 추가하여 AdSense 퍼블리셔 인증을 완료했다. 작은 한 줄짜리 추가처럼 보이지만, 광고 수익 시스템의 첫 신뢰 기반을 다지는 작업이었다.
읽기 → -
사이트 전역 AdSense 광고 로더 추가
Base.astro 레이아웃 파일의 head 영역에 AdSense 로더 스니펫을 삽입했다. 이제 사이트의 모든 페이지에서 광고가 로드되고 노출될 준비가 됐다는 뜻이다.
읽기 → -
표준 정책페이지 풀세트 추가로 준수 기반 정비
이번엔 서비스의 필수 정책페이지들을 한 번에 추가했다. 쿠키 정책, 연락처, 출처 정보, 수정요청 채널 이렇게 네 개 페이지를 만들고, 푸터에서 쉽게 접근할 수 있도록 링크도 연결했다. 간단해 보이지만 생각해볼 게 꽤 많은 작업이었다.
읽기 → -
외부도메인 인벤토리 등록으로 운영 일관성 확보
새로운 외부도메인을 docs 에 인벤토리로 등록했다. 팀이 서로 다른 서비스/도메인들을 다룰 때마다 일관된 설정과 지침을 참고할 수 있도록 하려는 의도였다.
읽기 → -
관리자 DB 풀에 쌓이던 좀비 연결 정리하기
관리자 DB 연결이 계속 누수되던 문제를 발견하고 고정했다. globalThis에 고정된 커넥션 풀 인스턴스가 idle 타임아웃을 제때 회수하지 못하면서 발생한 메모리 누수였다.
읽기 → -
멤버 활동 보이기, 그룹 찾기 쉽게 하기
이번에 멤버페이지 강화, 검색, SEO 개선을 한꺼번에 손봤다. 한 번의 커밋에 여러 영역이 섞여 있는데, 사실 이건 의도적이었다. 어느 정도 서로 다른 도메인들이지만, 모두 "사용자가 서비스를 어떻게 발견하고 참여하는가"라는 주제로 연결되어 있었기 때문.
읽기 → -
홈 히어로 헤드라인이 어색하게 끊기던 버그 수정
홈페이지 히어로 섹션의 대형 헤드라인과 리드 문단이 도중에 어색하게 끊어져서 읽기 불편했다. 원인은 .hero 클래스에 박혀 있던 max-width: 18ch 제약 때문. 그 제약을 제거하니 문제가 해결됐다.
읽기 → -
멤버 정보 충실화로 팬 경험을 한층 깊게
멤버 생일, 국적, 포지션 같은 '팬들이 실제로 알고 싶어하는 정보'가 서비스에서 빠져 있었다. 동시에 공식 뮤직비디오, 소속사, 팬덤 페이지 같은 콘텐츠 노드들이 느슨하게 연결되어 있었다. 이번 작업은 이런 정보들을 체계적으로 보강하고, 신뢰할 수 있는 소스로 검증한 뒤 서비스에 엮어내는 과정이었다.
읽기 →