Develop

수정 기능을 붙이면서 되돌리기를 같이 설계했다

즉시 저장·일괄 수정·규칙 소급이 각각 짝을 이룬다

한 줄로

개인 카드 내역 웹사이트에 ‘화면에서 수정하기’ 단계(3단계)를 붙이면서, 수정 동작마다 되돌리는 방법을 같이 만들었다. 즉시 저장, 일괄 수정, 규칙 소급 적용이 모두 되돌리기와 짝을 이룬다. 최종 리뷰에서 나온 7건은 실패하는 테스트를 먼저 만들고 고쳤고, 그중 실제로 사고가 날 수 있던 것은 두 건이었다.

3단계에서 만든 것

카드 내역 웹사이트는 단계를 나눠 만들고 있다. 3단계의 목표는 내역을 화면에서 직접 고치는 것이다. 결과는 커밋 a1c0116이고, 배포까지 마쳤다(로컬 master, push 없음).

내역 상세

  • 카테고리·메모·합계 포함 여부는 고르는 즉시 저장된다.
  • 카테고리를 바꾸면 기본으로 ‘이 가맹점 전체’에 적용된다.
  • 저장할 때마다 알림에 [되돌리기]가 뜬다.

일괄 수정

  • 데스크톱에서는 키보드로 한다. Space로 거래를 선택하고, C·N·X로 카테고리·메모·제외를 정한다.
  • 폰에서는 길게 눌러 선택한다.

‘정리’ 메뉴

미분류(후보 버튼), 가맹점 병합, 규칙 만들기, 기록 네 탭이 있다.

  • 미분류 75종 중 66종에 후보 버튼이 붙는다.
  • 규칙 만들기는 소급 적용하기 전에 바뀔 거래를 미리 보여 주고, 그중 일부를 뺄 수 있다.
  • 기록 탭에서는 작업 단위로 되돌린다.

되돌리는 방법은 세 가지다

3단계의 수정 기능을 되돌리기 기준으로 다시 묶으면 아래와 같다.

시점 되돌리는 방법
한 건을 저장한 직후 알림의 [되돌리기]
규칙을 소급 적용하기 전 미리보기에서 바뀔 거래 일부를 뺀다
나중에 기록 탭에서 작업 단위로 되돌린다

이 구조는 다음 단계인 4단계(명세서 올리기) 설계에도 그대로 이어진다.

  • 업로드 하나가 기록 탭에 작업 하나로 남는다.
  • 업로드를 되돌리면 그 업로드로 들어온 거래·수입·새 가맹점이 모두 빠지고, 보관함 파일은 다시 ‘안 가져옴’ 상태가 된다.
  • 가져온 뒤에 그 거래를 고쳤으면 3단계 규칙대로 되돌리기를 거절한다.

합계와 소비 패턴은 따로 본다

현금 인출과 개인 이체는 지출 합계에 남긴다. 이상 지출 같은 소비 패턴 표에서만 뺀다.

실데이터로 왕복해 보기

테스트 데이터만으로 끝내지 않았다. 실데이터를 분류했다가 다시 되돌리는 왕복을 직접 확인했다. 되돌렸기 때문에 데이터에 남은 변경은 없다.

최종 리뷰 7건은 실패하는 테스트부터 만들었다

최종 리뷰에서 7건이 나왔다. 7건 모두 실패하는 테스트를 먼저 만든 뒤 고쳤다. 실제로 사고가 날 수 있던 것은 아래 두 건이다.

  1. 상세 화면이 열린 상태에서 x를 누르면 선택한 거래가 합계에서 빠졌다. X는 일괄 수정에서 ‘제외’를 정하는 키다.
  2. 메모를 되돌린 뒤 입력 칸을 지나가기만 해도 옛 메모가 다시 저장됐다.

리뷰어는 아래 3건을 사소하다고 분류했는데, 이 3건은 중요로 올려서 고쳤다.

  • 일괄 제외를 하면 ‘승인취소미청구’ 같은 원래 제외 사유를 덮어썼다.
  • 되돌린 메모가 다시 저장됐다.
  • 직접 지정한 거래에는 ‘가맹점 전체’ 적용이 반영되지 않았다.

최종 테스트는 백엔드 176개, 화면 57개, E2E 28개가 모두 통과했다.

구현하면서 정한 것

  • 브랜치 없이 master에서 작업했다. 이 레포는 ‘로컬 master에 커밋하면 완료’가 규칙이다.
  • 폰 하단 일괄 수정 메뉴 줄의 왼쪽 위치를 150px로 맞췄다. 계획에는 220px로 적혀 있었지만, 실제 사이드바 폭은 150px다.
  • 카드 순위 계산 결과는 저장해 두지 않는다. 폴링(주기적으로 서버에 다시 묻는 방식)을 고쳐서 같은 계산이 반복되던 문제가 없어졌기 때문이다.
  • 커밋되지 않은 파일에 기대던 코드. 화면 개편 세션에서 문제를 알려 왔다. master의 웹 코드가 커밋되지 않은 analyzer.py와 git이 추적하지 않는 importer.py를 쓰고 있었다. 내가 직접 고치던 파일이라 처음에는 커밋하지 않았고, 23:09에 커밋하라고 요청해 커밋했다.

미뤄 둔 사소한 문제 7건

  • 새로 만든 카테고리가 새로고침하기 전까지 내역 화면의 카테고리 목록에 보이지 않는다.
  • 규칙 미리보기는 200건까지만 보이는데, 화면에 그런 표시가 없다.
  • 규칙 수정·미리보기 API가 잘못된 입력 일부를 걸러내지 못한다. 화면에서는 그런 입력을 보내지 않는다.
  • 나중에 고정지출 직접 추가·제외 기능이 생기면 가맹점 병합에서 오류가 날 수 있다. 지금은 그 기능을 쓰는 코드가 없다.
  • 병합 기록 요약에 최종 이름이 옛 이름 목록에도 함께 나온다.
  • 폰에서 길게 누르는 도중 손가락이 벗어나면 다음 탭 한 번이 무시될 수 있다. iOS에서는 텍스트 선택이 뜰 수 있다.
  • 숫자 검증에 쓰는 단위 이름 일부가 너무 넓게 허용돼 있다.