프로젝트 얘기 하나 해 볼까 합니다. 프로젝트는 이미 예전에 완료되었고 민간한 시기는 지난 것으로 판단을 하여 프로젝트 후기를 남겨 봅니다. 인천 국제 공항에 있는 주차장 관련 시스템에서 네트워크 관련 버그를 잡는 프로젝트였습니다.


e0055965_4ae6ca5ae315f.jpg 


인천 국제 공항에 있는 주차장은 국내에서 가장 큰 규모의 주차장이라고 합니다. 직접 가 보면 알겠지만 규모가 매우 큽니다. 차량들이 주차장에 출입을 하게 되면, 어느 게이트웨이를 통해서 차량이 안으로 들어 오거나, 혹은 밖으로 나가거나 했는지 그 모든 액션들에 대해서 로그(DB)로 남기고 원격으로 Notify를 해 줍니다. 주차장은 총 7개의 세션으로 나뉘고, 각 세션에서는 서버-클라이언트 방식으로 구현이 되어 있습니다. 그리고 7개의 세션을 관리하는 대빵 서버가 또 다시 존재합니다(네이밍은 제 마음대로 바꿨음 ^^). 간략히 도식을 그려 보면 다음과 같습니다. 연결은 전부 TCP/IP 기반입니다. 당연히 외부 인터넷이랑은 차단이 되어 있습니다.


대빵 서버 ---+--- 중간 1 서버 -------- 게이트웨이들

            |

            +--- 중간 2 서버 -------- 게이트웨이들

            |

            |               ...

            |

            +--- 중간 7 서버 -------- 게이트웨이들



img_parking.gif 


시스템의 전체 로직은 이미 잘 구축되어 있는 상황이었습니다. 예외 상황에 대한 로깅 시스템도 훌륭했고, watch dog 을 만들어 프로세스 상호 감시를 하는 부분도 이미 구현이 되어 있었고... 이러한 부분인 이미 연구소장님이라는 분이 잘 구축해 놓은 상태였습니다. 


문제는 대빵서버-중간서버, 중간서버-게이트웨이간의 통신이 가끔 가다가 먹통이 된다는 겁니다. 한번 먹통이 되면 차단기가 올바른 명령을 외부로부터 받을 수 없게 되죠. 중앙에서 단말기까지 차단기 개폐 명령을 내려 줘야 하는 경우, TCP/IP 통신이 안되면 차량들은 오도 가도 못하는 상황이 되고, 결국 관리자(인천 공항 소속)는 그 주차장까지 X빠지게 달려 가서 수작업으로 차단기를 올려 줘야 하는 상황이 발생하게 됩니다. 일주일에 한번 정도 이러한 문제가 반복되고 있던 상황.


옆에서 죽 지켜 보니까(저야 완전 별개 소속이나까 상관이 없었지만) 개발자들이 죽을 맛이더군요. 프로그램이 뻗어 버리는 문제때문에 하루에 한명씩 개발자가 남아서 차량 출입이 가장 적은 밤 시각에 프로그램 재실행을 해 줘야 했고, 회사는 개발에 대한 신용을 공항측으로부터 잃어 버린 생태였고("프로그램 제대로 못짜삼?" 이라는 은근한 압박도 보였음), 며칠동안 지켜 본 동안에도 프로그램 수정에 대해 계속해서 요구가 들어 오더군요. 한마디로 전형적인 SI 프로젝트였었죠. 참, 안타깝다는 생각도 들었고...


처음에는 국내 대기업(LG CNS)에 있는 사람으로부터 연락이 왔습니다. 그러다가 "담당자를 바꿔 드릴께요" 하면서 전화 돌리기를 몇번, 드디어 해당 시스템을 구축하고 실제 코딩까지 한 분과 통화를 하게 되었습니다. 프로젝트 계약 상황은 다음과 같습니다.


인천 공항(갑) --- LG CNS(을) -+- D회사(병) --- 나(정)

                              |

                              +- 네트워크 설비 구축회사(병. 어딘지 모름)


