[마이그레이션 사례] 감리교 신학대학교

2016.08.02 15:28

고객들의 PC환경과 요구사항이 아주 빠르게 발전하고 있습니다. 윈도우10 등의 최신 운영체제를 탑재한 PC환경과 새로운 요구사항에 대응하기 위해서는 RAD 스튜디오(델파이, C++빌더)에서 제공하는 최신 기능을 활용할 수 있도록 마이그레이션이 필요합니다.


저는 여러분들이 직접 마이그레이션을 진행할 수 있는 마이그레이션 관련 자료와 팁을 제공하고, 

마이그레이션 컨설팅, 마이그레이션 워크샵 등을 통해 직접적인 도움이 필요한 프로젝트나 기업을 지원하고 있습니다.

마이그레이션을 계획하거나 진행하고 계신 분들에게 도움되도록 마이그레이션 프로젝트 과정의 일부를 간단히 정리해 공유합니다.


감리교 신학대학교 - 마이그레이션 컨설팅

  • 프로젝트 기간 : 2016년 5월 ~ 7월(3개월)
  • 지원방법 : 마이그레이션 방문컨설팅
  • 버전 : 델파이 3 -> 델파이 10.1 베를린(Berlin)


감리교 신학대학교의 학사관리 프로그램(학부, 대학원, 평생교육원, 행정 등)을 델파이 3에서 델파이 10.1 베를린으로 마이그레이션 하는 프로젝트를 3개월간 진행했습니다.


감리교 신학대학은 1887년 설립된 국내최초의 신학교입니다. 오래된 전통만큼 상당히 오래된 델파이 3 버전을 최신버전인 델파이 10.1 베를린으로 마이그레이션 진행했습니다.


마이그레이션 진행사항

감리교 신학대학교의 마이그레이션 프로젝트의 작업 대상은  총 27개 실행파일에 약 3000여개의 소스파일과 3000여개의 화면이었습니다.


핵심과제

이번 마이그레이션 프로젝트의 핵심 과제는 아래와 같습니다.


1, 최신 운영체제 지원 - 델파이 버전을 업그레이드 하고, 오래된 기술인 BDE를 걷어내는 작업

2, 디자인 개선 - 오래된 구식 화면의 일부(로그인, 메인화면)를 개선하고 최신 스타일 적용


위와 같이 핵심과제를 선정한 이유는, 

보통 마이그레이션 계획 시 소스코드만 상위버전으로 마이그레이션을 계획하는 경우가 있습니다.

하지만, 이경우 개발자(또는 개발팀) 입장에서는 소스코드를 마이그레이션하는 것이 중요 과업일 수 있지만, 

실 사용자 입장에서는 마이그레이션 전과 후가 변경된 것이 없어 성공적이지 못한 작업으로 인식할 수 있습니다.


그래서, 제안하는 바는 마이그레이션 계획 시 소스코드 마이그레이션을 핵심 과업으로 계획하고, 사용자들이 자주 사용하는 몇개의 화면에 대해 디자인 강화나, 필요한 기능을 몇개 선정해 구현한다면 사용자들도 만족하는 성공적인 마이그레이션 프로젝트가 될 것 입니다.


마이그레이션 작업 사이클

마이그레이션 작업을 성공적으로 수행하려면, 마이그레이션 작업을 잘 수행하는 것과 더불어 테스트와 문서화가 매우 중요합니다.

정해진 일정에서 테스트 시간을 확보하기 위해서는, 마이그레이션 작업 시간을 단축해야 하는데요. 저는 마이그레이션 대부부의 작업을 자동화(또는 반자동화)하는 것으로 실질적인 마이그레이션 작업시간을 줄이고, 테스트와 기능추가 문서화에 시간을 투자했습니다.


마이그레이션 작업의 자동화 작업은  작업시간을 단축시켜 줄뿐 아니라 작업자의 실수를 방지해주고, 작업을 단순하게 해주기 때문에 규모에 상관없이 자동화 할 수 있는 방안을 찾아보시기 바랍니다.(자동화 방안은 아래에서 추가로 설명합니다.)


