Storage 업로드는 됐는데 photos insert가 실패했던 문제
파일은 올라갔지만 photos 테이블 기록이 남지 않던 상황에서, 서버 전용 키와 id 생성 책임을 정리한 기록입니다.
Code notes
코드에서 확인한 구현 포인트
배포 기준 2025.12.13
관련 파일
apps/web/app/api/upload/route.tsSupabase Storagephotos table구현 메모
Storage 업로드와 photos 테이블 insert가 별도 단계라는 점을 분리해 확인했다.
서버 전용 Supabase 키로 DB insert를 수행하고, 서버에서 photo id를 생성하도록 정리했다.
성공 응답 전에 파일 경로와 DB row가 모두 만들어졌는지 확인하는 흐름으로 바꿨다.
업로드 성공과 DB 저장 성공은 다르다
이미지 업로드 기능에서는 파일이 Storage에 올라가는 것과 photos 테이블에 기록이 남는 것이 별개의 단계다. 처음에는 파일 업로드만 보고 성공처럼 느꼈지만, 이후 분석 세션과 사진을 연결하려면 DB row가 반드시 필요했다.
문제는 Storage 업로드 이후 photos insert에서 실패가 날 수 있다는 점이었다. 이 경우 사용자는 이미지를 올렸다고 생각하지만, 서버 입장에서는 분석에 쓸 사진 기록이 없는 상태가 된다.
수정한 방향
업로드 API에서 서버 전용 Supabase 키를 사용하도록 분리했다. 클라이언트에서 써도 되는 공개 키와 서버에서 DB insert를 수행할 때 필요한 권한은 다르게 다뤄야 했다.
또 photos 테이블에 들어갈 id를 서버에서 명시적으로 만들고, image_path, image_url, source 같은 최소 정보를 함께 저장했다. 파일과 DB row를 같은 응답 흐름에서 확인할 수 있게 만든 것이다.
다시 배운 점
파일 기반 기능은 항상 두 단계를 본다. 저장소에 객체가 생겼는지, 데이터베이스에 그 객체를 참조하는 row가 생겼는지다.
둘 중 하나만 성공하면 나중에 더 복잡한 문제가 된다. 그래서 업로드 API는 성공 응답을 만들기 전에 Storage와 DB insert를 모두 확인해야 한다.
Keep reading
다른 글 이어서 보기
Debugging
2026.05.05
6 min read
GitHub 푸시 후 Vercel 배포가 Blocked가 되었을 때
커밋은 올라갔지만 Vercel 자동 배포가 막혔던 상황에서, GitHub 작성자와 프로젝트 권한을 확인해 해결한 기록입니다.
Debugging
2026.05.04
7 min read
서브도메인은 연결됐는데 /admin이 404였던 이유
blog, ad, nacho 서브도메인을 나누는 과정에서 Vercel 404와 앱 내부 라우팅 문제를 구분해 해결한 기록입니다.
Debugging
2026.05.03
8 min read
도메인은 연결됐는데 접속이 거부될 때
tangly.kr과 www 도메인을 Vercel에 붙이며 DNS, 네임서버, SSL 발급 대기 상태를 구분해 해결한 기록입니다.