- 발행일
신청서 항목 모달에서 후보 조회 20회를 2회로 줄였다 — 체크박스 2,178개와 숨은 탭의 required
등록 신청서의 항목 모달이 화면 4.1개 길이였습니다. 재 보니 67%가 체크박스 상자였고, 한 번 여는 데 체크박스 2,178개를 그리고 후보 조회가 20번 나갔어요. 후보가 많은 슬롯만 접힌 검색칸으로 바꾸고, 접힌 슬롯은 펼칠 때 조회하게 해서 2회로 줄였습니다.
등록 신청서의 항목 모달이 화면 4.1개 길이였습니다. 재 보니 67%가 체크박스 상자였고, 한 번 여는 데 체크박스 2,178개를 그리고 후보 조회가 20번 나갔어요. 후보가 많은 슬롯만 접힌 검색칸으로 바꾸고, 접힌 슬롯은 펼칠 때 조회하게 해서 2회로 줄였습니다.
관리자 상세·수정 화면 여덟 개가 없는 pk를 받으면 500을 냈습니다. 쿼리를 미리 로드하려고 get_object()를 덮으면서 404 처리 없이 .get(pk=)를 직접 불렀거든요. 덮어야 했던 건 "무엇을 가져오나"가 아니라 "어떤 쿼리셋에서 가져오나"였습니다. 여덟 뷰를 get_queryset()으로 옮기니 78줄이 26줄이 됐고, 제네릭 뷰가 원래 하던 404 처리가 돌아왔습니다. 같은 함정이 남은 화면 네 곳은 아직 그대로입니다.
인스턴스 관리 화면에서 같은 날 41분 간격으로 두 가지를 고쳤습니다. 하나는 객체 슬롯이 있는 데이터를 저장하면 TypeError가 나면서 저장이 통째로 죽던 것이고, 하나는 다른 화면에서 구성 속성 순서를 바꿔도 이미 열려 있는 탭은 옛 순서로 계속 그리던 것이었어요. 원인은 달랐지만 둘 다 "이 화면이 한 번 정해 둔 것을 계속 믿는다"는 같은 자리에서 나왔습니다.
상세에서 상세로 두 번 건너가면 목록 버튼이 검색 조건을 통째로 잃었고, 필터를 만질 때마다 뒤로가기 이력이 하나씩 쌓였습니다. 복귀 주소는 받은 것을 그대로 이어달리게 하고, 조건 변경은 덮어쓰고, 화면 안에서 다른 데이터로 건너뛰는 것만 이력에 쌓도록 나눴어요. 기준은 하나입니다. 다른 곳으로 갔나, 같은 화면의 상태가 바뀌었나.
관계도와 데이터 맵은 응답을 기다리는 동안 빈 캔버스였습니다. 트리 화면이 쓰던 waitMe를 그대로 가져다 덮으려 했는데, 그 플러그인이 jQuery에 붙어 있다는 사실 하나 때문에 세 가지가 연달아 걸렸어요. jQuery를 한 번 더 실으면 앞의 플러그인이 지워지고, defer로 실으면 그림 자체가 안 그려지고, 켠 스피너를 끌 때는 캔버스가 이미 다른 객체로 바뀌어 있었습니다.