제가 진행한 마이그레이션 사이클은 다음과 같습니다.

  1. 대상선정
    • 작업대상을 세분화해서 부분적으로 작업합니다. 
    • 중요도와 상관없이 다양한 화면과 기술이 구현된 대상을 우선 진행합니다.
    • 마이그레이션 작업이 익숙하지 않다면 작업량이 작고, 쉬운 대상을 먼저 진행합니다.
    • 모듈화(별도의 프로젝트)되어 있다면 더욱 좋습니다.
  2. 마이그레이션 작업
    • 자동화 도구를 이용해 작업진행
    • 마이그레이션 가이드 참고
  3. 이슈해결
    • 마이그레이션 작업 후 발생하는 이슈(컴파일 오류 등)을 해결합니다.
    • 이슈를 정확히 해결하기 위해서는 신규 프로젝트를 생성후 이슈 재현해 해결하면 더욱 좋습니다.
  4. 자동화방안수립
    • 자동화 패턴(reFind.exe 용)을 작성하거나, 텍스트 에디터로 여러파일 일괄전환 방법을 수립합니다.
    • 필요한 경우 전환 프로그램을 개발합니다.
  5. 마이그레이션 가이드 작성
    • 이슈와 해결방안을 기록하고, 자동화 방안도 기록합니다.(다음 작업 시 참고합니다)
    • 프로젝트 옵션, 컴포넌트의 속성 변경 등 빠트릴 수 있는 내용을 기록합니다.
    • 공통적으로 변경해야할 코드들을 기록합니다.
  6. 이전 작업분에 반영
    • 이미 마이그레이션 진행한 작업분에 추가된 이슈해경 방안을 반영합니다.
  7. 테스트

위의 사이클로 마이그레이션 작업을 하게되면, 반복적인 작업은 자동화 도구로, 수작업은 문서를 참고하기 때문에 상당히 빠르고 정확하게 진행할 수 있습니다.

이번 프로젝트에서도 실질적인 마이그레이션 작업시간은 약 1~2주로 전체의 1/6이 안되는 시간을 사용했고, 나머지 시간을 이슈해결, 자동화 방안수립, 테스트 등에 활용해 성공적으로 마무리 할 수 있었습니다.


작업내용

작업한 내용을 간단하게 공유합니다.(좀 더 자세한 사항은 내용 하단 참고자료를 이용해 확인할 수 있습니다.)


사용성

최신 운영체제 지원

델파이3으로 개발된 프로그램은 최신 운영체제(윈도우10, 윈도우8)에서 설치 및 사용 시 알수 없는 오류가 발생했습니다. 특히 오래된 데이터 접속 기술인 BDE가 최신 윈도우와 64비트 환경을 지원하지 않고, 프로그램 배포 시 BDE Admin을 별도로 설치해야하는 번거로움이 있었습니다.


마이그레이션 작업에서는 델파이 버전을 델파이3을 델파이 10.1 베를린으로, 데이터 접속 기술을 BDE에서 FireDAC으로 변경하므로 최신 윈도우를 완벽 지원하게되었습니다.


이 과정의 대부분은 마이그레이션 자동화 도구인 reFind.exe를 이용해 작업시간을 대폭 단축 시켰습니다.

배포과정 간소화

FireDAC을 사용하게되면서 프로그램 배포시 기존에는 BDE Admin, 오라클 클라이언트 소프트웨어등을 별도로 설치해야 했지만, FireDAC을 사용하는 경우 프로그램 실행파일과 몇개의 오라클 관련 DLL(Oracle thin client dll)만 배포하도록 배포과정을 간소화 할 수 있었습니다.


☞ 참고자료

디자인

슬라이드 메뉴 적용

오래된 프로그램인만큼 화면과 레이아웃도 오래전의 방식을 사용하고 있어, 개선이 필요했습니다.
마침 VCL 윈도우 10 컨트롤 중 슬라이드 메뉴를 제공하는 TSplitView를 델파이 10 시애틀 부터 제공해 TSplitView를 이용해 업무별 바로가기 기능을 구현했습니다.(위 그림 참고)

☞ 참고자료

최신 윈도우 스타일 적용

전체적인 화면의 컨트롤, 테두리, 배경색등을 일괄적으로 최신 윈도우 스타일을 적용하기 위해 VCL 스타일을 적용했습니다. 프로젝트 옵션을 설정하는 것만으로 모든 화면과 각 컨트롤이 일괄적으로 스타일이 적용되어 손쉽게 스타일을 업그레이드 할 수 있었습니다.

☞ 참고자료


기능

보고서 엑셀저장

