Skip to content
isdnetworks
Go back

규칙에 예외가 다섯 있었다

(수정됨)

모든 테이블에 created_at 과 updated_at 을 두기로 했는데 안 지켜진 것이 있어서 information_schema.columns 로 전수로 찾아봤다.

Table of contents

Open Table of contents

상황 — 예외 다섯과 각각의 이유

시각 컬럼이 없는 테이블이 다섯 나왔고 각각을 열어 보니 넷은 이유가 있었다.

code_*           기준 자료. 언제 만들었는지 의미 없음
temp_import      임시 테이블. 매번 지우고 만든다
order_item_view  뷰. 컬럼을 못 넣는다
stat_daily       집계 결과. 집계 날짜가 이미 있다
legacy_backup    옛 자료. 옮길 때 그대로 가져왔다

마지막 하나만 그냥 안 넣은 것이었다. 위반 다섯이 아니라 정당한 예외 넷과 위반 하나였고 그 구분이 없으면 다섯을 전부 고치려 들게 된다.

조치 — 예외의 기록과 검사 반영

예외를 SCHEMA.md 에 적고 이름 규칙으로 표시했다. temp_·code_·legacy_ 접두어가 붙으면 예외라는 것을 이름에서 알 수 있게 한 것이다.

검사 쿼리에서도 NOT LIKE 로 예외를 빼고 봤다. 빼지 않으면 매번 다섯 건이 나오고 그 상태가 이어지면 아무도 검사 결과를 안 본다. 상시로 붉은 검사는 꺼진 검사와 같다.

예외가 늘었을 때

몇 달 뒤 예외가 여덟이 됐다. 전체 테이블이 사십 개 남짓인데 여덟이면 2할 가까이다.

늘어난 셋을 보니 audit_log 와 sessions 와 cache 였고 전부 수명이 짧거나 시각이 이미 있는 것이었다. 예외의 성격이 우연히 겹치는 것이 아니라 한 방향을 가리키고 있었다.

판단 기준 — 목록 대신 조건

규칙을 다시 썼다. SCHEMA.md 에 목록을 나열하는 대신 조건으로 적었다.

자료가 오래 남고 언제 만들어졌는지가 필요한 테이블에
created_at, updated_at 을 둔다.

해당 없음
- 수명이 짧은 것 (temp_*, session, cache_*)
- 시각이 이미 있는 것 (stat_*, audit_log)
- 원본 유지 (legacy_*)
- 뷰

조건으로 쓰니 새 테이블이 생겨도 판단할 수 있다. 예외가 20%를 넘으면 규칙을 어기는 사람이 많은 것이 아니라 규칙의 조건이 잘못 잡힌 것이다.

새 테이블을 만들 때 판단하게도 했다. 전에는 만들고 나서 검사에 걸려 붙였는데 그때는 기존 자료의 시각을 알 수 없어 created_at 이 전부 같은 값이 됐다.

예외 표시의 남용

이름 규칙으로 예외를 표시하니 이름만 맞추면 예외가 되는 문제가 생겼다. temp_ 가 붙었지만 반년째 남아 있는 테이블이 있었다.

SELECT table_name, create_time FROM information_schema.tables
WHERE table_schema = 'app' AND table_name LIKE 'temp_%'
ORDER BY create_time;

MySQL 8.0 참조 매뉴얼의 information_schema TABLES 항목대로 CREATE_TIME 이 테이블 생성 시각이라 그것으로 만든 지 오래된 임시 테이블을 찾으니 셋이 있었다. 임시가 아닌 것은 이름을 바꾸고 규칙을 지키게 했다. 예외 표시가 회피 수단이 되지 않게 예외로 분류된 것들을 정기적으로 확인한다.

규칙이 없는 자리

예외를 정리하다 보니 규칙 자체가 없는 항목이 드러났다. 시각 컬럼과 기본 키 이름과 문자셋에는 규칙이 있는데 외래키를 걸지 여부와 소프트 삭제 방식과 인덱스 이름에는 없었다.

규칙이 없으니 테이블마다 달랐고 소프트 삭제만 del_yn·deleted_at·is_deleted 세 가지 형태로 되어 있었다.

del_yn      18 테이블
deleted_at   6 테이블
is_deleted   2 테이블

통일에는 두 가지 방법이 있었는데 전부 deleted_at 으로 옮기는 것과 가장 많은 del_yn 으로 새것부터 맞추는 것이다. 뒤쪽을 골랐다. 이유는 옛 테이블을 옮기면 그 컬럼을 읽는 코드를 전부 고쳐야 해서다. 대신 세 형태가 당분간 공존하는 것을 감수했다. 예외를 찾으러 들어갔다가 규칙이 없는 자리가 나온 셈이다.

정리


Share this post on:

Previous Post
정답이 하나인 일은 코드가 한다
Next Post
그 방식이면 멈추는 시간이 없었다