프로젝트를 진행하다가, 델파이/C++빌더 XE3 및 XE4의 TClientDataSet의 이상한 버그 하나를 추가로 발견했습니다. 필드 이름이 한글이고 대략 10글자가 넘을 때 “Field xxx not found” 에러가 나는 것인데요.
VCL의 소스를 확인해보니 필드 이름을 UTF8로 변환한 후 길이를 32보다 크면 32길이로 잘라버리더군요. UTF8에서는 기본적으로 한글 한 글자를 3바이트로 저장하기 때문에, 필드 이름이 한글이고 10자가 넘으면 필드 이름이 잘리게 됩니다. 결과적으로 존재하는 필드를 못찾게 되죠. (필드에 영숫자만 썼다면 32자가 넘어도 문제가 발생하지 않습니다)
이 문제의 재연을 테스트해보는 방법은 간단합니다. 빈 폼에 TClientDataSet 하나를 놓고 필드들을 임의로 정의하고, 필드들 중 하나의 이름을 한글로 33자 정도로 지은 후, 버튼 클릭 등의 런타임 코드에서 CreateDataSet을 하면 됩니다. 실행해보면 직빵으로 Field xxx not found 에러가 뜹니다.
이건 XE2 이하 버전에서는 없던 버그입니다. XE2 이하 버전들과 XE3, XE4 버전의 VCL 소스를 비교해보면, 멀티플랫폼 지원을 위해 뭔가 한참 삽질을 해놨습니다. 즉 멀티플랫폼 지원을 위해 Win32에서는 잘 돌아가던 코드를 희생시킨 셈입니다.
TClientDataSet 등의 Midas/DataSnap 기능들은 델파이의 구버전에서도 몇번 뜯어고치다가 이런 류의 버그들이 종종 발생했던 부분입니다. 그런데도 또 섣불리 뜯어고치다가 버그를 만들었네요. 더욱이 이번에는, 영문자에서는 발생하지 않기 때문에 문제를 더 발견하기도 어렵습니다. 또 ‘Field xxx not found’라는 에러 메시지를 봐서는 한글을 썼다거나 글자수가 많아서 문제가 된 거라고 생각하기도 어렵기 때문에 더 골치아픕니다.
이 버그에 대해 패치를 만들까 말까 고민중입니다. 이유는… 첫번째로는 일단 필드 이름을 한글로 짓는 경우는 상대적으로 적은 편이고, 또 10글자가 넘는 경우도 그렇게 흔하지는 않을 것이니까, 소수의 개발자들만 겪는 문제라는 거구요. 두번째는, 이것 외에도 XE2 이후 버전들에서는 기존 라이브러리를 뜯어고친 부분들에서 버그들이 줄줄이 발견되고 있어서, 이 문제 하나에 대한 패치를 제공하는 것이 큰 의미가 없을 수도 있다는 생각이 들어서입니다.
당장 제가 현재 진행하고 있는 공공기관 프로젝트에서도, 이미 XE3로 진행한다고 결제라인에 보고된 상황인데요. (XE4가 나와있는 상태에서 XE3를 선택한 것도 조금이나마 더 안정화된 버전일 거라는 기대 때문이었습니다만) XE 버전으로 다운 버전하겠다고 보고하고 개발툴을 변경해야 할지, 머리 싸매고 고민중입니다. 머리 아프네요.
덧붙이자면, XE2 이후의 버전들은 멀티플랫폼 지원 때문에 기존에 잘 동작하던 RTL/VCL을 너무 많이 뜯어고치고 있습니다. 그것도 매 버전마다 계속 바뀌고 있고요. 이렇게 버그들이 발생하는 경우도 꽤 많지만, 더 큰 문제는 기존의 RTL/VCL 구조를 이리저리 뜯어고쳐놔서, 일반적인 화면 구성 정도의 코드가 아닌 조금만 로우 레벨로 내려가도 기존에는 잘 동작하던 프로젝트 소스가 컴파일이 안되는 경우가 빈발하고 있습니다. 저는 컴포넌트나 라이브러리를 개발하거나 수정하는 경우가 많아서 쓸데 없는 일거리가 대박이네요.
따라서, 중단기적으로 모바일이나 Mac 등의 Windows 이외의 플랫폼을 필요로 하는 경우가 아니라면, 즉 Windows 플랫폼에 계속 머무를 프로젝트라면, 제 경험과 판단으로는 XE 버전까지가 최적의 버전입니다. XE 버전 이후로 XE2, XE3, XE4의 세 버전이나 출시되었고 아마도 이번달 내로 신버전 XE5가 출시될 것 같습니다만, XE 버전 이후로 추가된 기능들이 타 플랫폼들을 고려한 기능들이고, 나머지 10%는 있어도 그만 없어도 그만인 기능들이네요.
물론 모바일이나 Mac 등의 타 플랫폼을 고려해야 하는 상황이라면 당연히 무조건 최신 버전을 선택해야 합니다. 중간 버전들은 버그도 많을 뿐더러 플랫폼들이 Windows처럼 안정화된 OS가 아니라 계속 변화하고 있기 때문이죠. 즉, 곧 XE5가 출시되고 나면, Windows를 위해서든 타 플랫폼을 위해서든, XE2~XE4 버전들은 쓰지 않는 것을 권장합니다.
참고로, 이 버그는 현재의 최신 버전인 XE5에도 그대로 있습니다.