보고서 프로그램으로 사용하는 퀵레포트(Quick Report)를 업그레이드 했더니, 보고서 저장하는 기능이 추가되었습니다. 마침 엑셀로 저장하는 기능이 활용성이 높다 판단되어 엑셀로 저장하는 필터 컴포넌트(TQRXLSXFilt)를 보고서 화면에 추가해 간단히 엑셀로 저장하는 기능을 구현했습니다.

하지만, 보고서 화면이 너무 많아 일일이 필터 컴포넌트를 올리는 작업량이 많아 텍스트 에디터의 여러파일 찾기 기능과 치환 기능을 이용해 폼파일(*.dfm)과 소스파일(*.pas)에 컴포넌트 추가하는 작업을 자동화 했습니다.


☞ 참고자료


학적부 사진 저장, 보고서 사진 출력

학생들의 사진을 프로그램에 표시하기 위해, DB에 사진 테이블 생성 후 BLOB 컬럼을 추가해 사진데이터를 저장했습니다. 기존에 웹상에서 관리하던 이미지 파일을 다운로드 해 DB에 일괄저장 후 화면과 보고서 화면에 표시했습니다.


☞ 참고자료


SQL 문 로그 기능 구현

"DB에 호출하는 모든 SQL 문을 로그로 남겨주세요."라는 요구사항을 처리하기위해 TFDQuery 컴포넌트를 상속받아 일부 메소드의 기능을 확장하도록 진행했습니다.

대부분의 DB 작업이 TFDQuery와 TFDUpdateSQL로 SELECT, INSERT, UPDATE, DELETE 문이 컴포넌트 내에 기록되어 수작업으로 로그를 기록할 경우 이미 작업한 분량만큼(또는 더 많은 분량을) 추가 작업해야 하기 때문에 수작업으로 로그를 남기는 작업은 사실상 불가능했습니다.

그래서, TFDQuery에서 SQL문을 DB로 전달하는 부분(메소드)을 추적해 해당 메소드를 재구현(Override)해 처리했습니다.


☞ 참고자료

  • (작성 중)

성능

데이터베이스 처리 성능 개선

BDE를 FireDAC으로 교체하는 것만으로도 일부의 데이터 엑세스 성능을 개선할 수 있습니다. FireDAC은 멀티-플랫폼을 지원하는 데이터 엑세스 컴포넌트로 매우 다양한 기능을 제공하며, 성능도 이전의 데이터 엑세스 컴포넌트(BDE, dbExpress 등)에 비해 향상되었습니다.


☞ 참고자료


추가안내

마이그레이션 지원

저는 데브기어를 통해 아래 3가지 방식으로 마이그레이션을 지원합니다.

마이그레이션 정보 제공

마이그레이션 기술자료를 마이그레이션 센터와 데브기어 테크게시판을 통해 제공합니다. 마이그레이션에 대한 질문도 질문 게시판을 통해 받고있습니다.

마이그레이션 무상 컨설팅

마이그레이션 체크리스트와 가이드 문서를 제공합니다. 작성 후 메일을 보내주시면 이메일과 방문을 통해 컨설팅을 지원합니다.


마이그레이션 워크샵(4일)

마이그레이션을 좀 더 효과적으로 직접 진행하고 싶다면, 워크샵 과정에 참석하세요. 마이그레이션 자동화 방안, 가이드 문서 작성 등을 배우고, 혼자 해결하기 어려운 부분을 멘토링을 통해 해결해 더 쉽고, 빠르게 마이그레이션 할 수 있습니다.

마이그레이션 컨설팅(유상)

마이그레이션 시의 위험요소 파악, 전환체계(자동화 방안, 마이그레이션 가이드 작성 등) 구축 등을 경험많은 마이그레이션 전문가를 통해 진행할 수 있습니다.

  • 별도로 요청해 주세요.. : ask@embarcadero.kr

저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 마이그레이션

[마이그레이션 사례] 에스엔유프리시젼

2016.04.14 14:07

고객들의 PC환경과 요구사항이 아주 빠르게 변화하고 있습니다. 최신 PC환경과 새로운 요구사항에 대응하기 위해서는 RAD Studio(델파이, C++빌더)에서 제공하는 최신 기능을 활용하도록 마이그레이션이 필요합니다.


저도 마이그레이션 컨설팅과 마이그레이션 워크샵을 통해 마이그레이션이 필요한 프로젝트나 기업을 지원하고 있습니다.

마이그레이션을 계획하거나 진행하고 계시는 분들에게 도움되도록 과정을 간단히 정리해 공유합니다.


