버그와 함정
에러 문구로 검색해서 온 사람이 답을 찾아가는 자리.
- 운영 DB 에 남은 테스트 계정이 고객 가입을 막았다
가입이 안 된다는 연락을 받고 보니 계정은 멀쩡했다. 두 달 전 테스트 계정이 갤러리를 선점하고 있었다.
2026-09-25 · 2분 - Next.js 16 한글 slug 404 — 빌드는 성공했다
사이트맵 59개를 전수 검사하니 한글 제목 12편만 전부 404였다. 11일 동안 빌드는 매일 통과 신호를 냈다.
2026-09-24 · 4분 - requestAnimationFrame 이 안 도는데 에러도 안 났다 — visibilityState 가 hidden
Claude in Chrome 으로 자동 스크롤을 검증하다 rAF 가 0번 실행된 걸 발견했다. 원인은 hidden 이었다.
2026-09-23 · 3분 - margin: 0 을 줬는데 표 두 개 사이가 안 붙는 이유 — flex gap
인쇄용 A4 보고서에서 margin-top: 0 이 안 먹었다. 범인은 부모의 flex gap 이었다.
2026-09-20 · 2분 - Tailwind 4 text-base 가 14px 로 나간 이유
코드엔 16px, getComputedStyle 로 재면 14px. 전역 input 규칙이 @layer 밖에 있었다
2026-09-16 · 3분 - CDP startScreencast 가 deviceScaleFactor 를 무시한다
playwright 로 폰 화면을 3배로 녹화하려다 390×844 만 받았다. 고친 뒤에도 화면이 틀렸다.
2026-09-15 · 4분 - Tailwind 4 클래스 241곳을 고쳤는데 "여전히 많다"는 답이 왔다
치환은 끝났는데 화면엔 그대로였다. 원인은 코드가 아니라 하루 전에 옮기고 안 치운 옛 레포였다.
2026-09-15 · 3분 - 인쇄 CSS 가 70% 로만 그려질 때 — 0.707 의 정체
PDF 가 A4 왼쪽 위 70% 에만 찍혔다. 원인은 인쇄 CSS 가 아니라 앱 껍데기였다.
2026-09-14 · 3분 - supabase db push 400 — 옆 프로젝트에선 그냥 됐다
CLI 가 400 으로 죽어 20KB SQL 을 만들었다. 범위를 잘못 잰 탓이었고, 답은 .env 한 줄이었다.
2026-09-11 · 4분 - 구글 서치콘솔에 sitemap 을 안 냈는데 콘텐츠를 고치려 했다
누적 방문 213. 주제가 좁아서라고 결론 내리기 직전에 sitemap 제출 여부를 확인했다
2026-09-08 · 3분 - 배포 성공인데 홈에 글이 없다 — sitemap엔 있고 카테고리가 없었다
자동 발행 14회 전부 성공, 배포도 Ready. 그런데 글 4편이 홈에서만 사라져 있었다.
2026-09-08 · 3분 - SSR 에서 img onError 가 안 불린다
onError 를 걸었는데 폴백이 안 뜬다. naturalWidth 를 찍어보니 이미 끝난 실패였다.
2026-09-03 · 3분 - series 를 지웠더니 이전·다음 글이 사라졌다 (빌드는 통과)
타입체크·빌드·화면 확인 전부 초록불인데 기능 하나가 조용히 없어져 있었다. 왜 아무 검사도 못 잡았나.
2026-09-02 · 2분 - 이미지 404 인데 에러 로그에 안 남는다 — 조용한 어긋남
DB에는 사진 주소가 있고 저장소엔 파일이 없었다. 한 달 반 동안 아무도 몰랐다.
2026-09-02 · 3분 - git --amend 가 내 커밋을 지웠다 — reflog
두 세션이 한 저장소를 물고 있었다. 옆 세션의 amend 한 번에 내 커밋이 로그에서 사라졌다.
2026-09-02 · 3분 - 다크모드 bg-white — 흰색의 반대는 검정이 아니었다
하드코딩된 흰색 26곳을 다 고쳤는데 다음 날 흰 사각형이 남아 있었다
2026-09-01 · 3분 - 도련 3mm 는 표준이 아니었다 — CSS @page 를 뺀 이유
명함 인쇄용 파일을 만들다 도련 값을 하나로 박았는데, 국내 인쇄소 중 3mm 를 쓰는 곳이 없었다
2026-09-01 · 2분 - 타입체크 통과했는데 column does not exist — Supabase select의 함정
에이전트도 마이그레이션도 타입체크도 컬럼이 있다고 했다. 실제로는 없었고 화면이 통째로 죽었다.
2026-08-30 · 3분 - Next.js layout.tsx 로 막은 비번 게이트가 안 막힌 이유
화면엔 비번 창만 떴는데 curl 응답에는 학생 이름이 다 들어 있었다. App Router 레이아웃 인증의 함정.
2026-08-29 · 3분 - 겹친 모달에서 ESC 한 번에 둘 다 닫힌다 — window 리스너
스크롤 잠금 참조 카운터는 멀쩡했다. 문제는 모든 모달이 window 에 ESC 리스너를 달고 있던 것이었다.
2026-08-26 · 2분 - width: max-content 를 넣으니 드롭다운이 680px 이 됐다
글자 접힘을 고치려 max-content 를 넣었더니 화면 절반을 먹었다. 원인은 목록이 아니라 항목의 width: 100% 였다.
2026-08-25 · 3분 - age_range 가 이미 있었다 — 연령 구간 매핑은 한 방향만
채팅에 연령 구간 넷을 붙이려다 가입 쪽 여섯 칸을 발견했다. 양방향 매핑을 만들지 않은 이유.
2026-08-25 · 3분 - which 는 GUI 앱이 볼 PATH 를 안 알려준다
Paseo 설치 중 클로드 코드 경로가 임시 폴더로 잡혔다. which 의 답과 앱이 볼 답은 두 겹으로 달랐다.
2026-08-24 · 3분 - 쓰이지 않는 컴포넌트를 grep 으로 찾아 되살렸더니, 문구가 거짓말이었다
완성돼 있는데 아무 데서도 안 불리던 모달을 붙이려다, 그 안의 약속이 닷새 전에 사라진 기능이었다는 걸 발견했다
2026-08-24 · 2분 - grep 0건을 믿고 공용 컴포넌트를 다시 만들었다
`grep "<select"` 가 0건이었다. 없어서가 아니라 공용 컴포넌트가 그 태그를 대체했기 때문이었다.
2026-08-23 · 3분 - 세션 시간 501시간을 25일로 나눠봤더니 하루 20시간이었다
트랜스크립트 타임스탬프로 측정한 501시간이 왜 틀렸나, 그리고 제목에서 숫자를 뺀 이유
2026-08-22 · 2분 - 엑셀 파일명 일괄 수정 143곳 — 고칠수록 오류가 안 보이게 됐다
확장자 대소문자와 (1) 순번을 자동으로 다듬었더니, 서로 다르던 두 값이 같아졌다
2026-08-21 · 3분 - localhost 쿠키는 포트를 안 가린다 — NEXT_LOCALE 이 3000 과 3001 을 오간 이유
직원 앱이 중국어로 떴다. 원인은 포트를 구분하지 않는 쿠키였고, 규칙은 이미 메모리에 있었다.
2026-08-21 · 3분 - 순위 변동 표시에 스냅샷 테이블을 안 만들었다
매일 순위를 저장해두는 게 나중을 위한 선택 같았는데, 확인해보니 반대였다
2026-08-20 · 2분 - monorepo 에서 lucide Globe 를 쓸 뻔했다
앱 안 기존 코드 두 곳이 lucide Globe 를 쓰고 있었다. 그게 표준인 줄 알았는데, 어긋난 쪽이었다.
2026-08-20 · 2분 - 로딩 스피너 대신 데이터를 미리 보냈다 — 0.3초를 0초로
버튼 누를 때마다 0.2~0.5초 멈추는 화면. 스피너를 붙이는 대신 fetch 자체를 없앤 판단.
2026-08-19 · 3분 - anon 권한을 회수했는데 함수는 그대로 실행됐다
백업 표에 접근 제한이 없었다. 막고 검사까지 통과했는데 아홉 개 중 여섯 개가 여전히 열려 있었다.
2026-08-19 · 3분 - CSS overflow: hidden 으로 16:9 PDF 를 뽑다가 두 줄을 날릴 뻔했다
break-before: page 를 잘못 읽어 네 번 헛돌았고, 고친 뒤 재보니 63px 이 넘쳐 있었다
2026-08-18 · 4분 - 닫힌 모달이 body overflow hidden 을 지웠다
모달을 열었는데 뒤 배경이 스크롤됐다. 잠금 코드는 이미 있었고, 범인은 닫혀 있는 모달 둘이었다
2026-08-17 · 2분 - .gitignore 화이트리스트 때문에 "커밋해두세요"가 백업이 아니었다
전자책 발행 직전 최종 점검에서 걸린 것 — 적어둔 안전장치가 실제로 작동하는지는 확인한 적이 없었다
2026-08-15 · 4분 - UTC 서버에서 날짜가 하루 어긋났다 — 규칙 대신 타입으로 막았다
운영은 8월 4일, 노트북은 8월 5일. 한국 시간으로 통일하는 방식은 이미 두 번 샜다.
2026-08-14 · 3분 - 마이그레이션 번호 충돌 — AI 세션 두 개를 돌리다
duplicate key 에러로 죽은 뒤, 다른 세션에서 온 경고가 방금 고친 걸 되돌릴 뻔했다
2026-08-14 · 3분 - getMonth() 가 서버와 브라우저에서 다른 날짜를 뱉는다
한 페이지 안에서 헤더는 8.4, 모달은 8.5였다. 타임존 버그를 규칙 대신 타입으로 막기로 한 이유
2026-08-13 · 4분 - httpOnly 쿠키라 안전하다고 적었다 — 같은 값이 DB 평문 컬럼에 있었다
익명 대화 귀속 함수에 authenticated 권한을 줬다. 리뷰 첫 문장에서 뚫린 경로가 나왔다.
2026-08-12 · 4분 - DB에는 있는데 화면에 안 보인다 — 엑셀 일괄 등록 버그
성공 메시지는 떴는데 화면은 그대로였다. 데이터는 정확히 들어가 있었고, 문제는 다른 표에 있었다.
2026-08-12 · 3분 - 메일 607통을 지웠는데 화면은 1통 줄었다
삭제는 저장공간을 18% 줄였지만 눈에 보이는 건 그대로였다. 축을 잘못 잡았다.
2026-08-11 · 2분 - 주석 처리한 코드는 안 돌아온다 — 되살리는 방법까지 적어둬도
6주 전 주석이 증거였다. 지시받은 주석 처리를 조건부 노출로 바꾼 이유.
2026-08-10 · 3분 - 도구가 준 답이 내 질문에 대한 게 아니었다
whois가 5개 도메인을 전부 「등록됨」이라 답했다. 사실은 질문 자체가 닿지 않았다.
2026-08-02 · 3분 - Next.js 16에서 middleware가 조용히 꺼졌다
middleware.ts는 에러 없이 무시된다. 관리 페이지가 열린 채 배포될 뻔했다.
2026-07-31 · 3분 - 「안 된다」를 두 번 판정했는데, 한 번은 원인이 틀렸고 한 번은 사실 되고 있었다
- 「UTF-8로 바꿨는데 왜 깨졌지?」 — 변환은 잘못이 없었다
- 제목 미정
- 그 밖에 50편이 큐에 있다. 소재가 마르면 발행을 멈춘다.