인천 공항으로 가서 전체 상황을 파악하였습니다. 해당 시스템의 실구축들 담당했었던 연구 소장님이랑 이런 저런 얘기를 나누었고, 관련된 프로그램 소스를 보면서 어느 부분에서 에러가 날까도 면밀히 살폈습니다. 특정 패킷(프로토콜과 관련된 특정 패킷)을 drop 시키는 별도의 프로그램을 만들어 stress test까지도 줘 보고, 에러가 날때마하 하나씩 하나씩 버그를 잡아 갔었죠. packet drop을 위해서는 ARP spoofing 기법을 사용했습니다. 클라이언트/서버 장비를 제가 직접 건드릴 수 있는 환경은 아니었기 때문이죠. 이 글을 읽는 모든 분들께, 특히 경찰관들에게 하고 싶은 말 " ARP spoofing이라고 무조건 나쁜 행위는 아니랍니다 ^^ "


실제 일을 진행했던 것(소스 코드 분석, stress test 프로그램 작성, 안정화 단계 테스트)은 전부 합쳐서 대략 5일 남짓 되었습니다. 제가 맡은 일은 프로그램이 뻗지 않도록 프로그램을 안정화만 하는 것이니까요. 결론적으로 제가 직접 소스 수정한 것은 단 한줄도 없고, 기존에 작성되어져 있던 코드에 "이부분, 저부분을 바꿔라"라는 식으로 말 몇마디한 것이 다입니다.


그런데, 실제 프로젝트 참여 기간이 얼마 되지도 않고 코딩 작업이 없다고 하더라도, "프로그램이 절대 죽으면 안되도록 안정화를 해야 한다"는 압박감은 실로 저에게 엄청나게 큰 부담감이었습니다. 어찌 보면 저의 실력의 검증이 이것(뻗느냐, 안뻗느냐 하는 true false로 판단나게 되는 결과)을 통해 판가름나기도 하는 것이었고, 그거 해 주고 돈 받는 거니까요. 프로그램이 뻗어 버릴 수 있는 모든 가능성을 차단하는 것이 저의 임무였습니다.


결국 버그를 알아 내었습니다. 문제의 요지는 스레드 프로그래밍에 있어서 객체 관리가 제대로 되지 않았던 것이었습니다. 이것때문에 Indy TCPServer 소스 내부까지 뒤벼 봤죠. 결국 우여곡절 끝에 프로그램이 수정이 되었고, 일주일동안 지켜 보았습니다. 다행이 프로그램 뻗어 버리는 현상은 없었고(1차 검수 완료), 1달동안 운영해 보면서 프로그램이 뻗어 버리지 않는 것을 프로젝트 완료 단계로 계약을 했구요, 그 이후로는 인천 공항에 가 본 적은 없었고 중간중간에 가끔씩 연구소장님이랑 통화하면서 프로젝트 진행에 대해 물어 보는 정도였습니다.


그러는 와중에 D회사 사장이 가끔씩 와서 개발 진척 상황에 대해 재촉을 하는 경우가 있었는데요, 오히려 개발 진행에 방해가 되더라구요. ㅎㅎ 다들 열심히 하고 있는데, 프로젝트 팀원들에게 개별적으로 하고 있는 일에 대해서 보고서 작성을 하라고 하는데, 그 일이 오히려 더 개발 진행을 방해하고 있는 겁니다. 사장도 그렇고 부사장도 그렇고 개발자들한테 직접 와서 프로젝트 진행을 종용하는 것은 뭐라 할 수 없지만, 그 행위 자체가 프로젝트 진행에 방해가 된다는 것 자체를 모르는 것 같더라구요. 회사 자체가 SW 중심이 아니라 HW(주차 관련 장비) 중심이었고, 사장은 SW에 대해서 잘 모르는 것 같았습니다. 가만히 있어 주는게 도와 주는 것. ^^