에스엔유프리시전 - 마이그레이션 워크샵

  • 일시 : 2016년 4월 5일 ~ 8일(4일간)
  • 지원방법 : 마이그레이션 워크샵
  • 버전 : 델파이 7 -> 델파이 XE5



지난 4월 5일~9일간 델파이 마이그레이션 워크샵 과정을 진행했습니다. 이번 워크샵 과정에 에스엔유프리시전에서 참석해 마이그레이션을 지원했습니다.


에스엔유프리시전은 OLED 장비 제조업체로 OLED 장비를 운영/제어하는 소프트웨어를 델파이7에서 델파이 XE5로 마이그레이션 진행했습니다.


사실 공장자동화와 설비 분야는 제가 익숙치 않아서 도움을 많이 못드릴까 내심 걱정했는데요. 소스가 클래스 기반으로 화면과 로직이 분리되어 있어 큰 어려움 없이 진행했습니다.


마이그레이션 과제

에스엔유프리시전의 마이그레이션 과제는 크게 2가지로 다음과 같이 해결했습니다.

1, 써드파티 컴포넌트 통합

오래된 코드들의 특징처럼 다양한 종류의 써드파티 컴포넌트를 사용중이어서, 대부분을 걷어내고 TMS 컴포넌트 셋과 기본 컴포넌트로 통합했습니다.

단순히 컴포넌트를 변경하는 작업이라면 reFind를 통해 자동화 했을텐데, 컴포넌트 변경과 함께 여러가지 속성을 추가로 설정, 변경해야 했기 때문에 컴포넌트 전환 도구(글추가)를 별도로 만들어 제공했습니다.

그리고, 단순 컴포넌트 전환은 GExpert의 Replace Components 기능을 이용해 바로바로 변환하며 작업했습니다.

UI 전환작업은 손은 많이 가지만, 난이도가 높은 작업이 아니어서 부분적으로 진행하고 다른 작업을 먼저 진행했습니다.


2, 유니코드 기반에서 통신 프로토콜의 문자 처리

시리얼통신(RS232 등)과 TCP/IP로 통신 시 문자열 처리하는 부분과 DLL 인터페이스에 대해 유니코드 적용을 검토했습니다.

유니코드 검토 도구 미리 준비해 오셔서 바로 검토 진행했습니다. 

유니코드 적용의 규칙은 간단합니다. 대상이 문자열을 AnsiString으로 받으면 AnsiString으로 넘겨주면 되고, UnicodeString으로 받으면 UnicodeString으로 넘겨주면 됩니다.

이때 대상은 윈도우API일 수도 있고, TCP/IP 서버, 장비일 수 있습니다. 코드를 살펴 대상을 확인 후 장비 등이라면 기존 델파이7에서와 마찮가지로 AnsiString으로 전달하고, 윈도우API라면 파라메터의 데이터타입을 확인해 Char를 AnsiChar로 string을 AnsiString으로 변경해주면 됩니다.

의심이 가는 코드들은 반드시 테스트 코드를 작성해 검증하고 적용해야 합니다.


추가 지원 정보 및 시스템 확장

마이그레이션 과제로 가져온 내용 외에 필요한 마이그레이션 대상과 시스템을 확장할 수 있는 방안을 소개해드렸습니다.

1, 데이터베이스 전환

BDE를 FireDAC으로 전환했는데, DB 접근하는 곳을 하나의 클래스로 모아놔서 별도의 자동화 도구 없이 손쉽게 적용했습니다. 대신 DB 프로그래밍이 익숙치 않으셔서 간단히 사용법을 안내드렸습니다.

그리고, 라이선스가 있는 MS Access를 대신할 수 있는 IBLite와 SQLite를 소개하고 연결하는 과정을 진행했습니다.


2, 델파이7 이후 새로운 기능  소개

오랫동안 델파이7으로 개발한 경우 IDE 사용법이 낮설고, 추가된 기능들을 잘활용하지 못하는 경우가 많습니다. 마침 제가 정리해 놓은 델파이7 이후의 새로운 기능 페이지를 통해 IDE 그리고 새로운 기능, 컴포넌트 등을 소개했습니다.


3, OOP 소개

