- 언어 : PHP
- 파트너 : 직장동료
- 드라이버 : Benghun
- 구현과제 : 데이타베이스 클래스(Database.inc)
참고사항 : 몇몇 함수에 대해서만 TDD를 적용시켰다.
나는 .NET의 System.Data의 구조를 보고 즉시 PHP에 적용시키고 싶어졌다. ASP.NET에는
SqlConnection ,
OdbcConnection ,
OleDbConnection을 제공해 준다. 이 클래스들을 잘 사용하면
DataTier의 종류가 바뀌어도 코드의 수정을 최소화 시킬 수 있다. PHP는 여러가지 종류의 데이타베이스 관련함수를 제공해준다. 어떠한 데이타베이스를 사용하느냐에 따라 동일한 기능을 하는 다른 이름의 함수를 호출해야만 한다.
IConnection을 이용해 각각의 Connection에 대해 단일의 인터페이스를 제공하고
IConnection을 구현하는
MySqlConnection ,
SqlConnection ,
OciConnection을 만들자는 것이 나의 생각이었다. 파트너는 switch구문을 이용해 클래스의 상속 구조를 없애는 것과 비교해서 어떠한 이점이 있는가에 대해 질문했다. 이것은 장시간의 토론으로 이어졌다.
나의 생각은 다음과 같았다.
~cpp
class IConnection
{
function Connect(){}
function Execute(){}
function Close(){}
...
}
class OdbcConnection : IConnection
{
function Connect(){ odbc_connect(); }
function Execute(){ odbc_do(); }
function Close(){ odbc_close(); }
}
class MySqlConnection : IConnection
{
function Connect(){ mysql_connect(); }
function Execute(){ mysql_query(); }
function Close(){ mysql_close(); }
}
파트너의 생각은 다음과 같았다.
하나의 클래스를 구현하고 구현된 하나의 클래스에서 switch로 호출되어야 하는 함수를 결정하면 된다는 것이었다.
~cpp
class Connection
{
function Connect()
{
switch(UsingDatabase){
case Odbc: odbc_connect();
case MySql: mysql_connect();
...
}
}
function Execute()
{
swtich(UsingDatabase){
case Odbc: odbc_do();
case MySql: mysql_query();
...
}
}
}
나는 일차적으로 switch코드를 없앨 수 있다는 점을 설명했다. 우리는 Connection클래스가 그다지 크게 바뀌지 않을 것이라는 것에 대해 동의했었고 이 점을 근거로 switch를 사용하는 것이 유지보수를 힘들게 하는가에 대해 질문했다. 솔직히 이정도 코드라면 누구나 수정할 수 있을 것이라고 생각한다. 그리고 그렇게 많은 시간을 필요로 하는 작업도 아니라고 생각한다. 파트너는 Connection을 생성하는 부분을 include 화일로 관리하고 그곳에 한번만 define문을 작성하면 문제가 없다고 주장했다.
~cpp
// in GetConnectionObject.inc file
define("UsingDatabase", Odbc);
function GetConnectionObject()
{
return new Connection();
}
나는 이에 대해 하나의 프로젝트에서 여러개의 데이타베이스를 사용하게 될 경우 여러개의 추가적인 파일들을 관리해야 될지도 모른다고 했다. 그리고 new
SqlConnection(); , new
MySqlConnection()과 같은 방식으로 사용하는 것이 더 직관적인 것 같다고 설명했다.
추가적으로 토론했던 사항 : Connection 클래스의 생성자에 매개변수로 데이타베이스 타입을 넘겨주면 된다는 것과 파생된 클래스를 생성하는 것
긴 토론 끝에 파트너는 나의 의견에 동의했지만 만약 계속 이런 속도로 작업이 진행된다면 회사에서 가만있지 않을 것이다. (어제도 TDD를 사용했었는데 기존의 코딩시간에 비해 3배정도 더 늦어졌다. 그리고 다 끝내지도 못했고 무엇을 먼저 테스트 해야할지 갈팡질팡했었다. 처음부터 함수단위 테스트만 시도해야겠다는 생각이 원인같다.)
PP의 장점은 토론을 많이할 수 있다는 것(의사소통 + 지식공유?)과 집중력이 높아진다는 것이었다. 처음이라 그런지 코딩시간보다 토론시간이 더 길었다. 기존의 방식대로 혼자 코딩하면 PP를 하는 것 보다 더 많은 코드를 생산할 수 있었다. PP에 익숙해지고 서로의 의견차이를 줄이면 점점 생산속도가 나아지리라 예상해 본다.