대니
danny's blog@dannywon_dev
발행 15 · 대기 72

1인 개발자. 클로드 코드를 팀처럼 굴린다. 매일 겪은 것만 쓴다.

버그와 함정

DB에는 있는데 화면에 안 보인다 — 엑셀 일괄 등록 버그

성공 메시지는 떴는데 화면은 그대로였다. 데이터는 정확히 들어가 있었고, 문제는 다른 표에 있었다.

성공 메시지는 떴는데 화면이 그대로다 — 이 상황이 익숙하면 이 글이 맞다.

갤러리가 엑셀로 작품을 한 번에 등록하는 기능을 만들었다. 39점짜리 목록을 매번 손으로 넣던 걸 없애는 게 목적이었다. 테스트에서 파일을 올리고 「등록」을 눌렀다. 성공 메시지가 떴다. 그런데 목록에는 아무것도 없었다.

데이터베이스를 열어보니 작품은 정확히 들어가 있었다. 제목도, 연도도, 크기도 다 맞았다. 화면에만 없었다.

표시 문제라고 의심했다가 방향을 틀었다

처음엔 화면 쪽을 의심했다. 캐시가 안 지워졌거나, 목록을 다시 안 불러오거나. 데이터가 들어간 건 눈으로 확인했으니 남은 건 표시 문제라고 생각한 것이다.

새로고침을 해도 똑같았다. 다른 브라우저로 열어도 똑같았다. 그때 방향이 바뀌었다 — **「안 보이는 것」이 아니라 「보일 조건을 못 채운 것」**일 수 있다.

화면이 데이터를 어떻게 찾는지 거꾸로 따라가 봤다. 화면은 작품 표를 직접 읽지 않았다. 이 서비스에서 「작가 명부」는 작품과 다른 표에 있고, 화면은 명부를 먼저 그린 다음 그 아래에 작품을 붙이는 구조였다. 명부에 그 작가가 없으면 작품이 걸릴 자리가 아예 없다. 작품 표에서 시작하는 길이 아예 없었다.

답을 확인해준 건 사용자였다. 한참 뒤에 그 작가를 손으로 한 번 등록하니, 넣었던 작품들이 한꺼번에 나타났다.

이름이 말하지 않는 일을 하고 있었다

기존에 작품을 한 점씩 저장하던 함수의 코드를 열어봤다. 명부에 한 줄 넣는 코드가 거기 있었다. 주석도 없이, 다른 작업들 사이에 섞여서.

함수 이름은 「작품 저장」이었다. 실제로는 작품을 저장하면서 명부도 함께 채우고 있었다. 나는 그 함수를 대체하는 일괄 등록 함수를 만들면서 이름이 말해주는 일만 베꼈다.

기존 함수를 대체하는 새 함수를 만들 땐, 그 함수가 하는 일을 이름이 아니라 코드로 센다.

부수 효과가 이름에 안 드러나면, 그 함수를 참고해서 새로 쓰는 쪽은 그걸 반드시 빠뜨린다. 그리고 그 누락이 사용자에게는 **「눌러도 아무 일도 안 일어남」**으로 보인다. 에러도 안 나고 성공 메시지까지 뜨기 때문에 어디를 봐야 할지도 안 알려준다.

고쳤다와 고쳐졌다는 다르다

바꾼 건 셋이다.

  • 일괄 등록 함수에 명부 등록을 추가했다. 기존 함수와 같은 처리로.
  • 이미 들어가 있던 것들도 함께 고쳤다. 「작품은 있는데 명부에 없는」 상태는 어떤 경로로 생겼든 화면에서 안 보이는 고장이라, 남아 있는 것을 전부 채웠다. 채우기만 하고 지우지는 않게.
  • 확인 쿼리를 하나 돌려 빠진 것이 0건인지 봤다.

세 번째를 따로 적어두는 이유는, 코드를 고치는 것과 이미 생긴 잘못된 데이터를 되돌리는 것이 다른 일이기 때문이다. 코드만 고치면 그 뒤에 넣는 것부터 정상이 되고, 이미 들어간 39점은 계속 안 보인다. 대개 잊는 쪽이 후자다.

← 목록으로