함정 목록
전부 실제로 당한 것만 적었습니다. 공통점은 "그럴듯하게 틀려서 눈으로는 안 잡힌다"는 점입니다.
서버 페이징 — 전제가 깨지면 조용히 틀리는 3종
화면이 전체를 들고 있다는 전제가 깨집니다. 셋 다 화면상 멀쩡해 보입니다.
| 그냥 두면 | 맞는 방법 |
|---|---|
| 합계를 화면에서 더함 → 이 페이지 합계 | 서버 data-sums |
| 코드필터 선택지를 행에서 뽑음 → 이 페이지에 있는 값만 | 서버 data-options |
| 순번을 1부터 매김 → 페이지마다 1..10 반복 | 총건수 − (페이지−1)×크기 − i |
덧붙여, 주소로 들어온 정렬은 헤더 화살표도 같이 복원해야 합니다. 안 하면 정렬은 걸렸는데 표시가 없어 같은 헤더를 또 눌러 방향이 뒤집힙니다.
토스트 개수 제한을 비동기 제거로 돌리면 무한 루프
dismiss() 는 사라지는 애니메이션이 끝난 뒤 지웁니다 — 자식 수가 그 자리에서 줄지 않습니다.
while (자식수 >= MAX) dismiss(...) 는 네 번째 토스트에서 브라우저를 멈춥니다(복사 몇 번이면 걸림).
넘치는 만큼은 동기 removeChild.
기본 숨김 열은 폭을 고정한 뒤에 숨겨야 한다
먼저 숨기면 그 열 폭이 0px 로 굳습니다. 나중에 컬럼 토글로 켜도 체크만 켜지고 화면엔 안 보입니다.
"바깥 클릭" 판정을 e.target 위치로 하면 안 된다
편집기를 만들며 셀을 비우면 방금 클릭한 배지가 DOM 에서 떨어져 "밖"으로 오판됩니다 → 방금 연 편집기가 즉시 닫힙니다(배지를 누르면 안 열리고 옆 빈칸은 열리는 증상). 캡처 단계 플래그로 판정하세요.
그 밖에
- 옵션 목록에 NULL 이 섞이면 화면이 백지가 됩니다. 템플릿 루프의
p.equals(...)가 NPE 로 죽는데, 응답이 이미 커밋된 뒤라 HTTP 200 인데 HTML 이 중간에서 잘려서 옵니다. curl 로는 정상처럼 보입니다 — 서버 로그로만 진단됩니다. - 정렬 숫자 판정에
parseFloat금지.parseFloat("2026-05-22")는 2026 이라 같은 해 날짜가 전부 동률이 됩니다. - 콤보 드롭다운은 셀 안에서 잘립니다(
td{overflow:hidden}). "클릭은 되는데 목록이 안 보이는" 증상 — 셀 편집용은 body 로 포털. - 수정모드에선 행 클릭을 막되
preventDefault는 하지 말 것 — 체크박스 토글이 죽습니다. - 콤보에 native
required금지 — 원본 select 가display:none이라 "focusable 하지 않다"며 제출이 막힙니다. - 컨트롤 값 복원은 콤보 변환 전에 — 변환 뒤에
select.value만 바꾸면 보이는 글씨는 그대로입니다. - MyBatis 는
getQLike()를QLike로 읽습니다(JavaBeans: 대문자 두 개 연속). public 필드로 두세요. - JTE 는
grid.sumsAttr를 게터가 아니라 필드로 찾습니다. 게터만 두면 빌드가 깨집니다.
붙여넣기·채우기는 직접 편집과 같은 검증을 타야 한다
편집기에서 타이핑할 때만 검증하고 setCellValue(붙여넣기·채우기 경로)를 그냥 두면,
년월 칸에 금액이, 날짜 칸에 2026-02-31 이 그대로 들어갑니다.
화면엔 빨간 테두리만 뜨고 값은 남아 "고쳐진 것처럼" 보이다가 저장까지 갑니다.
지금은 유형별로 거르고, 건너뛴 이유를 편집 불가 / 형식 불일치로 나눠 알립니다 — 사용자가 할 일이 다르니까요.
모달 fetch 는 응답 상태부터 봐야 한다
r.text() 를 바로 쓰면 404 응답 본문이 팝업에 그대로 뜹니다 —
사용자에게 {"status":404,"path":"/demo/form"} 가 노출됩니다.
r.ok 를 먼저 확인하고, 실패는 토스트로 알립니다.
키트 독립 상태
- ✅ Tailwind 비의존 — 키트가 만드는 마크업은 자체 클래스(
gk-*)만 씁니다. 표 정렬·굵기 유틸도gridkit.css안에 있어 Tailwind 없이도 성립합니다. - ✅ CSS 분리 —
gridkit.css(키트) /app.css(사이드바·로그인·대시보드). - ✅ 도메인 코드 없음 — 특정 업무 기능은
data-bulk-*범용 선택-액션으로 빠졌습니다. 키트는 고른 id 를 보내고 서버가 준 문구를 보여줄 뿐, 업무 뜻을 모릅니다. - ⚠️ 복사본 2벌 — colon-money 가 같은 파일을 들고 있습니다(빌드 파이프라인 없음).
scripts/check-kit-sync.sh로 차이를 확인하세요. 사용처가 2곳을 넘으면 패키지로 올립니다.