인계받은 스키마의 모든 테이블에 같은 네 개의 컬럼이 있었다. 등록한 시각과 등록한 사람과 수정한 시각과 수정한 사람이었다.
Table of contents
Open Table of contents
쉰여덟 번 반복된 네 줄
같은 네 줄이 테이블 수만큼 반복돼 있으니 정의 파일이 그만큼 길어진다. 새 테이블을 만들 때마다 그 네 줄을 다시 적어야 하고 적는 것을 잊으면 그 테이블만 빠진다.
반복을 없애는 방법을 찾아보다가 이 문제가 방법 선택의 문제라는 것을 알게 됐다. 어느 방법을 골라도 무언가를 포기하게 된다.
반복을 없애는 세 방법
첫째는 DB 쪽에 장치를 걸어서 자동으로 채우는 것인데 어느 경로로 들어와도 반드시 채워진다는 장점이 있다. 대신 그 로직이 코드 밖에 있어서 안 보이고 애플리케이션이 아는 사용자가 누구인지를 DB는 모른다.
둘째는 코드 쪽에서 공통 부모를 두고 물려받게 하는 것이다. 코드는 깔끔해지지만 그 계층을 안 거치고 직접 넣는 경로에서는 안 채워진다.
방법마다 다른 것을 포기한다
셋째는 지금처럼 그냥 반복해서 적는 것인데 무엇이 어디 있는지가 명시적으로 보인다. 대신 빠뜨려도 아무도 안 알려 준다.
셋 다 완전한 것이 없으므로 무엇을 포기할지를 정하는 문제였다. 우리는 코드 쪽 공통 계층을 쓰되 직접 넣는 경로를 따로 관리하기로 했다.
컬럼과 값의 구분
방법을 고르고 나서 지금 실제로 값이 들어가고 있는지를 집계했다. 컬럼이 있다는 것과 감사가 되고 있다는 것은 다른 말이기 때문이다.
세어 보니 몇 테이블은 수정한 사람이 거의 비어 있었다. 비어 있는 것이 아무도 안 건드렸다는 뜻일 수도 있지만 그 경로가 값을 안 채웠다는 뜻일 수도 있었다.
빠진 테이블을 찾는 검사
확인해 보니 후자였고 배치로 갱신하는 경로에서 그 값을 안 넣고 있었다. 컬럼만 보고 감사가 되고 있다고 생각했으면 그 사실을 몰랐을 것이다.
그래서 네 컬럼이 없는 테이블과 값이 안 채워지는 경로를 찾는 검사를 두었다. 어느 방법을 택하든 빠진 것을 찾는 장치는 따로 필요했다.
정리
- 감사 컬럼을 반복 없이 두는 방법마다 다른 것을 포기한다
- DB 장치는 모든 경로를 잡지만 앱 사용자를 모른다
- 공통 계층은 그 계층을 안 거치면 안 채워진다
- 반복해서 적는 것은 명시적이지만 빠뜨려도 조용하다
- 어느 쪽을 택하든 빠진 테이블을 찾는 검사를 만든다
- 컬럼이 있다고 감사가 되는 것이 아니다
- 실제로 채워지는지 세어 본다
- 비어 있는 것이 그 경로가 안 채웠다는 뜻일 수 있다