저는 네트워크 라이브러리로 Indy, 인디를 주로 사용하는데.. 물론 경우에 따라 간혹 다른 라이브러리를 사용하는 때도 있습니다만, 델파이/C++빌더에 디폴트로 깔려 있으니 별도로 관리를 해줄 필요가 없고 또 기본적인 사용에 인디로 충분하다는 이유로 인디를 주로 씁니다.
델파이/C++빌더에 번들된 인디의 버전에 대한 더 자세한 내용은 다음 글을 참고하시고..
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=488
어쨌든, 델파이 2005 이후부터는 인디 9과 인디 10 버전이 항상 같이 번들되고 있었는데요. 그래서 개발자가 기본 설치된 인디의 두가지 버전들 중에서 선호하는 하나를 선택해서 사용할 수 있었습니다. 제 기억으로는 2006 버전까지는 IDE 설치 과정에서 인디 9과 10 중에서 어느 버전을 기본으로 선택할 것인가를 물어봤었기 때문에 간단했습니다만, 2007에서는 무조건 인디 10을 기본으로 설치해버리고 9 버전을 사용하려면 수동으로 인디 10 버전을 등록 해제하고 9 버전을 직접 등록해줘야 했습니다. 그래도 별 문제는 없었죠.
그런데... 2009 버전에선 인디 9 버전을 사용하는 데 좀 문제가 생겼습니다. 첫번째로, 인디 9의 소스와 컴파일된 bpl은 제공이 되는데, 그 외에 필요한 dcu, dcp, hpp 파일들이 전혀 설치되지 않습니다. (재밌게도, hpp는 없는데 lib 파일은 있습니다) 이건 제가 지금 여전히 테스트하고 있는 델파이/C++빌더 2009의 필드 테스트 버전에서만 코드기어측의 실수로 빼먹은 건지도 모르겠습니다. 어쨌든, 이거야 뭐 소스는 있으니까 소스와 함께 있는 패키지를 컴파일해서 만들어서 해당 디렉토리에 넣으면 간단히 해결됩니다.
두번째 문제는 좀 더 성가신 문제입니다. 전에도 알려드렸던 것처럼, 델파이/C++빌더 2009에서는 DataSnap(MIDAS)이 대폭 강화되어 kbmMW와 비슷한 형태의 본격적인 3티어 프레임워크로 대변신을 했는데요. 개인적으로 대환영이고, 아직은 kbmMW보다 기능적으로 좀 부족한 면이 있어서 지금 당장은 제 업무 개발 프레임워크에 도입할 생각은 없습니다만, 지금보다 더 개선되면 반드시 도입할 예정입니다.
그런데 이 강화된 데이터스냅(DataSnap 2009라고 부르더군요)에서, kbmMW처럼 트랜스포트 부분을 별도의 컴포넌트로 모듈화한 것은 아주 좋았는데, 문제는 kbmMW에서는 트랜스포트 라이브러리로 Indy9, Indy10, Synapse, DXSock, Nexus 등등 다양한 네트워크 컴포넌트를 사용할 수 있었는데 비해, DataSnap 2009에서는 단 하나, Indy10만을 사용한다는 것입니다. 이건 아마도 앞으로 트랜스포트 모듈이 더 추가되거나 개발자가 직접 개발할 수 있도록 하는 지침이 나오지 않을까 싶은데.. 적어도 당장은 인디10 뿐입니다.
이 인디10 트랜스포트 모듈의 이름은 DataSnapIndy10ServerTransport120.bpl이고, 이 파일에 해당하는 IDE 디자인타임 패키지는 dclDataSnapIndy10ServerTransport120.bpl입니다. 따라서 델파이/C++빌더 2009 IDE에서는 이 dclDataSnapIndy10ServerTransport120.bpl 패키지가 기본적으로 등록이 되어 있어서 IDE가 기동될 때 이 디자인패키지를 로드하려고 시도합니다.
그런데 디자인타임 패키지는 당연하게도 해당 런타임 패키지에 대해 dll 의존성을 가지고 있기 때문에, IDE가 디자인타임 패키지를 로드하려고 시도한 다음 순간 런타임 패키지인 DataSnapIndy10ServerTransport120.bpl을 로드하려고 시도하지요. 그런데 이 런타임 패키지는 인디10을 내부 네트워크 기능으로 이용하기 때문에, 다시 Indy10의 bpl들, 즉 IndyCore120.bpl, IndySystem120.bpl에 대한 dll 의존성을 가지고 있습니다.
여기서 문제가 발생하죠. Indy9과 Indy10은 기본적으로 거의 같은 컴포넌트/클래스, 유닛 이름들을 사용합니다. 그리고 델파이/C++빌더 IDE에서 클래스, 유닛 이름들은 유일해야 합니다. 그런데 Indy9이 먼저 IDE에 로드되고 나면, DataSnapIndy10ServerTransport120.bpl을 로드하려고 하다가 의존하는 파일인 Indy10 bpl들을 로드하려고 시도하겠지요. 이 순간에 이름 충돌이 발생합니다.
따라서, Indy9을 등록해두면 IDE가 처음 시작될 때 Indy10 로드 에러가 발생합니다.
Cannot load package 'indySystem120.bpl.' It contains unit 'idGlobal,' which is also contained in package 'indy120'. Ignore the error and continue?
요약하자면, DataSnap 2009의 트랜스포트 기능이 Indy10에 의존하고 있기 때문에, IDE가 기동될 때 Indy9과 DataSnap 2009 트랜스포트 기능이 충돌한다는 것이고, 그 결과로 DataSnap 2009를 사용할 수 없는 상태가 됩니다. 만약 kbmMW에서처럼 Indy9과 Indy10 버전을 모두 지원하도록 만들었다면 문제가 없었겠지만...
만약 3티어 개발에 대해 전혀 관심이 없는 개발자라면, 가벼운 마음으로 DataSnapIndy10ServerTransport120.bpl 패키지를 IDE에서 등록 해제해버리면 이 문제는 간단히 해결됩니다. 하지만 그게 아니라면.. 특히 저같은 경우 위에서도 썼다시피 향후 언젠가는 반드시 DataSnap 2009를 전면적으로 사용할 생각이고, 미리부터 여러가지 준비를 하고 싶기 때문에 참 난감합니다.
그런 이유로.. Indy9을 버리고 Indy10으로 넘어갈까도 생각해봤습니다만... 여러가지 이유로 Indy10 버전은 맘에 안들어서.. 게다가 Indy10은 Indy9에 비해 런타임 bpl의 크기가 두배가 넘어서(2.3MB) 배포하기에도 좀 안좋습니다.
이 문제로 만으로 이틀 동안 고민을 했는데.. 지금 결정하고 나면 향후 1~2년 동안은 변경하기가 어려워 아직 결론을 못내고 있습니다. 그냥 이번 기회에 가벼운 Synapse로 넘어갈까도 생각했는데(Synapse도 kbmMW에서 지원하므로), 대충 구조를 보니 좀 갑갑한 구조더군요. 기본 기능에는 충실하지만 개발자의 다양한 용도에는 불편한 점이 많겠더라구요.
지금 진행중인 프로젝트에서 개발툴로 델파이 2009을 사용하기로 했고, 그래서 고객사에서 구매 품의도 진행중입니다. 그래서 델파이 2009에서 변경된 이슈들에 맞게 여러 서드파티 컴포넌트 라이브러리들도 소스를 수정해왔고, 거의 마무리 단계죠. 그런데 정작 델파이 2009에 번들된 라이브러리인 인디 때문에 발목을 잡혀서 헤롱거리고 있네요. 쩝...