코드 조사를 다른 쪽에 맡겼는데 그 과정에서 데이터베이스를 조회했고 그것이 운영 데이터베이스였다. 중간에 발견해서 멈췄다.
Table of contents
Open Table of contents
이름이 만든 착각
데이터베이스 이름이 서비스 이름과 접미사 조합이라 별도로 떼어 낸 것처럼 보였다. 실제로는 운영 데이터베이스였고 이름에는 운영인지 개발인지가 적혀 있지 않았다.
확인해 보니 이름으로 판단할 근거가 하나도 없었다. 그런데 그럴듯해 보여서 확인 자체를 안 했다.
이름이 내용을 안 말하는 것들
이 일 뒤로 이름만 보고 판단하지 않을 것들을 정리했다. 데이터베이스 이름은 접미사가 붙었다고 별도가 아니고 개발을 뜻하는 접미사가 붙어도 운영일 수 있다.
일반적인 이름의 설정이 특정 용도 전용이었던 적이 있고 재사용했다가 격리돼 있던 것이 열릴 뻔했다. 내부 식별자처럼 보이는 컬럼에 외부 번호가 들어 있었고 끝을 뜻하는 이름의 상태값이 실제로는 진행 중을 뜻해서 부정 조건이 정반대로 동작했다. 허용되지 않는 문자라고 적힌 필드가 실제로는 허용 목록이었던 경우도 있었다.
이름 대신 보는 것
이름 대신 무엇을 보는지도 정리했다. 데이터베이스가 운영인지는 접속 정보와 데이터 규모와 최근 갱신 시각으로 보고 설정의 용도는 그것을 실제로 참조하는 코드로 본다.
컬럼이 무엇을 담는지는 실제 값 몇 개를 조회해서 보고 상태값의 의미는 그 값을 세팅하는 코드로 본다. 공통점은 이름이 아니라 실체를 본다는 것이고 대부분 조회 한 번이면 되는 것들이다.
맡길 것과 직접 할 것
이 일에는 다른 측면이 하나 더 있었다. 조사를 맡기면 진행 중에 무엇을 하고 있는지 볼 수 없고 끝난 뒤에 결과만 받는다.
읽기만 하는 작업이라고 생각했지만 그 안에서 어디를 읽을지는 맡은 쪽이 정하므로 위험한 대상을 읽어도 중간에 막을 방법이 없다. 그래서 결과만 받으면 되고 중간에 위험한 것이 없는 작업은 맡기고 실행 대상이 정해지지 않은 조사와 데이터베이스나 외부 시스템에 접근하는 것은 직접 한다.
읽기의 위험
조회만 하니 안전하다는 생각도 틀렸다. 인덱스 없는 컬럼으로 수억 행을 훑으면 다른 요청이 전부 대기에 걸려 데이터베이스가 멈추는 것을 실제로 겪었다.
배치가 도는 시간에 무거운 조회를 넣으면 그것과 경합하고 조회 결과에 자격증명이 섞이면 그것이 기록으로 남는다. 그래서 읽기도 실행 계획을 먼저 보고 범위를 좁히며 값이 노출될 만한 컬럼은 빼고 조회한다.
정리
- 이름이 내용을 말해 주지 않는다
- 데이터베이스와 설정과 컬럼과 상태값이 전부 그렇다
- 이름 대신 실체를 확인하고 대개 조회 한 번이면 된다
- 조사를 맡기면 진행 중에 볼 수 없다
- 실행 대상이 정해지지 않은 조사는 직접 한다
- 읽기도 안전하지 않다
- 큰 조회는 데이터베이스를 멈춘다
- 결과에 민감한 값이 섞일 수 있으니 컬럼을 골라 조회한다