2014년 5월 5일 월요일

Debug나 Log출력은 on/off 할 수 있어야 한다



프로그래머 직원하나가 열심히 문제 있다고 풀고 있었다. 다른 직원이 작성한 코드였는데 뭐 이렇게 알아보기 어렵게 썼냐고 욕도 해가면서. 그래서 같이 검토해 보니까 과연 코드가 이해하기 어렵게 작성되어 있었다. 이런 코드를 써 놓고 프로그램을 했다고 하니 한심하다는 생각이 든다. 가뜩이나 이해하기 힘든 코드인데 최종적으로 나온 결과가 잘못되어 있었다. 직원이 코드를 들여다보면서 여기저기 고쳐 보고 있었다. 그런 식으로 하면 한도 끝도 없이 걸릴 것 같아 여기저기서 중간에 진행되는 모든 과정을 출력을 하라고 하였다. 그랬더니 금방 무슨 문제가 있는지 찾을 수 있었고 수정해서 해결하였다.



이렇게 당연한 얘기를 뭐하러 하는가? 그런데 수정 후에 추가했던 출력문장을 다시 지우는 것이었다. 쓸데없이 출력하면 안된다고. 역시 지당한 말이다. 그래서 물었다. 나중에 또 문제 생겨서 다른 사람이 보게되면 어떻게 할 거냐고? 똑 같은 고생을 다시 해야 하냐고?  진퇴양난이다. 쓸데 없이 항상 출력할 수도 없고  지워버릴 수도 없고. 궁여지책으로 그냥 주석으로 처리하자고 한다. 필요하면 나중에 다시 간단하게 살릴 수 있으니까. 이게 보통 생각하는 방법이다.



더 좋은 방법이 없을까? 위에서와 같이 프로그램을 하다 보면 여기저기서 정보를 출력해서 보기 위해 Debug 문장을 사용하게 된다. 간단한 예로 name이라는 변수에 뭐가 들었는지 보고 싶다. Java에서는 다음과 같다.



System.out.println (“이름 = “ + name);



자기 코드를 개발하는 중에는 이런 코드을 일시적으로 사용했다가 다 끝난 다음에 지우면 된다. 그런데 그런 일시적인 목적이 아니고 나중에도 문제가 생기면 쉽게 문제점을 파악 할 수 있는 출력코드가 여기저기에 필요하게 된다. 이 예제코드는 터미날에 출력되지만 로그파일로 출력도 필요하다. 출력하는 코드는 어떤 프로그램을 막론하고 꼭 필요하다. 아무리 쉬운 프로그램이라도 미래를 위해서 꼭 있어야 한다. 또 고객사이트에서 무슨 일이 벌어졌는지를 알아내기 위한 로그를 얻기 위해서라도 꼭 필요하다. 마이크로소프트의 인터넷 탐색기가 오류로 죽을 때도 꼭 물어보지 않던가? 오류정보를 마이크로소프트로 전송하기를 원하는지? 나는 꼭 “아니오”에 답한다. 인터넷으로 데이터전송 해야 하니 전용선속도 저하될 수도 있고  내 정보 노출될 수도 있고 또 마이크로소프트의 근본적인 폐쇄전략도 싫어하기 때문이다. 이런 식으로 고객사이트에서 데이터를 받을 수 있는 장치가 없으면 문제가 있을 때 원인파악이 어렵다. 전화로 오류 보고받고 추측해서 고치기는 어렵다.



다시 우리 문제로 돌아와서 그러면 어떻게 해야 하는가? 이러한 출력코드는 운영체계에 많은 부하를 준다는 것이다. 또 쓸데 없이 너무 많은 로그를 출력해 디스크공간을 점유할 수도 있고. 특히 출력은 성능이 요구되는 시스템에서는 꼭 필요한 경우 외에는 사용하지 않는 것이 좋다. 이 모든 문제를 풀기 위해서는 다음과 같은 코드를 사용해야 한다.



Debug.DB.println (“이름 = “ + name);



Debug 란 class에서 하는 일은 아래의 구성 파일에서 “DB”라고 명칭 붙은 변수를 읽어 Debug를 작동시키는가를 결정한다. 터미날 뿐만 아니라 정해진 로그파일에 같은 정보를 동시에 수록한다. 나중에 필요하면 고객에게 그 로그파일을 보내달라고 요청하면 된다.



구성 파일은 다음과 같다.

Debug=on

DB=on

UI=off

……….



DB나 UI는 한 예로써 DB관련된 부분을 출력하고 싶은 경우에는 DB=on으로 하면 되고 UI관련부분을 출력하고 싶은 경우에는 UI=on으로 하면 된다. 각자 다른 콤포넌트와는 별개로 켰다 껐다 할 수 있다. 이 같은 방식에 의해 언제든지 원하는 부분의 정보를 추적해서 쉽게 문제를 파악할 수 있다. 소프트웨어에서는 문제를 발견하는데 90%의 노력이 들어가고 고치는데 10%의 노력이 들어간다. 더 중요한 부분에서 쉽게 해결할 수 있는 장치가 꼭 필요한 것이다. Debug 소스코드는 간단하지만 막상 코딩하려고 하면 쉽지는 않다. 다음에 기회있으면 소스코드를 제공하기로 하자.

댓글 없음: