오늘은 진짜 많은 게 한꺼번에 있었던 날이다. 새벽부터 밤까지 커밋이 계속 나왔다.
배포가 또 실패했다. @supabase/ssr 패키지가 설치가 안 돼 있었던 것. npm install 한 번으로 해결됐는데 이걸 몰라서 한참 헤맸다.
Navbar.tsx의 createClient() 호출도 useEffect 안으로 옮겼다. SSR 단계에서 Supabase 클라이언트를 초기화하면 빌드가 터진다.
차트 기간 탭([1일] [1주] [1개월] [3개월] [1년])과 캔들/라인 토글을 만들었다. 종목 검색도 국내/해외 탭으로 분리하고, 상세 페이지 UI를 전면 재설계했다.
뉴스 RSS 수집도 개선했다. Supabase에 DB로 적재하는 POST /news/refresh 엔드포인트를 추가했다.
Publisher ID를 적용하고 <head>에 스크립트를 삽입했다. Admin 패널에서 페이지별 AdSense 노출을 ON/OFF 할 수 있는 기능도 만들었다.
크롤러가 광고 스크립트를 잘 인식하지 못하는 문제가 있어서 설정도 수정했다.
애드센스 신청 조건에 개인정보처리방침이 필요했다. /privacy와 /terms 페이지를 만들었다. 금융 서비스라 면책 조항을 상세하게 넣었다.
투자성향 진단 퀴즈 → 관심 자산 선택 → 면책 고지 동의 흐름을 구현했다. Supabase DB 저장도 연결했다.
hubwise-invest.com에 접속하면 서버 에러가 났다. 로컬에서는 멀쩡한데.
Vercel 런타임 로그를 보니:
Error: Event handlers cannot be passed to Client Component props.
원인은 diary/dev/page.tsx — 서버 컴포넌트인데 Threads 링크에 onClick을 붙여놨다. 서버 컴포넌트에서는 이벤트 핸들러 함수를 직렬화할 수 없다.
onClick 한 줄 삭제하니 바로 해결됐다.
교훈: "use client"가 없는 파일에서는 이벤트 핸들러를 절대 쓰면 안 된다. 로컬에서 에러가 안 나는 게 더 무섭다.
KIS API가 종목명 대신 업종명을 반환하는 케이스가 있었다. 내장 KRX 리스트를 우선 적용하고, API 응답의 업종명 필드는 제외하는 방향으로 여러 번 수정했다.
이 글의 소감을 Threads에서 확인하세요.
스레드에서 보기