카운터 스트라이크 온라인 팀에서 클라이언트를 담당하고 있는 5년차 프로그래머입니다.<br/>자그만 SI 회사와 이스트소프트 알약 부문에서 근무한 적이 있습니다.<br/>소프트웨어 공학에 관심이 많으며 프로그래밍에 심리적인 요소가 큰 영향을 끼친다고 생각하고 있습니다.
테스트 주도 개발(Test Driven Development, 이하 TDD)에 관심을 가지고 시도해 보았으나, 기대와는 달리 어렵고 고통스러운 경험을 하게 되었습니다. <br/>이 세션에서는 이런 실패 경험들을 공유하고 헤쳐나갈 수 있는 방법을 제시합니다.<br/>많은 한국의 게임 프로그래머가 Windows, C++, Visual Studio를 가지고 프로그래밍을 합니다. <br/>이 환경 하에서 TDD를 하려고 시도했을 때 겪게 될 문제들이 있습니다.<br style='line-height:240%'/>1. 표준적인 TDD 도구가 없습니다. TDD에 대한 책을 보면 대부분 Java+Eclipse 환경이라는 것을 알 수 있습니다. <br/>JUnit이라는 테스트 프레임워크가 Java쪽에서는 사실상 산업 표준으로 자리잡아 쓰이고 있으며 대부분의 책에서도 이것을 사용합니다. <br/>C++ 프로그래머는 TDD에 대한 책을 보고 공부하더라도 정작 TDD를 지원해 줄 마땅한 테스팅 프레임워크를 알지 못해 방황할 가능성이 높습니다.<br/>2. 위 1번 문제에서 연장되는 문제로, 일명 빨간 막대-녹색 막대라는 것을 보고 느끼기 힘듭니다. <br/>Eclipse에서는 JUnit과 함께 배포되는 Add-in으로 시각적인 피드백을 받을 수 있지만 Visual Studio에서는 이런 시각적 피드백을 줄 수 있는 잘 알려진 도구가 없습니다.<br/>3. API 호출을 가짜 객체(Mock Object) 호출로 바꿔치기가 까다롭습니다. <br/>C++과 Windows의 수많은 API들은 전형적인 C Native 스타일의 함수로 이루어져 있습니다. <br/>Java의 경우 대부분의 API들이 클래스로 만들어져 있어 이것을 가짜 객체(Mock Object)로 바꿔져 API 호출부를 테스트 환경에서 자신이 원하는 대로 조작하는 작업이 수월합니다. <br/>반면 C++에서는 함수 호출부를 클래스로 랩핑을 하고 인터페이스를 추출해내야 하는데다가 Mock Object를 만들어 줄 도구가 따로 구해야 합니다.<br/>4. 신규 프로젝트가 아니라 이미 소스 코드가 존재하는 라이브 프로젝트에서 TDD를 하려고 하면 레거시 코드의 엄청난 종속성때문에 객체를 생성하는 것 조차 어렵습니다. <br/>메소드 하나만 호출해도 거기에 딸려있는 수많은 API 호출들이 연쇄적으로 일어나기 때문에 <br/>5. TDD를 하다 보면 종속성 주입(Dependency Injection)이라는 것을 하게 됩니다. <br/>이렇게 되면 클래스가 계층적으로 존재하는 경우 주입해줘야 할 가짜 객체의 양이 크게 늘어나게 되고 <br/>결국 실제 코드와 테스트 코드를 만드는 것이 어려워지게 됩니다.<br/>이런 문제 때문에 TDD를 어렵게 느끼거나 중도에 포기하게 될 수 있습니다. <br style='line-height:240%'/>이 세션에서는 위와 같은 문제들 때문에 TDD를 하기 어려움을 인지시키고 해결책을 제시합니다.<br style='line-height:240%'/>각각 다음을 제시합니다: <br/>1. GoogleTestingFramework (줄여서 GoogleTest) 소개 <br/>2. 직접 Addin 만들기 또는 본인이 만든 Addin 소스 공개 <br/>3. GoogleMock 소개 <br/>4. 종속성 끊는 요령 <br/>5. Factory로 해결해보기
본 홈페이지에 게재, 공개된 발표자료, 동영상, 이미지, 스크립트 등 일체의 저작물(이하 “저작물”이라 합니다)에 대한 저작권 (2차적저작물작성권 및 편집저작물작성권 포함)은 해당 저작물의 저작자(발표자 포함) 또는 (주)넥슨코리아 (이하 “권리자”라 합니다)에게 귀속되며, 권리자의 허락 없이 이를 상업적으로 이용하거나 무단으로 도용, 편집, 2차적저작물을 작성, 공중송신, 배포할 수 없습니다.
다만, 저작물을 개인 블로그, 페이스북 등 SNS에 게재하길 원하시는 경우에는 반드시 권리자명 및 본 홈페이지를 출처로 명시하여야 하고, 해당 저작물을 변형시키지 않는 전제 하에서 게재하실 수 있습니다.
또한, 저작자(발표자 포함)의 의도가 손상되지 않도록 하여야 하며, 어떠한 경우에도 저작자(발표자 포함)의 저작인격권을 훼손하여서는 안됩니다.
이상의 내용을 위반하여 발생하는 모든 민, 형사상의 법적 책임은 전적으로 본인에게 있음을 양지하여 주시기 바랍니다.