Skip to content
isdnetworks
Go back

한 번도 채워진 적 없는 컬럼

기능을 만들다가 필요한 값이 이미 테이블에 있는 것을 봤는데 이름과 주석이 용도에 맞았다. 그대로 쓰려다가 실제로 값이 들어 있는지를 먼저 세어 봤다.

Table of contents

Open Table of contents

값의 존재와 참조 코드

전체 행 수와 그 컬럼의 값이 있는 행 수를 같이 세니 뒤쪽이 하나도 없었다. 만들어 놓고 구현이 안 됐거나 쓰다가 뺐다는 뜻이다.

코드에서도 찾아보니 모델의 대입 허용 목록에만 이름이 있고 읽거나 쓰는 자리가 없었다. 데이터와 코드 양쪽에서 비어 있으면 그 컬럼은 스키마에만 남아 있는 것이다.

이름이 맞아도 새로 만든 이유

용도가 맞으니 그냥 쓸까 했지만 두 가지가 걸렸다. 원래 의도를 모르므로 나중에 그 용도로 쓰려는 사람이 나타날 수 있다는 것이 첫째였다.

둘째는 길이와 타입이 내 용도 기준이 아니라 원래 용도 기준으로 정해졌다는 것이었다. 그래서 이름을 내 용도에 맞춘 새 컬럼을 만들고 기존 컬럼은 건드리지 않고 뒀다.

죽은 컬럼을 세는 쿼리

같은 방식으로 다른 테이블도 훑을 수 있어서 전체 행 수와 각 컬럼의 값 있는 행 수를 함께 세는 쿼리를 만들었다. 돌려 보니 전부 비어 있는 것과 전부 같은 기본값인 것과 특정 시기 이후로 안 채워지는 것 세 종류가 나왔다.

세 번째가 특히 쓸모가 있었는데 값이 있는 행의 마지막 생성 시각을 보면 언제부터 안 쓰는지가 나온다. 그 시점을 알면 그 무렵에 무슨 변경이 있었는지를 이력에서 찾을 수 있다.

지우지 않고 목록으로 두는 이유

죽은 컬럼을 지우고 싶었지만 지우는 쪽이 위험했다. 전체 컬럼을 조회하는 코드가 있으면 영향을 받고 외부 시스템이 그 컬럼을 읽고 있을 수도 있다.

되돌리려면 데이터를 복원해야 하는데 그 데이터가 없다는 것도 이유였다. 그래서 컬럼마다 판정 근거를 붙인 목록으로 만들어 두고 지울 때가 오면 그 목록부터 다시 확인하기로 했다.

주석이 뜻하는 시점

이 일에서 남은 것은 컬럼 주석이 만들 때의 의도이지 지금 쓰인다는 뜻이 아니라는 점이다. 주석이 그럴듯할수록 오히려 그렇게 읽히기 쉽다.

동기화 토큰이라고 적혀 있으면 동기화에 쓰인다고 읽게 되는데 그것은 이름과 주석이 만든 인상일 뿐이다. 쓰이는지는 값이 채워져 있는지와 읽고 쓰는 코드가 있는지 둘로 확인한다.

정리


Share this post on:

Previous Post
후처리를 어디에 넣나
Next Post
돌아가는 서비스의 컬럼을 암호화하며 정한 순서