한달이 지났구요, 프로그램 뻗는 현상은 이제 없다고 결론이 났습니다. 그래서 또다시 돈달라고 전화했습니다. ㅋㅋ. 1시간쯤 뒤에 D회사 회계를 담당했었던 부장님으로부터 전화가 왔었습니다. 세금 계산과 관련된 몇가지 사항 얘기하고 나서 통장을 확인해 보니, 대번에 잔금 입금이 되더라구요. 돈 들어 오는 것을 직접 확인을 하게 되니 '참, 그 회사 사장이라는 분이 개발 일을 몰라도 너무 모르네' 라고 들던 생각이 '와, 이 회사는 돈 처리는 정말 깔끔하구나. 나중에 다시 일을 해 볼만한 회사네.' 라는 식으로 생각이 180도 바뀌는 겁니다. 사람이라는 것이 참 간사한 거죠.


좋은 회사란 무엇인가에 대한 개인적인 생각을 적어 봅니다.


1. 돈처리(직원들 월급 주기, 타 회사랑 돈거래)가 확실한 회사.


2. 직원들에게 좋은 경력을 쌓고, 실력을 높여 줄 수 있도록 하는 회사.


3. 좋은 비전을 제시해 줄 수 있는 회사.


4. 밝고 명량한 분위기의 회사.


5. 사회의 의무(nobless oblige)를 성실히 이행하는 회사.


등등이 있을 수 있겠는데요. 문제는 2~5번 조건을 아무리 좋은 회사라 하더라도 1번이 충족되지 않으면 말짱 도루묵이라는 겁니다. 제가 지금에 와서 아직도 회사를 만들지 않고 혼자 일을 하는 이유도 바로 이때문입니다. 매달 25일 월급날이 돌아 오는 것은 오너의 입장에서는 정말 죽을 맛입니다. 이는 경험해 보지 않은 사람은 모릅니다.


그리고 1번은 "사장이 개발을 알고 있어야 한다"라는 조건과는 별로 상관이 없습니다. 회사 사장이  개발자 출신인 경우에서 간혹 이를 간과하는 경우(지금은 비록 허접하지만, 앞으로 우리 회사는 좋을 거야. 그러니 조금만 참아 줘)가 많이 있죠.


암튼 본 프로젝트를 통해 제가 내린 결론은 다음과 같습니다.


1. 소스를 이렇게 고쳤더니 문제 해결이 되었다 정도에서 마무리하지 말고 확실한 원인 분석을 파악하라.


2. 느려도 돌아 가라. 그게 오히려 더 빠르다. 그리고 실력 증진에도 도움이 된다. 일정때문에 힘들다고? 남을 설득할 수 있도록 하는 커뮤니케이션도 능력이다.


3. 돈거래가 확실횐 회사랑 일을 하자(이번 D회사 같은). 그리고 계약서도 반드시 작성하라.


4. 자신이 잘 할 수 있는 일을 남들에게 계속해서 어필하라. 온라인&오프라인 상관 없이.


5. 인맥이 중요하다. 술먹는 일만이 인맥은 아니다.


6. 프로젝트 할 때 좋은 인간 관계를 유지하라. 하나의 프로젝트에서 한명만 좋은 사람으로 알게 되어도 그게 남는 거다.


ps : 


1. 제가 프로젝트를 끝날때까지 처음 연락이 되었던 LG CNS 담당자랑은 그 이후에 단 한번의 전화 통화도 없었습니다. 참, 씁쓸하죠. "과연 그들이 하는 일이 무엇인가" 라는 의문이 들 수 밖에 없습니다. 전형적인 갑을병정 시스템의 폐해죠. 하는 일도 없으면서 중간에서 돈 받아 쳐먹는 불합리한 구조. 하루 빨리 SW 분리 발주 제도가 정착이 되어야 할 것입니다.


2. 프로젝트 도중에 빌링(billing)과 관련된 타업체 담당자들을 만나 얘기를 한 적이 있었는데, 시스템이 뭐로 이루어 져 있느냐해서 Windows OS로 되어 있다니 '피식'하는 겁니다. "자기네들은 Unix로 되었다. Windows가 뭐냐? ㅋㅋ" 하는 뉘앙스를 받았죠. 순간 패 주고 싶었습니다. ㅎㅎ "빌링 프토토콜이나 똑바로 만들어라. 이게 뭐냐? MITM 공격 들어가 주시면 너네 회사 완전 폭삭 망한다" 얘기해 주고 싶었죠. ㅋㅋ