I Found 4 Bugs in an AI Student Platform — Here's What Was Actually Wrong
개요
AI 기반 익명 질의응답 플랫폼인 DoubtDesk에서 발견된 네 가지 버그는 개발 환경에서는 간과되기 쉽지만 프로덕션 환경에서는 잘못된 작동이나 실패로 이어질 수 있다는 점을 보여준다.
주요 내용
* 프로덕션 DB에 데이터를 삽입하는 GET 엔드포인트: /api/notifications/test-seed GET 요청이 사용자 인증이나 개발 환경 확인 없이 프로덕션 데이터베이스에 더미 알림 데이터를 삽입했다. 이는 단순한 URL 방문으로도 예기치 않은 데이터 변경을 유발할 수 있다. 수정 사항으로는 프로덕션 환경에서 해당 라우트를 차단하고, 데이터 변경을 POST 메서드로 전환하며, 에러 응답에서 스택 트레이스를 제거했다.
* 사용자 인증 전에 API를 호출하는 알림 벨: NotificationBell 컴포넌트가 사용자 로그인 상태와 관계없이 10초마다 /api/notifications 엔드포인트를 폴링했다. 로그인하지 않은 사용자에게는 401 에러가 반복적으로 발생하여 서버 로그를 불필요하게 채우고 리소스를 낭비했다. 해결책으로 SWR 호출 키를 사용자 인증 상태(isLoaded 및 isSignedIn)에 따라 조건부로 설정하고, 3회 실패 후 재시도를 중단하며, 에러 발생 시 "다시 시도" 버튼을 표시하도록 변경했다.
* 실패한 API 호출이 빈 상태로 표시되는 문제: 북마크 및 추천 강의 컴포넌트에서 API 호출이 실패했을 때, 에러가 콘솔에만 기록되고 사용자에게는 빈 상태로 표시되어 실제 오류 발생 여부를 알 수 없었다. res.ok를 확인하여 응답 유효성을 검사하고, 에러 상태와 빈 데이터 상태를 분리하여 명확한 오류 메시지를 표시하도록 수정했다.
* 프론트엔드와 API 계약 불일치: 무한 스크롤 컴포넌트(InfiniteDoubtFeed)가 기대하는 { doubts, pagination } 형태의 응답과 달리, API는 단순 배열(Doubt[])을 반환하여 데이터가 제대로 표시되지 않고 페이지네이션 기능이 작동하지 않았다. 컴포넌트가 단순 배열과 객체 형태의 응답을 모두 처리할 수 있도록 수정하여 현재 및 향후 API 변경 사항에 모두 대응 가능하게 만들었다.
시사점
이 버그들은 행복 경로(happy path)뿐만 아니라 사용자 로그아웃, API 500 에러, 데이터 구조 불일치와 같은 실패 사례를 반드시 테스트해야 함을 강조하며, 개발 환경에서의 정상 작동이 프로덕션 환경에서의 올바른 작동을 보장하지 않음을 시사한다.
댓글
GitHub Discussions