소스가 OOP 기반으로 견고히 구축되어 있고, OOP와 설계에 관심이 많으셔서 제가 이전에 사용했던 패턴(옵저버 + 커맨드 패턴)을 소개해 드리고, 인터페이스 개념과 사용법을 안내해 드렸습니다. 워낙 도움이 많이 되셨다고 칭찬해 주셔서 특강이나 별도의 글로 작성해야 겠다는 욕심이 들었네요.(생각보다 OOP에 대한 관심이 많은 것 같습니다. 혹시 OOP 특강이 필요하시면 저에게 요청해주세요.^^)


4, 현대식 문법 소개

타입 헬퍼, 제너릭, 익명메소드등 코드를 더 간격하게 작성할 수 있는 델파이 현대식 문법의 사용법을 소스코드 기반으로 소개


5, 모바일과 사물인터넷으로 확장

최신 버전으로 마이그레이션 했다는 것은 모바일, 사물인터넷 기능을 이용해 기능을 확장할 수 있도록 준비되었다는 의미입니다. 설비등 공장의 장비를 제어하는 경우 외부에서 모바일로 장비를 모니터링하고, 긴급상황에 대한 알림을 제공한다면, 기존 시스템을 한단계 업그레이드해 경쟁의 우위를 갖을 수 있습니다. 이 기능을 멀티-디바이스 프레임워크인 파이어몽키 프레임워크와 앱테더링 을 통해 모니터링 및 제어할 수 있는 모바일 앱을, 긴급상황 알림 등은  비콘, 블루투스 등으로 사물인터넷으로 확장하는 방안을 작은 규모로 컨설팅(?) 해 드렸습니다.


총 평

아직 많은 분들이 마이그레이션을 준비하고, 계획하고 있는것으로 압니다.

사신 마이그레이션 자체는 기술적으로 크게 어렵지 않습니다. 대부분 어려워하는 부분이 수많은 코드를 어떻게(언제) 작업 할지에 대한 고민입니다.그런 고민이 있다면 최대한 자동화하는 방법을 찾아보시기 바랍니다. 컴포넌트 전환을 자동화 하는 도구 들을 이용하고, 필요하다면 자동화 도구를 직접 만드시기 바랍니다. 마이그레이션을 자동화하면 작업 일정을 대폭 줄이고, 소스코드 품질 향상과 안정성을 확보할 수 있는 테스트에 더 많은 시간을 할애할 수 있습니다.


이번 마이그레이션 작업도 마이그레이션 작업보다, UI 개선(써드파티 컴포넌트 통합, TMS 컨트롤 적용), 소스코드 품질향상(현대식 문법, OOP 적용 등), 안정성/성능향상(BDE > FireDAC), 그리고 시스템 확장(모바일, 사물인터넷)하는 부분에 더 많은 시간을 투자했습니다.


마지막으로 마이그레이션을 진행한 담당자가 이야기해준 마이그레이션 워크샵의 좋은 점과 아쉬운점을 남기고 마무리합니다.


워크샵에 참석해 좋은 점은

  • 작업하며 막히는 부분을 바로바로 풀어줘서 빠르게 막힘없이 빠르게 진행해 좋았다.
  • 새로운 개발환경이 부담 되었는데 함께 작업하며 새 버전의 IDE에 익숙해 져서 좋았다.
  • 현대식 문법과 OOP 등 평상시 궁금했던 내용을 자유롭게 이야기하고 들을 수 있어서 좋았다.
  • 시스템 확장할 수 있는 아이디어와 방법, 기술을 알게되어 좋았다.

아쉬운 점은 

  • 실 장비와 떨어진 환경에서 제한적으로 테스트해서 북귀 후 추가작업을 진행해서 아쉬웠다.


마이그레이션이 부담되거나, 어떻게 시작할지 어려움이 있다면 마이그레이션 워크샵과정에 참석하세요.

마이그레이션 자동화 도구로 수작업을 줄여 기간을 단축해주고, 어려운 부분은 멘토링으로 해결해 드립니다.
(마이그레이션 컨설팅(1~2 주 이상 방문해 진행)이 필요한 경우 데브기어(ask@embarcadero.kr)로 별도로 연락주세요.)


저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 마이그레이션

[마이그레이션][팁] 유니코드 검토 대상 분석 도구

2015.11.16 18:08

유니코드 검토 대상 분석 도구

유니코드 적용 시 검토해야 할 부분(함수, 자료형)을 안내해 주는 도구입니다.

Change 버튼을 눌러 경러 선택 후 Process files 버튼을 누르면 해당 경로의 유닛파일(*.pas)을 분석 후 결과를 표시합니다.


다운로드

