보고서의 첫 카드를 읽는 사이 다른 직원이 수량을 바꾼다면 상세와 요약은 어떤 자료를 기준으로 해야 할까. 숫자 계산이 맞아도 기준이 다르면 설명이 어긋날 수 있다.
이번 글은 날짜 범위의 일반 설명을 반복하는 대신, 이미 선택한 자료를 고정하고 같은 원본에서 여러 결과를 읽는 새 합성 실험을 다룬다. 실제 회계 보고서나 회사의 거래를 사용하지 않았다.
날짜 범위와 조회 시점은 다른 기준이다
같은 기간의 주문을 읽어도 읽는 순간에 따라 수정된 내용은 달라질 수 있다. 기간 조건만 표시하고 최신 값으로 각각 계산하면 카드와 내역이 다른 자료를 섞을 수 있다. 나는 이번 예제에서 조건을 적용한 행들을 불변 복사본으로 만들고 요약과 내역, 전체 출력을 그 복사본에서 읽도록 했다. 어떤 결과가 한 번의 조회에 속하는지 구분한 것이다.
합성 revision은 자료 기준을 설명하는 정수이며 실제 시각이나 서버의 전역 일련번호는 아니다. 함수가 받는 값이므로 실무에서는 누가 어느 읽기에서 부여하는지 정해야 한다. 내용 지문도 함께 남겨 같은 번호로 다른 자료를 만들면 구별한다. 기준 번호가 있다는 이유만으로 실제 저장소의 일관된 읽기가 확보됐다고 주장하지 않는다.
카드와 상세가 같은 행을 사용하게 했다
summary는 복사본의 개수와 수량 합을 계산하고 export_rows와 page도 같은 rows를 읽는다. 회사 A의 draft 예시는 두 행과 수량 9다. 원본의 한 수량을 바꾸고 새 복사본을 만들면 새 합은 11이지만 예전 합은 9로 남는다. 예전 기준과 최신 기준을 구분해서 비교할 수 있는 결과다.
여기서 수량 합은 설명용 숫자이며 매출·세금·회계 인식 정책을 구현하지 않았다. 실제 금액 보고서를 만들면 앞서 공유한 장부의 단위와 계산 계약도 별도로 적용해야 한다. 나는 자료 기준을 지키는 책임과 어떤 지표를 계산할지 정하는 책임을 섞지 않는다. 같은 데이터라는 조건이 맞아야 계산 의미를 논의할 수 있다.
새로고침은 다른 결과를 만드는 행동이다
보고서를 새로고침하면 새 조회 결과를 만들 수 있다. 다만 이전 카드 일부와 새 내역 일부를 섞지 않도록 화면에서 현재 기준을 명확히 해야 한다. 다음 페이지 커서는 그 복사본의 내용 지문에 묶이고 다른 결과에는 사용할 수 없다. 모르는 기준의 데이터를 조용히 합치는 대신 다시 읽을 대상을 정하게 한 선택이다.
실제 화면에는 생성 시점, 자료 버전이나 최신 여부를 어떻게 표현할지 검토가 필요하다. 이번 모듈은 그런 브라우저 화면을 만들지 않고 결과 값에 revision과 snapshot 지문을 돌려준다. 표시와 갱신 동작, 오래된 결과에 대한 안내는 연결할 서비스의 책임이다. 함수가 반환한 표지를 사용자에게 자동으로 이해됐다고 보고하지 않는다.
이미 섞인 원본을 복사해서 고칠 수는 없다
함수에 넘기는 배열이 처음부터 여러 DB 시점의 값이라면 나중에 불변으로 만들어도 원래의 불일치는 남는다. 이번 코드가 보장하는 것은 전달받은 선택 결과가 이후 원본 수정에 따라 바뀌지 않는 조건이다. 실제 데이터베이스에서 일관된 읽기를 얻는 트랜잭션이나 스냅샷 기능은 별도로 구현해야 한다.
대량 자료와 여러 저장소가 연결된 보고서라면 더 구체적인 기준이 필요하다. 어떤 지연을 허용하고 어떤 업무의 완료를 포함할지 정해야 한다. 이 작은 모듈은 최대 1000개 합성 행만 받고 지속 조회 저장소나 만료 정책도 없다. 모든 규모의 보고서 서비스를 완성한 예제처럼 설명하지 않고 확인한 책임만 남겼다.
표시된 합계를 다시 풀어 볼 수 있도록
독립 검사는 원본을 바꾼 뒤 기존 summary가 그대로인지, 새 결과의 합이 달라지는지 대조한다. 페이지를 이어 붙인 행이 전체 출력과 같은지도 확인한다. 같은 조건·같은 행·같은 기준이라는 관계를 각각 확인해야 숫자 하나가 맞는 것보다 더 설명 가능한 결과가 된다. 기록 뷰어에는 변화 전후의 결과를 함께 남겼다.
실제 회사의 보고서 검수나 물리 기기 테스트를 수행한 것은 아니다. 도입하려면 저장소의 읽기 보장, 권한과 필드 범위, 보고서 보관과 갱신 정책을 더 정해야 한다. 나는 대표가 숫자를 다시 확인할 수 있는 구조가 한눈에 보기 좋은 카드만큼 중요하다고 보았다. 그 근거를 독립 합성 코드와 테스트로 공개한다.