• [회사얘기] 회사탐정 울프맨- 범인은 이안에있어!!2014.06.15 PM 11:55

게시물 주소 FONT글자 작게하기 글자 키우기

[이미 지난번에 올린 이야기지만 너무나 간략하게 써서 많은 분들이 이해를 못하신 관계로 소설형식으로 새로 정리해 봅니다. 글연습도 할겸사겸사]




그것은 어느 평화로운 오후의 일이었다.

평소처럼 전화와 회사일에 치여있던 나는, 팀장님으로부터 한가지 특별한 요청을 받았다.
바로 지긋지긋하기 짝이 없는 고객사 재고집계 금액을 검증하는 일이었는데, 이게 참 귀찮고 머리 아픈일이라 가능하면 마다하고 싶은 일이었다.

물론, 가능하다면을 전제로 붙였다는 것은 불가능한게 당연하다는 사실인 고로 나는 드러나지 않게 투덜거리며 지저분한 서류로 범벅이 되어 있는 나의 책상에 앉아 서류들을 한켠으로 밀어넣고 DB 프로그램을 가동 시켰다.

팀장님이 지시한 일은 간단했다.
지난번 있었던 핵폭탄급 사건(http://mypi.ruliweb.daum.net/mypi.htm?id=snakehand&num=10389 을 비롯한 3시리즈 참고)을 해결한 이후에도 데이터가 미묘하게 맞지 않는 부분이 있었기에 이를 완벽하게 검증하라는 것이었다.

당시에 나는 절대 변경되어선 안될 2011,2012,2013년도 데이터가 틀어진 사실을 보고선 이것이 우리 회사에서 진행하던 신 마감 프로젝트의 영향으로 고객사 금액 전체가 크게 변동이 되었던걸 파악했고, 이를 수정한 바가 있었다.

그런데 그럼에도 맞지 않는 부분이 있다니 그건 대체 뭘까.... 거기다 이전부터 파악하지 못한 금액 -4천만원의 버그도 있어 부족한 성능보다 더욱 많은 짐을 떠맡은 내 머리는 또다시 욱신거리기 시작했다.

'시8아주 신나는구먼 그냥'

일단 원인을 파악하기에 앞서서 가장 간단하게 파악할 수 있는 방법은 신 마감을 다시 가동해 보는 것이었기에 나는 다른 곳에 서버를 복사해놓고 신 마감을 가동하기 위한 준비를 시작했다.

그리고 메뉴얼을 보면서 신 마감을 가동시키기 시작했는데, 신 마감은 간단하게 데이터베이스의 한부분만 살짝 고치면 되는 그런 부분이었다.

여기서 우리 데이터베이스가 어떤 구조로 되어있는지 간단하게 설명하자면 두개의 구조로 되어있다고 보면 되는데, 머리와 몸통으로 비유할 수 있다.

머리는 데이터의 상태와 형태를 기록하고, 몸통은 수량과 금액 등 세세한 부분이 기록된다.

그런데 여기서 잠금장치 설정을 둘다 'ON'으로 해놓으면 여대리님이 짜놓은 자동장치가 가동되서 금액의 새로운 계산이 이루어지는 것이었다.

작업은 순조로웠다. 어떤 사고가 터지기 전까지는....

머리 부분의 잠금장치를 업데이트 하고, 이어서 몸통의 잠금장치를 찾았는데 에러 메세지가 발생했다.

[찾는 컬럼은 잘못되었습니다.]

순간 어? 하고 고개를 갸웃 거렸다. 몸통에는 잠금장치가 없다는 메세지인 것이다.

즉, 머리부분의 잠금장치로 몸통까지 컨트롤 한다는 얘기였다.

여기까지는 대수롭지 않게 넘어갈 수 있는 그런 부분이었는데 내 머릿속을 스치는 의혹은 따로 있었다.

'금액은 분명히 몸통에서 관리해! 머리가 아니란말야. 근데 머리만 잠갔는데 어떻게 금액 차이가 발생해서 지난번 핵폭발급 사고가 일어난거지?????????????????'


머리는 금액을 관리하지 않는다. 머리를 건드렸는데 금액이 사라졌다는건 이건 마치
생각만 했는데 통장에서 돈이 빠져나가는 그런 경우나 마찬가지였다.

그렇다면 방법은 단 한가지.
머리에서 금액을 관리하는 코드가 있었다는 것 뿐.

거기까지 생각이 미치자 비로소 나는 그동안 아무리 애를써도 찾지 못했던 -4천만원 금액의 버그의 원인에까지 생각이 미쳤다.

-4천만원 버그는 오래전부터 나를 괴롭히고 있던 문제였다.

금액을 관리하는 몸통에는 원금액을 달러로 치환하는 기능이 있었는데, 이것이 동작하지 않아 -4천만원 금액 손실이 발생했고 이에 대한 재발방지가 필요한 상황이었다.
그런데, 몸통의 계산식에는 분명 치환하는 기능이 있었으며, 어떠한 방법으로 프로그램을 사용해도 치환기능은 정상적으로 동작했다.
그렇다면, 고객이 프로그램을 사용한게 아니라 프로그래머가 DB로 직접 입력을 했다는 이야기가 되는데, 이 역시 문제가 있는게 몸통에 프로그래머가 직접 간섭을 해도, 사용이력은 남게 된다. 이는 조작으로 할 수 있는 범위가 아니다.

따라서 몸통의 이력을 보면 누군가가 고쳤는지 알 수 있다. 라는 생각에 몸통을 살펴봤지만, 이력은 남아있지 않았던 것이다.

그럼 마지막으로 금액집계 데이터에 몸통 DB를 통하지 않고 직접 간섭을 했다는 이야기인데,
그렇게 된다면 우리는 사원끼리 서로 의심을 해야하는 상황이었다.

물론 당연히 의심을 했고, 서로 작업 내역을 살펴봤지만 그런 짓을 할 사람은 아무도 없었다.

우선 나부터 내가 뭘 했는지 아는 상황이고, 신입사원 두명은 그런 정교한 일을 하기엔 모르는게 너무나 많았다.
나와 같은 베테랑인 여대리는 다른 프로젝트에 투입되어 정신이 없었기 때문에 구태여 공을들여 그런일을 할 필요도 없었다.

따라서 내부에서 범인도 존재하지 않고, 외부에서 고객이 수정한 것도 아닌데 데이터가 저절로 바뀐 이상한 현상에 나는 이럴때마다 편리하게 찾는 [프로그램의 귀신]이 저질렀다 라고 속으로만 생각하고 있었다.
(입밖에 냈다간 뭐............... 뻔하지 않은가? 구박받게 얻을게 없다는걸)



그런데 지금. 그 퍼즐 조각이 맞춰지려 하고 있었다.

아무리 찾아도 알 수 없는 몸통의 이력.
그럼에도 변한 금액.

금액을 관리하지 않는 머리.
잠금장치가 없는 몸통.
그런데 변해버린 금액.


'설마... 머리에 직접 금액을 관리하는 코드가 있었단 말인가?!?!'

나는 물통을 열고 두어모금 입에 물고 가글을 하곤 물을 삼켰다.
그리고 떨리는 손으로 마우스를 잡고, 머리 DB에 접근해서 관리 코드를 열었다.
신중하게 한줄 한줄 내려가며 코드를 살폈고, 결국 발견하고야 말았다.

"팀장님!"

좀처럼 큰소리가 나지 않는 사무실이었지만, 내가 크게 외치는 소리에 분주하게 일하던 사원들이 모두 나를 쳐다보았다.
그러나 그러거나 말거나 나는 개의치 않았다.
지난 한 주동안 그토록 나를 괴롭히던 수수께끼가 드디어 풀리는 순간이었다.

"뭔데? 울대리?"

파티션 너머로 팀장님의 얼굴이 해처럼 솟아나왔다.

"드디어 찾아내고야 말았습니다."

앞뒤 없는 영문모를 말이었지만 팀장님은 아무말 없이 나를 바라보고만 있었다.
계속 말해보라는 뜻이었다.

"지난번에 금액 마이너스 4천만원의 문제가 있었지 않습니까? 그때 우린 아무리 애를 써도 원인을 찾지 못했죠."

"그래서?"

"생각해 보세요. 팀장님. 몸통을 바꿨다면 몸통의 이력이 남습니다. 그러나 몸통에는 이력이 없어요."

"응. 그렇지?"

"이번 마감 대란은 마감을 해서 금액이 바뀌었습니다. 그런데 몸통에는 마감 코드가 없어요."

"!"

팀장님은 눈을 크게 뜨고 나를 응시했다. 그리고 특유의 나긋함이 사라지고 초조한 목소리로 말했다.

"정리해봐 울대리."

"마감 코드는 머리에만 있었다는 겁니다! 그런데 머리만 바뀌었는데 금액이 바뀌었어요. 이게 무엇을 의미 할까요!"

"그 말은......"

"머리에 금액 간섭 코드가 있었다는 겁니다! 그러니까 우리가 백날 몸통을 뒤져봐야 아무것도 안나왔던 거죠!!!!!
그리고 고객은 분명히 머리 부분만 프로그램으로 수정했고, 그게 반영됐던 겁니다!! 머리 이력을 보면 확실히 알 수 있을 겁니다!!!"

팀장님은 자리를 박차고 일어났다.
그리고는 내 자리까지 서둘러 걸어와서는 나를 자리에 앉히며 지시했다.

"당장 확인해봐 어서!"

나는 두말하지 않고 자리에 앉아 머리의 이력을 확인했고, 전율했다.


"팀장님......... 있습니다. 있어요. 있다구요..... 이력이... 있습니다!!!!!!!!!!"

"우와아아아!!!!!!!!!!!!!!!!!!!!!!!!"

그동안 찾지 못했던 문제를 찾아낸 기쁨. 왜 진작 거길 생각하지 못했을까에 대한 아쉬움. 이 모든 감정이 폭포수처럼 터져나온 팀장님은 우왁 하는 탄성을 토해냈다.

나 역시 차마 입박으로는 내지 못하는 궁극의 감탄사인 숫자 18을 속으로 무수히 반복하며 온몸에 기운이 쭉 빠지는 것을 느꼈다.


오늘도 이렇게 한가지 문제를 해결하고야 말았다.
댓글 : 5 개
교훈1 : 모든 의심나는 것은 다 돌아보자~
교훈2 : 내부의 적이 진짜 적이다.
교훈3 : 항상 아니겠지 하는 게 대부분 맞더라~
그럼 원인은 고객이 머리부분을 수정해서 발생했단 이야긴가요?=ㅂ=

그렇다면 더 빡칠듯 ㅋㅋㅋㅋ
빠뜨린 부분입니다만, 몸통에는 달러로 수정 기능이 있는데 머리엔 없었던게 문제였던거죠 결국.
그래서 그부분을 보완하게 되었습니다.
누구의 잘못도 아니고 미처 생각지도 못한 부분이 있었다는게 문제였던 거죠 ㅎㅎ
음.. 제가 제대로 파악한 건지 모르겠지만, 결국은 설계 단계에서 문제가 있었던 게 맞는 건가요 ? -_-;;
결국 그런 것이죠.
친구글 비밀글 댓글 쓰기

user error : Error. B.