제가 기능을 추가한 실행파일은 아래에서


Unicode_statistics_tool_Parser.zip

  • 검토 대상 총 갯수 메모 마지막에 표시 하도록 수정
  • 디렉토리 경로 문자열을 에디터에 복사해도 적용되록 수정
  • 하단 트리뷰와 레포트 파일에 검토대상이 없는 소스코드 표시되지 않도록 수정


원본 실행파일과 소스코드

http://cc.embarcadero.com/item/27398

분석 대상

다음 함수와 자료형을 대상으로 분석하며, 하단 Add Token 기능으로 대상을 추가할 수 있습니다.


SizeOf

Length

FillChar

Move

Char

PChar

AnsiChar

PAnsiChar

String

ShortString

Chr

Ord

SaveToFile

LoadFromFile

Read

ReadBuffer

Write

WriteBuffer

MultiByteToWideChar

AppendStr

GetProcAddress

CreateProcess

Copy

Seek

Pointer

AllocMem

GetMem

StrAlloc

AnsiStrAlloc



저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 마이그레이션

[마이그레이션] 유니코드 적용시 검토할 사항들

2015.11.09 18:58

델파이 2009 이후 버전 부터는 유니코드 기반의 문자열을 사용합니다. 그래서 델파이 2007 이전버전에서 델파이 2009 이후 버전으로 마이그레이션 할 경우 소스코드에서 유니코드 사용에 대한 점검이 필요합니다.


일부 개발자들이 유니코드 대응을 마이그레이션의 큰 위험요소로 생각합니다. 하지만 알고 보면 대부분의 경우 기존 소스코드를 별도 추가작업 없이 유니코드 기반에서 그대로 사용할 수 있습니다. 단, 문자열을 다루는 코드에 대해서는 점검이 필요합니다.


유니코드와 델파이의 변경사항에 대해 살펴보고 기존코드를 유니코드 기반 델파이에서 동작하도록 점검하는 내용을 살펴보겠습니다.

목차

1. 유니코드와 델파이의 변경사항

  1.1. 유니코드란?

  1.2. 유니코드 지원에 의한 델파이 변경사항

2. 기존 코드를 유니코드 기반 델파이에서 동작하도록 수정하기

  2.1.. 유니코드 적용 시 검토 대상

  2.2. 유니코드 검토 대상 분석 도구 안내


1, 유니코드와 델파이의 변경사항

1.1. 유니코드란?

유니코드는 사실상 모든 문자들을 단일 캐릭터 셋으로 인코딩할 수 있는 문자 인코딩 방식입니다. 델파이는 2009 버전부터 IDE와 컴파일러, RTL, VCL 모두 완벽하게 유니코드를 지원합니다.

유니코드에 대한 자세한 내용은 닉하지스가 작성한 글을 박지훈님이 번역한 글과 엠바카데로 기술문서를 통해 더 자세히 확인할 수 있습니다.


1.2. 유니코드 지원에 의한 델파이 변경사항

델파이에서 유니코드 지원 시 변경된 사항은 다음과 같습니다.

  1. 문자열의 데이터 타입 선언의 변경

  2. 문자열 길이의 변경

  3. 문자 크기의 변경


문자열 데이터 타입 선언의 변경

 데이터 타입

 유니코드 지원하지 않는 버전

 (델파이 2007 이전)

 유니코드 지원하는 버전

 (델파이 2009 이후)

 string

 AnsiString

 UnicodeString

 Char

 AnsiChar

 WideChar

 PChar

 PAnsiChar

 PWideChar

 PAnsiChar

 PAnsiChar

 PAnsiChar

 PWideString

 PWideChar

 PWideChar

 AnsiString

 AnsiString

 AnsiString

 WideString

 WideString

 WideString


위 표와 같이 string은 유니코드 지원하지 않는 버전에서는 AnsiString으로, 유니코드를 지원하는 버전에서는 UnicodeString으로 선언됩니다. Char와 PChar도 선언된 데이터 타입에 차이가 있습니다.

반면, 명시적으로 Ansi, Wide가 포함된 데이터 타입은 유니코드 지원여부와 관계없이 동일한 데이터타입으로 사용됩니다.


문자열 길이의 변경

델파이는 유니코드 지원과 하위 호환성을 확보하기 위해 대부분의 문자열 함수가 UnicodeString과 AnsiString 두가지 데이터를 처리할 수 있도록 구현되었습니다.

즉, Length(문자열) 함수는 UnicodeString을 타입 문자열을 처리하는 Length함수와 AnsiString 타입 문자열을 처리하는 Length함수를 모두 제공합니다.

하지만, 같은 함수를 이용하더라도 캐릭터셋 특성 상 Length 함수는 UnicodeString과 AnsiString의 길이를 다르게 반환합니다.


 

 string(UnicodeString)

 AnsiString

 Length('한글1'); 

 3

 5

문자열 길이 변경에 따른 유의사항은 다음 장에서 다루도록 하겠습니다.


문자 크기의 변경

UnicodeString의 모든 문자의 크기는 2Bytes입니다. 이제 한글 한글자도 2Bytes, 영문 한자도 2Bytes, 숫자 한자도 2Bytes 모두 2Bytes입니다.

.

2. 기존 코드를 유니코드 기반 델파이에서 동작하도록 수정하기

델파이에서 유니코드를 지원은 재검토 대상의 경우를 제외하고는 별도의 추가작업 없이 기존 코드를 그대로 사용할 수 있습니다.

2.1. 유니코드 적용 시 검토 대상

  • string 길이와 데이터 크기가 같다고 간주한 코드
  • char 데이터 크기를 1로 간주한 코드
  • string을 AnsiString으로 간주한 코드
  • 잠재적으로 수정될 필요가 있을 수 있는 코드

string 길이와 데이터 크기가 같다고 간주한 코드

UnicodeString 기반에서는 더이상 문자열(string)의 길이와 데이터 크기가 같지 않습니다.

UnicodeString의 Length 함수는 문자의 수를 반환하고, 문자의 크기는 2Bytes이기 때문에 문자열의 데이터 크기는 "문자열 길이 * SizeOf(Char)"로 계산하도록 코드를 전환해야 합니다.


다음 예제를 통해 확인합니다.

var
  Count: Integer;
  Buf1, Buf2: array[0..13] of Char;
begin
  Buf1 := '가나다라마바사아자차카타파하';
  // 잘못됨: AnsiString과 같이 길이로 데이터 복사
  Move(Buf1, Buf2, Length(Buf1)); // Buf2 = 가나다라마바사
  // 올바른: 문자열 길이와 문자 크기의 곱으로 데이터 복사
  Move(Buf1, Buf2, Length(Buf1) * SizeOf(Char)); // Buf2 =가나다라마바사아자차카타파하
end;

이제 기존과 같이 문자열을 길이로 복사하면 절반의 데이터만 복사된다는 점 유의하기바랍니다.


검토해야하는 대표적인 키워드(함수, 데이터타입)는 아래와 같습니다. 

 Length

 FillChar

 Read

 ReadBuffer

 Write

 WriteBuffer

 Copy

 Seek

 AllocMem

 GetMem

 StrAlloc

 AnsiStrAlloc

 Delete Insert Pos LeftStr RightStr MidStr
 Move     

기타, 메모리를 할당하고 복사하는 코드와 문자열 길이를 이용해 문자열을 조작하는 코드를 점검하시기 바랍니다.


Char 데이터 크기를 1로 간주한 코드

UnicodeString에서 Char의 데이터 크기는 2Bytes 입니다. 기존 코드에서 Char가 1Bytes로 가정하고 구현한 코드를 점검해야 합니다.


다음 예제는 문자열을 버퍼로 사용한 코드입니다. 문자열은 조작이 쉽기 때문에 예제와 같이 Char 배열 선언후 메모리에 복사하는 코드를 사용했다면, 데이터 크기가 기존에 비해 2배로 커질것 입니다. 

var Buf: array[0..3] of Char;
begin
  Buf1 := 'abcd';

  MemStream := TMemoryStream.Create;
  try
    MemStream.Write(Buf1, SizeOf(Buf1)); // SizeOf(Buf): Ansi=4, Wide=8
  finally
    MemStream.Free;
  end;
end;

이 경우, 문자를 1Byte로 사용해야 하는 경우 array of AnsiChar로 수정해야 하고, 데이터를 읽고, 쓰는 부분을 쌍으로 데이터가 일치하도록 점검하기 바랍니다.


그리고 문자열 Set 문법은 Char가 WideChar로 선언되어 있기 때문에 아래 예제와 같이 CharInSet 함수를 사용해야 합니다.

var C: Char;
begin
  C := Edit1.Text[1];

  // if C in ['a'..'z', 'A'..'Z'] then
  if CharInSet(C, ['a'..'z', 'A'..'Z']) then
  begin
    Label1.Caption := 'It is there';
end;


검토해야하는 대표적인 키워드(함수, 데이터타입)는 아래와 같습니다. 

 SizeOf

 Char

 of Char

 in

 

 



string을 AnsiString으로 간주한 코드

델파이 2007 이전 버전에서는 string이 곧 AnsiString, PChar가 PAnsiChar였기 때문에 별다른 생각없이 string과 PChar 데이터 타입을 사용한 코드가 있을 수 있습니다.


특히, DLL과 문자열 전달 시 문자열포인터로 PChar를 전달한 경우 아래와 같이 조치해야 합니다.

  • DLL을 직접 제작한 경우 유니코드 지원이 필요하다면 DLL과 DLL을 호출하는 실행파일 모두 Export 메소드의 문자열 포인터 데이터 타입을 PWideChar로 변경 후 다시 빌드해 사용해야 합니다.

  • DLL을 직접 제작하지 않은 경우 DLL 인터페이스 문서를 참고해 유니코드를 지원하는 메소드 여부 확인 후, PAnsiChar, PWideChar를 명시적으로 지정해야 합니다.

델파이에서도 내부적으로 윈도우 API를 호출합니다. 델파이도 위와 마찮가지로 AnsiString인 경우 PAnsiChar 메소드를 UnicodeString인 경우 PWideChar 메소드(보통 같은 메소드이름 마지막에 W가 붙은경우 WideChar 메소드입니다.)를 호출합니다.

만약, 윈도우 API를 직접 호출한 경우 아래와 같이 조치하기 바랍니다.

  • 유니코드를 지원하는 메소드(메소드명이 W로 끝나는 메소드)를 찾아 변경합니다.

  • 메소드가 유니코드를 지원하지 않는 경우 전달하는 문자열을 PAnsiChar로 형변환해 전달해야 합니다.

PAnsiChar로 형변환 시 데이터 손실이 발생할 수 있어 먼저 AnsiString으로 변환 후 PAnsiChar로 변환해야 합니다.(string을 바로 PAnsiChar로 변환 시 string에 영문이 있는 경우 무조건 그 다음 바이트에 0이 들어가 널바이트 문자열 처리하는 문자열 포인터에 일부 문자열만 전달됩니다.)
다음 예제와 같이 PAnsiChar로 형변환 후 데이터를 전달해야 합니다.
var path: string;
begin
  path := 'C:\Program Files\Internet Explorer\iexplore.exe';
  WinExec(PAnsiChar(AnsiString(path)), SW_SHOW);
end;

검토해야하는 대표적인 키워드(함수, 데이터타입)는 아래와 같습니다. 

 PChar

 AnsiChar

 PAnsiChar

 Pointer

 AppendStr

 GetProcAddress

 CreateProcess

 Chr

    



잠재적으로 수정될 필요가 있을 수 있는 코드

  • “of Char” 텍스트와 “of AnsiChar” 텍스트를 검색하여 버퍼가 유니코드에 맞게 사용되었는지 확인합니다. 

  • “string[” 텍스트를 검색하여 스트링 인덱스의 문자가 대입되는 변수가 Char(즉 WideChar)가 아닌 AnsiChar 타입 변수로 지정되도록 수정합니다. 

  • “AnsiString”, “AnsiChar”, “PAnsiChar”를 명시적으로 지정한 부분을 찾아 그럴 필요가 있고 제대로 되어 있는지 확인합니다. 

  • “ShortString”을 명시적으로 지정한 부분을 찾아 그럴 필요가 있고 제대로 되어 있는지 확인합니다. 

  • “Length(” 텍스트를 검색하여 Length가 SizeOf와 동일한 의미로 사용되지는 않았는지 확인합니다. 

  • “Copy(” , “Seek(” , “Pointer(” , “AllocMem(”, “GetMem(” 텍스트를 검색하여 스트링 혹은 문자 배열에 대해 제대로 동작하는지 확인합니다.


다음 내용을 통해 유니코드 적용에 대한 내용을 더 살펴볼 수 있습니다.

2.3. 유니코드 검토 대상 분석 도구 안내

위에서 소개한 유니코드 적용 시 검토 대상을 분석하고, 안내해 주는 도구입니다. 아래 링크에서 다운로드 할 수 있습니다.


마이그레이션 참고 리소스




저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 마이그레이션