Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

이 사이트 검색

검색 태그: '델파이'.

  • 태그로 검색

    태그 사이를 쉼표(,)로 구분하세요.
  • 작성자로 검색

콘텐츠 유형


게시판

  • 엠바카데로 (Embarcadero) 개발도구: 델파이 (Delphi), C++빌더 (C++Builder), RAD 스튜디오 (RAD Studio)
    • [기술 Q&A 게시판] 델파이, C++빌더, RAD 스튜디오
    • [설치/등록 Q&A 게시판] 델파이, C++빌더, RAD 스튜디오
    • [기술 기고 게시판] 델파이, C++빌더, RAD 스튜디오
    • [포트폴리오 게시판] 내가 참여한 프로젝트/프로그램 소개
    • [구인 게시판] 개발자 채용/프로젝트 의뢰
  • 엠바카데로 (Embarcadero) DBMS: 인터베이스 (InterBase)
    • [기술 Q&A 게시판] 인터베이스
    • [설치/등록 Q&A 게시판] 인터베이스
    • [기술 기고 게시판] 인터베이스
  • 비주얼 스튜디오 (Visual Studio) 관련 도구
    • [기술 Q&A 게시판] 비주얼 어시스트
    • [설치/등록 Q&A 게시판] 비주얼 어시스트
    • [기술 기고 게시판] 비주얼 어시스트
  • 구록 (Gurock) 테스트도구: 테스트레일 (TestRail)
    • [기술 Q&A 게시판] 테스트레일
    • [설치/등록 Q&A 게시판] 테스트레일
    • [기술 기고 게시판] 테스트레일
  • 아이데라 (Idera) 데이터 도구: 아쿠아 데이터 스튜디오 (Aqua Data Studio), ER/Studio 등
    • ER스튜디오 (ER/Studio)
    • 아쿠아 데이터 스튜디오 (Aqua Data Studio)
  • API레이어 (Apilayer) 개발 도구: API레이어 (Apilayer)
    • [Q&A 게시판] API레이어 (Apilayer)
  • 엠바카데로 (Embarcadero) 라이선스 서버: ELC (Enterprise License Center)
    • [게시판] ELC (Enterprise License Center) 라이선스 서버
  • 이 사이트 이용 관련
    • [게시판] 이 사이트 관련 이용 팁과 Q&A

Categories

  • 이달의 기술자료: 엠바카데로
  • 비디오 세미나
    • UX Summit
    • DelphiCon
    • CodeRage
    • 데브기어 세미나
    • Skill Sprint
  • 기술백서(PDF)

Categories

  • 시작하기
  • 설치/등록/라이선스
  • 튜토리얼
  • 도서

Categories

  • RAD 스튜디오 역사관
  • 11 알렉산드리아
  • 10.4 시드니
  • 10.3 리오
  • 10.2 도쿄
  • 10.1 베를린
  • 10.0 시애틀
  • XE8~XE
  • 2010~6.0

...에서 결과 찾기

검색어 일치 조건


최초 작성일

  • Start

    End


최종 변경일

  • Start

    End


개수로 필터링...

가입

  • Start

    End


Group


자주 쓰는 도구

  1. CnPack 등 델파이 IDE 애드-온 유틸리티, Spring4D 등 델파이 스프링 프레임워크, ZXing 바코드 처리 라이브러리 등등 델파이로 개발할 때 "크게" 도움이되는 오픈-소스 라이브러리와 리소스가 "엄선"되어 정리되어 있는 깃허브 저장소입니다. 겟잇 패키지 매니저 ( GetIt Package Manager)에 없는 것들도 상당히 많네요. https://github.com/Fr0sT-Brutal/awesome-pascal 위 링크는 이번 주 5일간 진행되는 엠바카데로 무료 온라인 부트캠프인 Coding Boot Camp 2022 – Learn to Program 중 실시간 세션 중에 언급 된 곳인데 (이미 많이들 알겠지만) 혹시 아직 모르는 개발자를 위해 남깁니다. 참고: 이 부트캠프 (위 링크에서 지금도 등록 가능) 시차 때문에 부담스럽게 생각했는데, 등록을 하면 일부 실시간 세션을 빼고는 편한 시간에 다시보기를 할 수도 있습니다.)
  2. 김나래

    델파이와 유니코드

    << 더 많은 엠바카데로 기술백서 보기 이 기술백서는 델파이 2009버전 기준으로 작성되었으며, 유니코드에 대한 내용을 다룹니다. 26개의 알파벳 문자를 기반의 영어로만 개발된 델파이 애플리케이션은 이전 버전에서도 잘 작동하며 델파이 2009에서도 잘 동작하지만, 전 세계의 언어를 위해 개발된 애플리케이션의 경우 Delphi의 유니코드 지원으로 뚜렷한 이점을 갖게 됩니다. 영어로 애플리케이션을 개발하더라도 번역 및 지역화를 하기가 쉽게 되었으며, 이제 아랍어, 중국어, 일본어, 키릴 문자 등의 텍스트가 포함된 데이터베이스 메모 필드를 포함한 모든 언어의 텍스트 데이터를 처리할 수 있습니다. 이 기술백서를 무료로 다운로드하기
  3. 김나래

    델파이XE2와 파이어몽키

    << 더 많은 엠바카데로 기술백서 보기 본 문서는 델파이 XE2버전 기준으로 작성되었으며, XE2에서 처음 선보인 파이어몽키에 대한 내용을 다룹니다. 개발자들이 델파이 XE2를 사용하는데 있어 중요한 장점들을 파악할 수 있습니다. 이 기술백서를 무료로 다운로드하기
  4. << 더 많은 엠바카데로 기술백서 보기 본 문서는 델파이 2009버전 기준으로 작성되었으며, 언어 기능에 대한 내용을 다룹니다. 델파이 2009에서 컴파일러에 추가된 새 기능은 매우 중요합니다. 유니코드 지원을 위한 문자열 타입 확장 이외에도 제네릭 데이터 타입, 익명 메소드 및 여러 "사소하지만" 흥미로운 기능들이 적용되었습니다. 이 기술백서를 무료로 다운로드하기
  5. << 더 많은 엠바카데로 기술백서 보기 본 문서는 델파이 2009버전 기준으로 작성되었으며, 언어 기능에 대한 내용을 다룹니다. 델파이 2009에서 컴파일러에 추가된 새 기능은 매우 중요합니다. 유니코드 지원을 위한 문자열 타입 확장 이외에도 제네릭 데이터 타입, 익명 메소드 및 여러 "사소하지만" 흥미로운 기능들이 적용되었습니다. 이 기술백서를 무료로 다운로드하기 View full 엠바카데로 기술자료
  6. << 더 많은 엠바카데로 기술백서 보기 본 문서는 델파이 XE2버전 기준으로 작성되었으며, XE2에서 처음 선보인 파이어몽키에 대한 내용을 다룹니다. 개발자들이 델파이 XE2를 사용하는데 있어 중요한 장점들을 파악할 수 있습니다. 이 기술백서를 무료로 다운로드하기 View full 엠바카데로 기술자료
  7. << 더 많은 엠바카데로 기술백서 보기 이 기술백서는 델파이 2009버전 기준으로 작성되었으며, 유니코드에 대한 내용을 다룹니다. 26개의 알파벳 문자를 기반의 영어로만 개발된 델파이 애플리케이션은 이전 버전에서도 잘 작동하며 델파이 2009에서도 잘 동작하지만, 전 세계의 언어를 위해 개발된 애플리케이션의 경우 Delphi의 유니코드 지원으로 뚜렷한 이점을 갖게 됩니다. 영어로 애플리케이션을 개발하더라도 번역 및 지역화를 하기가 쉽게 되었으며, 이제 아랍어, 중국어, 일본어, 키릴 문자 등의 텍스트가 포함된 데이터베이스 메모 필드를 포함한 모든 언어의 텍스트 데이터를 처리할 수 있습니다. 이 기술백서를 무료로 다운로드하기 View full 엠바카데로 기술자료
  8. Kori

    등록 방법

    위로 이동: 설치 방법 이 문서의 목적: 라이선스를 등록하려는 고객이 가장 먼저 찾는 문서 (Docwiki 문서를 기반으로 작성됨) RAD 스튜디오는 설치할 때마다 등록 과정을 거쳐야 사용할 수 있다. 등록은 엠바카데로 제품 등록(Embarcadero Product Registration) 도구의 3가지 다른 형태 중 알맞은 것을 사용하면 된다. Embarcadero Product Registration (등록) 대화상자: 시리얼번호 등록 시 사용 Embarcadero Product Registration (등록) 마법사: 시리얼번호 등록 또는 평가판 신청/등록 시 사용 License Manager (라이선스매니저) : 엠바카데로 제품의 라이선스를 보다 세밀하기 관리 시 사용 일반 설치파일을 사용하여 설치하는 경우, 도중에 Registration (등록) 대화상자가 나타난다. (단, 사용자가 등록 파일을 미리 넣어둔 경우에는 별도의 등록이 필요없다) 오프라인 설치파일을 사용하여 설치하는 경우, 사용자의 선택 (시리얼번호 사용 또는 정품 등록 파일 사용)에 따라 Registration (등록) 대화상자 또는 License Manager (라이선스매니저)가 나타난다. 만약 오프라인 설치파일 사용 중에 평가판 요청을 선택하면 모든 설치가 완료된 후에 Registration (등록) 마법사가 나타난다. 목차 1 Embarcadero Product Registration (등록) 대화상자 2 Embarcadero Product Registration (등록) 마법사 2.1 시작 페이지 2.2 새 EDN 계정 생성 페이지 2.3 활성화 링크 페이지 2.4 시리얼번호 등록 페이지 3 License Manager(라이선스매니저) 4 엠바카데로 제품 등록 웹사이트 4.1 정품 등록 파일 확보하기 4.2 구입 후, 설치를 하지는 않지만 일단 등록만 미리 해두기 4.3 보유한 시리얼번호를 몇번 더 설치/등록을 할 수 있는지 미리 알아보기 5 관련 주제 1 Embarcadero Product Registration (등록) 대화상자 등록대화상자는 시리얼번호와 EDN 계정 로그인 정보를 사용하여 RAD 스튜디오를 등록할 때 사용할 수 있다. 입력 항목 Serial Number: 엠바카데로의 ESD 라이선스 이메일을 통해 받은 시리얼번호 EDN Login Name or Email: 시리얼번호가 연결된 EDN 계정의 로그인명 또는 이메일 EDN Password (비밀번호): 해당 EDN 계정의 비밀번호 자동 표시 항목: Registration Code: 정품 등록 시 꼭 필요한 숫자 값이다. 컴퓨터 별로 (그 컴퓨터 만의) 항상 같은 값이 자동으로 표시된다. 주의! 설치 후 Registration Code가 달라지면, 기존의 등록이 더이상 유효하지 않으므로, 다시 등록하게 된다. 위 입력 항목을 모두 입력하고 [Register]를 클릭하면 등록이 완료된다. 2 Embarcadero Product Registration (등록) 마법사 등록마법사는 시리얼번호를 등록하거나 또는 평가판을 신청/등록할 때 사용할 수 있다. 정품 등록 파일을 사용하려면 라이선스매니저를 사용해야 한다. 2.1 시작 페이지 다음 중 하나를 선택할 수 있다. RAD 스튜디오 평가판을 활성화 하려면, 이메일 주소를 입력하고 [Next]를 클릭한다. 만약 입력한 이메일이 EDN 계정과 일치하면, 평가판용 시리얼번호가 이메일로 전달되고, 시리얼번호 등록 페이지가 열린다. 만약 일치하는 이메일이 없다면, 새 EDN 계정 생성 페이지가 열린다. 시리얼번호를 사용하여 RAD 스튜디오를 등록하려면, "I have a serial number"를 선택한다. 그러면, 시리얼번호 등록 페이지가 열린다. 다른 방식을 사용하기 위해 라이선스매니저를 열려면, "I have a license file"을 선택한다. 2.2 새 EDN 계정 생성 페이지 새 EDN 계정 생성 페이지에서는 EDN 계정을 새로 생성할 수 있다. EDN 계정이 반드시 있어야 RAD 스튜디오를 설치를 마칠 수 있다. 입력 항목: - First name / Last name: EDN 계정 실사용자의 성명 - Email: 수신가능한 이메일 주소 (회사의 라이선스인 경우, '회사메일'를 사용!) - Password / Confirm Password: 새 EDN 계정의 비밀번호 - Company: 회사명 - Phone number: 담당자 전화번호 - Country: Korea (South)를 선택 위 항목을 모두 입력하고 [Next] 버튼을 클릭하면, EDN 계정이 새로 생성되고 입력한 이메일로 활성화 링크가 전달된다. 그리고 활성화 링크 페이지가 열린다. 2.3 활성화 링크 페이지 활성화 링크 페이지는 엠바카데로에서 계정 활성화 링크를 이메일로 전달했다고 알려준다. 해당 이메일의 받은 편지함에서 이메일을 열고 활성화 링크를 클릭하면, 웹페이지가 열리고 제품이 성공적으로 등록되었다는 메시지가 표시된다. 주의! 활성화 링크는 반드시 RAD 스튜디오를 설치할 컴퓨터에서 클릭해야 한다. 모바일 장비 등 다른 컴퓨터에서 실수로 열었을 경우에는 엠바카데로에 연락하여야 한다. 2.4 시리얼번호 등록 페이지 시리얼번호 등록 페이지에서 등록 대화상자와 같은 방법으로 시리얼번호를 사용하여 RAD 스튜디오를 등록한다. 입력 항목 Serial Number: 엠바카데로의 ESD 라이선스 이메일을 통해 받은 시리얼번호 팁! 옆에 있는 [Advanced] 버튼을 클릭하면 라이선스매니저가 열린다. EDN Login Name or Email: 시리얼번호가 연결된 EDN 계정의 로그인명 또는 이메일 EDN Password (비밀번호): 해당 EDN 계정의 비밀번호 자동 표시 항목: Registration Code: 컴퓨터 별로 항상 같은 고유한 숫자 값이 자동으로 표시된다. 주의! 설치 후 Registration Code가 달라지면, 기존의 등록이 더이상 유효하지 않으므로, 다시 등록하게 된다. 위 항목을 모두 입력하고 [Next] 버튼을 클릭하면 등록이 완료되고 [Finish]버튼이 있는 화면이 열린다. 3 License Manager(라이선스매니저) 라이선스매니저에서는 다음과 같은 것을 할 수 있다. 시리얼번호 등록/등록취소 정품 등록 파일 Import 라이선스 정보 조회 설치된 라이선스 업데이트 라이선스 관리 이슈 해소를 엠바카데로에서 도울 수 있도록 로그 생성 ELC 라이선스 관리 화면은 세로로 3개의 창으로 나뉘어져 있다. 왼쪽 창: 컴퓨터에서 사용 중인 제품 라이선스의 목록 가운데 창: 왼쪽 창에서 선택된 라이선스에 관한 상세 설명 오른쪽 창: 사용자가 수행할 수 있는 작업 목록 사용자가 수행할 수 있는 작업 Register: 등록 대화상자 열기 Import: 파일 선택 대화상자를 열어서 엠바카데로 정품 등록 파일을 찾아서 임포트(reg*.txt or *.slip). Update: 라이선스와 시리얼번호 정보를 인터넷에서 업데이트 Add Serial: 대화상자를 열고 시리얼번호를 입력하여 왼쪽 창의 등록되지 않은 시리얼번호(Unregistered serial numbers) 목록에 추가. 받은 시리얼번호를 실제로 등록하지 않고도 관련된 상세 정보를 조회할 수 있다. 등록되지 않은 시리얼번호(Unregistered serial numbers) 목록에 있는 시리얼번호를 등록하려면, 원하는 시리얼번호를 선택하고 Register를 한다. Delete: 왼쪽 창의 licenses 또는 Unregistered serial numbers 목록에서 시리얼 번호를 선택하고 컴퓨터에서 제거한다. Create Support Log: 엠바카데로 지원팀에 연락할 때 제공할 수 있도록 라이선스 관련 상세 정보가 기록된 파일을 생성한다. Check out (ELC 사용자 전용): 네트워크 concurrent licenses를 오프라인에서 사용할 수 있도록 체크아웃 Check in (ELC 사용자 전용): 오프라인에서 사용하던 네트워크 concurrent licenses를 다시 서버에 연결 4 엠바카데로 제품 등록 웹사이트 엠바카데로 제품 등록 웹사이트는 다음 용도로 사용된다. 오프라인 설치 과정에서 제품을 등록할 때 필요한 정품 등록 파일을 확보하기 구입 후, 설치를 하지는 않지만 일단 등록만 미리 해두기 보유한 시리얼번호를 몇번 더 설치/등록을 할 수 있는지 미리 알아보기 4.1 정품 등록 파일 확보하기 정품 등록 파일이 필요한 상황 (시리얼번호와 EDN로그인을 직접 사용하지 못하는 특수한 경우) 인터넷이 연결되지 않은 컴퓨터에서 RAD 스튜디오를 사용하기 위해 등록할 때 필요하다. 등록 횟수 낭비 방지 목적으로, 정품 등록 파일 확보하기 위해 이 절차를 진행할 필요는 "전혀" 없다. 설치 과정에 시리얼번호로 등록해도 정품 등록 파일은 확보된다. 확보 및 사용 절차 정품 등록 파일(reg*.txt 또는 *.slip)을 생성하는 웹페이지에 접속한다. 대부분의 버전: https://reg.codegear.com/ 7.x 이하 버전 (6.x 버전 제외): http://reg.borland.com (등록 마법사 화면에서는 "Register by Phone" 옵션 선택) 6.x 버전: https://reg.codegear.com/srs6/sanctOneActivation.do;jsessionid=117DEF8A3FFDB33D78065354A0FC4C9D 정품 등록에 사용될 시리얼번호가 연결된 EDN 계정으로 로그인한다. (실수로 잘못된 EDN 계정에 등록되면 안되므로) 다음 단계를 진행하기 전에 '반드시' 화면에 표시된 [LOG OFF | 이름] 을 찾아서, 원하는 EDN 계정으로 로그인 되었는지를 다시 확인한다. 주의! 업그레이드 라이선스를 구입한 고객은 이전 버전이 등록된 EDN 계정을 사용해야 한다. 아래 항목에 정보를 입력하고 [Next]를 클릭한다. Serial Number: 엠바카데로의 ESD 라이선스 이메일을 통해 받은 시리얼번호 Registration Code: 오프라인 설치파일로 RAD 스튜디오를 설치하기 3단계: 정품 등록 파일 확보하기에서 메모한 숫자 앞에서 입력한 정보가 표시되는 페이지가 열리면, 페이지 하단의 [Download or email the activation file] 에서 Download 또는 Email을 선택하고 [Register]를 클릭하면 등록이 완료되고 (직접 다운로드 또는 이메일로) 정품 등록 파일(reg*.txt 또는 *.slip)이 제공된다. RAD 스튜디오를 설치하는 컴퓨터에서 정품 등록 파일을 사용하여 등록을 완료한다. 오프라인 설치파일로 설치하는 경우: 정품 등록 파일을 RAD 스튜디오를 설치하는 컴퓨터에 넣고 오프라인 설치파일로 RAD 스튜디오를 설치하기 3단계: 정품 등록 파일 확보하기 단계를 마저 진행한다. 일반 설치파일로 설치하는 경우: 일반 설치파일 사용법 1.1의 안내에 따라 정품 등록 파일을 알맞은 폴더에 미리 넣은 후에 설치를 시작한다. 4.2 구입 후, 설치를 하지는 않지만 일단 등록만 미리 해두기 주의! 설치를 하지 않아도, 등록하려면 [Register]를 클릭해야 한다. 그 결과 하여 사용자가 해당 시리얼번호 등록 의사가 전달되므로, 해당 등록 가능 횟수가 1회 차감된다. 위 RAD 스튜디오를 인터넷이 연결되지 않은 컴퓨터에서 사용하기 위해 정품 등록 파일 확보하기 절차 1~5단계까지만 진행하면 된다. 이때, 4단계의 Registration Code에는 111111 또는 111111를 입력한다. (컴퓨터 고유값인 Registration Code는 설치 과정에만 알 수 있다) 제품이 등록되었는 지 확인하기: 등록이 잘 되었다면, EDN 서비스로 가서 "My Registered Products" 목록에 등록한 제품(과 시리얼 번호)이 들어 있어야 한다. 또는, 아래의 시리얼 번호에 몇번 더 설치/등록 할 수 있는지 미리 알아보기 결과, 등록 횟수가 0이 아니어야 한다. 4.3 보유한 시리얼 번호를 몇번 더 설치/등록을 할 수 있는지 미리 알아보기 위 RAD 스튜디오를 인터넷이 연결되지 않은 컴퓨터에서 사용하기 위해 정품 등록 파일 확보하기 절차 1~4단계까지 진행하고 5단계에서는 [Register]를 클릭하지 말고, 대신 "View extended serial number details." 링크를 찾아서 클릭한다. (팁! [Register]를 클릭하지 않으면 등록이 완료되지 않고 등록 횟수도 차감되지 않음) 이때, 4단계의 Registration Code에는 111111 또는 111111를 입력한다. (컴퓨터 고유값인 Registration Code는 설치 과정에만 알 수 있다) Serial number details (상세 정보) 페이지에서 등록 횟수를 파악할 수 있다. Serial Number: 시리얼번호(와 해당 제품 버전과 라이선스 정보) Logged in user: 현재 로그인한 EDN 계정명 Ownership status: 위 EDN 계정이 위 시리얼번호의 보유자인지 여부 (주의! 보유자가 아니라고 표시되면 아래에 표시된 등록 횟수는 정확하지 않음) Current Registration count/Maximum: 현재 등록횟수 / 최대 등록 횟수 한도 (예: 3/5 라고 표기되어 있다면 총 5회의 설치 횟수 중 3회를 사용하였고 2회 더 설치가 가능함을 의미한다.) 설치 횟수가 다 찬 경우에는 엠바카데로 본사에 제품 등록 한도 증가를 요청해야 한다. 5 관련 주제 설치 방법 일반 설치파일 사용 오프라인 설치파일 사용
  9. << DelphiCon 2021 목록으로 이동 원본 비디오(YouTube) 보기 (30 min) DelphiCon 의 2021 시리즈 중, Things That You Don’t Know About JSON in Delphi - Dion Carlos Mai & Gustavo Mena Barreto (25 min) 의 한글 요약본입니다. 델파이에서 JSON을 다루는 방법, JSON 파서를 가장 생산적으로 사용하는 방법, JSON 직렬화 작동을 커스터마이징하고 자동화하는 옵션을 설명합니다. 발표자 Gustavo Mena Barreto는 Aquasoft 선임 개발자이며, Dion Carlos Mai은 Aquasoft 개발팀장입니다. 이 세션에서 사용된 전체 소스코드: https://github.com/gustavomenabarreto/delphicon2021 목차 델파이에서 JSON 다루기를 주제로 정한 이유 JSON을 다룰 때 델파이에서 선택할 수 있는 것들 이 세션에서 사용할 JSON 샘플 JSON을 사용하기 위해 필요한 델파이 유닛(들) 1. 가장 간단한 방법 JSON 읽기 (아래 코드와 주석 참조) JSON 쓰기 (아래 코드와 주석 참조) 2. JsonToDelphi JSON 직렬화 행위를 변경하는 옵션(들) 3. Super Object (오픈소스) 4. RESTResponseDataSetAdapter 컴포넌트 REST API를 통해서 JSON 데이터를 받아서 델파이 폼에 표현하기 5. TJSONMarshal 클래스 델파이에서 JSON 다루기를 주제로 정한 이유 요즘 개발자에게 JSON은 매우 중요한 자리를 차지하고 있다. 요즘은 API 통합이 너무나 많다. 심지어 NoSQL JSON 데이터베이스도 있다. JSON을 다루는 방법이 여러가지 라는 사실을 잘 모르는 개발자들이 있다. 이 세션에서는 JSON을 다루는 여러 가지 방법을 설명한다. JSON을 다룰 때 델파이에서 선택할 수 있는 것들 가장 간단한 방법 JsonToDelphi: JSON 오브젝트를 가지고 델파이 클래스를 자동 생성하는 웹사이트 Super Object (오픈소스): 델파이 6, 7 등 구버전에서 JSON을 다룰 수 있음 (최신 버전 사용자에게는 권장하지 않음) RESTResponseDataSetAdapter 컴포넌트: JSON을 기반으로 데이터셋을 자동 생성 TJSONMarshal 클래스: JSON 직렬화 처리를 커스터마이징할 때 사용 이 세션에서 사용할 JSON 샘플 그림. 이 세션의 코드는 비트코인 블록체인에서 사용되는 매우 구조가 큰 JSON에서 극히 일부분만 뽑아 놓은 샘플 JSON을 사용한다. JSON을 사용하기 위해 필요한 델파이 유닛(들) uses System.JSON, REST.Json; 1. 가장 간단한 방법 TJSONObject와 TJSONArray를 사용하는 방법 JSON 읽기와 쓰기 (아래 코드와 주석 참조) // [JSON 읽기] var objeto : TJSONObject; ObjetoArray: TJSONArray; I: Integer; begin // ParseJSONValue를 이용하면, 단 한줄로 JSONObject를 만들 수 있다. objeto := TJsonObject.ParseJSONValue(MemoJson.Lines.Text) as TJSONObject; // JSONObject의 Get과 GetValue 메소드를 이용하면, JSON 개체의 모든 데이터에 접근할 수 있다. ShowMessage(objeto.Get('block_hash').ToString); ShowMessage(objeto.GetValue('block_hash').Value); // 배열 형식의 JSON값은 TJSONArray로 받을 수 있다. ObjetoArray := objeto.Get('inputs').JsonValue as TJSONArray; // JSONArray 안에 있는 각 요소는 for 루프를 통해 접근할 수 있다. for I := 0 to ObjetoArray.Size - 1 do begin MemoResultado.Lines.Add( ObjetoArray.Get(i).ToString + ': ' + ObjetoArray.Get(i).Value); end; end; // [JSON 쓰기] var objeto : TJSONObject; ObjetoArray: TJSONArray; ObjetoInputs: TJSONObject; begin objeto := TJSONObject.Create; ObjetoArray := TJSONArray.Create; // JSONObject의 AddPair (필드 이름, 필드 값) 메소드를 사용하여 데이터 쓰기 // 필드 값에 문자열 넣기 objeto.AddPair('block_hash','123456789'); // 필드 값에 JSONObject의 일종인 JSONArray 넣기 Objeto.AddPair('Inputs',ObjetoArray); // 'Input' 필드 값인 ObjetoArray에 들어 갈 JSONObject 만들기 ObjetoInputs := TJSONObject.Create; // 위와 동일하게 AddPair를 사용하여 JSONObject에 데이터 쓰기 ObjetoInputs.AddPair('prev_hash','987654321'); ObjetoInputs.AddPair('script','1'); // JSON 배열인 ObjetoArray의 Add 메소드를 이용하여, 배열 안에 요소 넣기 ObjetoArray.Add(ObjetoInputs); MemoResultado.Lines.Text := objeto.ToString; end; 2. JsonToDelphi https://jsontodelphi.com는 JSON 샘플을 넣으면, 해당 JSON을 다룰 수 있는 델파이 클래스를 자동으로 받을 수 있는 웹사이트이다. SOAP / XML 파서와 사용 방식이 상당히 유사하지만, XML이 아니라 JSON을 다룬다. 우리가 직접 해당 클래스를 만들기 위해 수작업으로 코드를 작성할 수도 있지만, 많은 API들이 방대한 JSON을 사용하고 있는데, 그 JSON을 모두 클래스로 만들 기 위해 수작업으로 코드를 쓰려면, 시간도 많이 걸리고 너무 수고스럽다. 무료 서비스인 이 웹사이트를 이용하면 그 모든 수고를 덜 수 있다. 생성된 클래스의 전체 소스 코드를 다운로드 할 수 있으므로, 필요한 부분을 직접 변경할 수도 있다. // [JsonToDelphi에서 만들어 준 클래스 사용하여 읽기] // 제공한 JSON 샘플의 구조가 모두 반영된 클래스가 생성되므로, 그냥 사용하면 된다. var TesteJson: TRoot; Inputs: TInputs; begin // JsonToDelphi가 만들어준 클래스 안에 JSON을 읽어서 넣기 TesteJson := TJson.JsonToObject<TRoot>(MemoJson.Lines.Text); // 데이터 타입까지 이미 알맞게 지정된 해당 클래스의 프로퍼티를 통해 JSON 필드를 접근 ShowMessage('BlockHash - '+TesteJson.BlockHash); for Inputs in TesteJson.Inputs do begin Showmessage('ScripType - '+Inputs.ScriptType); end; end; // [JsonToDelphi에서 만들어 준 클래스 사용하여 쓰기] var TesteJson: TRoot; Inputs: TInputs; I: Integer; begin // JsonToDelphi에서 만들어 준 클래스를 생성하고 TesteJson := TRoot.Create; // 프로퍼티를 이용하여 값을 쓴다. TesteJson.BlockHash := 'www.aquasoft.com.br'; // 마찬가지 방법으로 배열을 돌면서 값을 쓸 수도 있다. for I := 0 to 2 do begin Inputs := TInputs.Create; Inputs.Age := 20; Inputs.Script := 'teste script'; TesteJson.Inputs.Add(Inputs); end; // 단 한줄로 JSON 데이터를 문자로 풀어낼 수 있다. MemoResultado.Lines.Text := //이 때 joIgnoreEmptyStrings 옵션을 사용하면, 값이 빈 문자열인 데이터는, JSON 필드를 만들 지 않고 건너뛴다. // joIgnoreEmptyStrings는 델파이의 TJsonOption의 일종이다 (아래 본문의 설명 참조) TJson.ObjectToJsonString(TesteJson,[joIgnoreEmptyStrings]); end; JSON 직렬화 행위를 변경하는 옵션(들) 델파이의 REST.Json.TJsonOption https://docwiki.embarcadero.com/Libraries/Sydney/en/REST.Json.TJsonOption JSON 생성 작동 방식 중 원하는 옵션을 선택할 수 있다. 예: 유닉스 날짜 포맷 사용하기, UTC 날짜 사용, 들여쓰기, 카멜 표기, 등등 델파이 버전이 최신일수록 선택할 수 있는 직렬화 옵션이 더 많다. 이전 버전이라서 필요한 옵션이 없다면, 원하는 작동을 하는 코드를 수작업으로 써 넣는다. [그림. 델파이 11.0 알렉산드리아의 TJsonOption (참고: 이전 버전에는 옵션이 이것처럼 많지 않다)] 3. Super Object (오픈소스) 델파이 6, 7 등 구버전에서 JSON을 다룰 수 있음 무료 오픈 소스: https://github.com/hgourvest/superobject 델파이가 오래된 버전이지만, API 연동을 위해 JSON을 다루어야 한다면 이런 역할을 하는 DLL 또는 패키지의 도움을 받을 수 있다. 하지만, 직접 코드로 구현하려면 Super Object를 사용할 수 있다. 주의! 앞에서 설명했듯이, 최신 버전에는 이미 이런 기능들이 들어있으므로, Super Object를 굳이 사용할 이유가 없음 // [SuperObject를 사용하여 읽기] var Objeto: ISuperObject; Inputs: ISuperObject; begin // SuperObject의 SO 메소드를 사용하여 오브젝트를 생성 Objeto := SO(MemoJson.Lines.Text); // S 메소드는 원하는 필드와 값을 마치 배열처럼 접근 ShowMessage(Objeto.S['block_hash']); ShowMessage(Objeto['block_hash'].AsString); // for 루프 사용 가능 (for in 루프는 델파이 7 같은 구버전에는 없지만, for 문으로 유사하게 구현하면 된다.) for Inputs in objeto['inputs'] do begin MemoResultado.Lines.Add(Inputs.AsString); end; end; // [델파이 구버전에서 SuperObject를 사용하여 쓰기] var Objeto: ISuperObject; Inputs: ISuperObject; begin // 오브젝트 생성 Objeto := SO; // 데이터 쓰기 역시 마치 배열을 다루듯이 사용 Objeto.S['block_hash'] := '123456789'; Objeto.O['inputs'] := SA([]); Inputs := SO; Inputs.S['script'] := 'Teste script 1'; Inputs.I['age'] := 30; // JSON 배열을 쓸 수도 있다. Objeto.A['inputs'].O[0] := Inputs; Inputs := SO; Inputs.S['script'] := 'Teste script 2'; Inputs.I['age'] := 60; Objeto.A['inputs'].O[1] := Inputs; // AsString 메소드를 사용하여 JSON으로 쓸 수도 있다. MemoResultado.Lines.Text := Objeto.AsString; end; 4. RESTResponseDataSetAdapter 컴포넌트 RESTResponse에 받은 JSON 데이터를 FDMemTable 등의 데이터셋에 넣어주는 컴포넌트 (델파이 최근 버전에서 추가됨) [그림. REST 디버거를 사용하면 더 쉽게 만들 수 있다] REST API를 통해서 JSON 데이터를 받아서 델파이 폼에 표현하기 REST 디버거 (REST API의 읽기와 쓰기를 테스트하는 무료 도구)를 실행한다. 테스트가 성공했다면, [Copy Components] 버튼을 클릭한다. 그러면, 해당 REST API를 다루도록 설정이 완료된 델파이 컴포넌트가 클립보드에 복사된다. RESTClient: REST 서비스 제공자에게 요청을하고 응답을 받는 사용자 오브젝트 RESTRequest: RESTClient가 REST 서비스 제공자에게 전달하는 요청 RESTResponse: RESTClient가 REST 서비스 제공자로부터 전달받은 응답 RESTResponseDataSetAdapter: 전달받은 응답을 FDMemTable 등의 데이터셋에 넣어주는 매개체 FDMemTable: 데이터셋 델파이 폼에서 붙여넣기를 하면, 복사된 컴포넌트가 모두 추가되고, 되델파이 프로젝트에서 바로 사용할 수 있다. 그 후에는, 일반 데이터와 마찬가지로 FDMemTable을 사용하면 된다. 함께 복사된 REST 관련 컴포넌트들이 자동으로 이 데이터셋에 JSON 데이터를 담는다. FDMemTable 이 가장 좋고 편한 데이터셋이기 때문에 사용한다 (원한다면 다른 데이터셋을 사용해도 된다) 예를 들어, 데이터가 표현될 그리드의 데이터소스 즉 DataSource 컴포넌트의 DataSet 프로퍼티에 FDMemTable를 지정하면 된다. 직접 작성해야할 코드는 2줄 뿐이다 (아래 코드 참조) procedure TForm1.Button5Click(Sender: TObject); begin // REST 요청을 한다 RESTRequest1.Execute; // RESTResponse에 받은 JSON 데이터를 FDMemTable 등의 데이터셋에 넣기 RESTResponseDataSetAdapter1.Active := True; end; 5. TJSONMarshal 클래스 JSON 데이터 직렬화 알고리즘을 커스터마이징 할 수 있다. RTTI를 직접 건드릴 필요가 없기 때문에 보다 안전하고 편하다. RTTI를 잘못 다루면 쓰레드 문제가 발생할 수 있다. JSON을 다룰 때는 쓰레드를 사용하고 JSON 구조를 알맞게 맞추어 쓰는 것이 좋다. 보다 자세한 내용은 사용자 오브젝트 직렬화에 대한 상세한 Docwiki 도움말을 참고하기 바란다. // [TJSONMarshal을 사용하여 맞춤 JSON 구현하기] var lMarshal : TJSONMarshal; TesteJson: TRoot; //JsonToDelphi에서 제공하는 SuperObject 타입을 사용 Inputs: TInputs; I: Integer; begin TesteJson := TRoot.Create; // 오브젝트 생성 (SuperObject) TesteJson.BlockHash := 'www.aquasoft.com.br'; for I := 0 to 2 do begin Inputs := TInputs.Create; Inputs.Age := 20; Inputs.Script := 'teste script'; TesteJson.Inputs.Add(Inputs); end; // JSONMarshal을 생성할 때 컨버터를 지정 (커스터마이징을 위해 컨버터를 이용하는 것은 뒤에서 설명) lMarshal := TJSONMarshal.Create (TJSONConverter.Create); // Marshal 메소드를 사용하면 컨버터에 지정된 대로 컨버전 된다. MemoResultado.Lines.Text := lMarshal.Marshal(TesteJson).ToString(); lMarshal.Free; end; JSON 커스터마이징 방식 1: JSONMarshalled 어트리뷰트 사용 [JSONMarshalled(False)] // 이 어트리뷰트에서 False로 지정된 것, 즉 FScript는 생성될 JSON의 필드에 들어가지 않는다. FScript: string; JSON 커스터마이징 방식 2: RegisterConverter 프로시저를 오버로딩하기 프로시저 오버로딩을 통해 파서인 TJSONMarshal 클래스의 기본 전환 방식을 덮어쓰는 방법 JSON의 특정 필드의 데이터 타입 바꾸기 등 얼마든지 처리 로직을 바꿀 수 있다. (굳이 RTTI를 건드리지 않아도 된다) 좀 복잡하긴 하지만, 필요하다면 이처럼 TJSONMarshal 클래스를 생성할 때 컨버터를 파라미터로 넣는 방식을 쓸 수 있다. << DelphiCon 2021 목록으로 이동
  10. << DelphiCon 2021 목록으로 이동 원본 비디오(YouTube) 보기 (30 min) DelphiCon 의 2021 시리즈 중, Leaving Delphi 7 - A Success Migration Case - Dion Carlos Mai & Rafael Pereira (30 min) 의 한글 요약본입니다. 20년이 넘었고, 델파이 7로 운영하던 대형 시스템을 델파이 10으로 마이그레이션한 프로젝트를 정리한 내용을 공유합니다. 발표자 Rafael은 이 소매점 시스템 제공자인 Stone Co의 개발자입니다. 목차 회사 및 프로젝트 소개 현대화 마이그레이션을 계획하게 된 동기와 결과 마이그레이션 프로젝트의 개요 마이그레이션 프로젝트의 진행 단계 1단계 (분석 단계) 2단계 (실행 단계) 3단계 (검증 단계) 4단계 (배포 단계) 프로젝트를 통해 배운 점 참고 자료 그림 자료 회사 및 프로젝트 소개 회사 소개: Stone Co Linx: 뉴욕 증시에 상장된 브라질의 소프트웨어 기업. 브라질의 소매점 소프트웨어 시장에서 점유율 45.6% Stone: 뉴욕 증시에 상장된 브라질의 Stone Co.의 핀테크 기업. 지불 관리 도구와 유연한 금융 상품을 제공 Stone Co: 2012년에 시작하여 브라질 전역을 커버하고 있다. 2020년 11월, Stone Co는 Linx를 인수 대상 시스템 소개: Linx Big 20년이 넘은 소매점 소프트웨어. 약국에서 주로 사용 현재 3,000개가 넘는 고객사와, 5,000개가 넘는 소매점에서 사용 중 (2개 이상을 사용하는 점포가 많으므로, 배포된 소프트웨어는 훨씬 더 많음) 현대화 마이그레이션을 계획하게 된 동기와 결과 윈도우10은 2021년 10월 현재 전세계 데스크탑 점유율의 80%이상을 차지하고 있고 계속 증가하는 추세임 (관련 통계 보기) 윈도우 10에 집중해야 하는 상황 윈도우 10의 새 운영체제 기능을 충분히 지원하는 IDE 기능이 필요 윈도우 10에 맞는 더 좋은 시각적인 UI가 필요 (그림 참조: 예전 화면과 새 화면 비교) 스타일, 대시보드, 그래프, 메뉴 등 더 풍부한 화면을 제공하여 외관상 완전히 다른 새 소프트웨어로 보임 (그림 참조: 새 화면) 델파이 10에 내장된 컴포넌트와 스타일만 사용하여 화면 개발 새 UI를 구현하기 위한 코드는 새로 작성 하지만, 모든 클래스와 소스 코드는 예전 델파이 7과 거의 같음 스레드가 필요 요즘 소프트웨어는 API 통합이 많다. 델파이 7에서도 스레드를 구현할 수 있다. 하지만, 델파이 7은 소프트웨어를 개발하기에 여전히 매우 훌륭한 도구이지만, 20년 전에 나온 오래된 버전이다. 델파이 최신 버전을 사용하지 않으면, API 통합을 모두 지원하거나 JSON 직렬화하기 등 새 기술을 반영하기가 어렵다. 기타 개선 델파이 10의 장점을 가질 수 있게 됨: 64비트 지원, 윈도우 10 지원, FireDAC으로 데이터 연결, 다른 운영체제에서 접근 등등 델파이 10 시애틀을 선택한 이유 당시 우리 개발자 대부분이 사용할 수 있는 라이선스를 이미 가지고 있었기 때문 마이그레이션 프로젝트의 개요 목표 델파이 7에서 델파이 10 시애틀로 이전 마리아DB 10.4.13과 MySQL 8.0.21 지원 개요 기간: 총 7 개월 투입 인원 외부: 3명 (아쿠아소프트 개발자, 마이그레이션에만 집중) 내부: 22명 (개발자, QA, 델파이 프로젝트 별 책임자) 마이그레이션 대상 (소매점 관리 시스템)의 규모 델파이 프로젝트: 65개 모듈: 194개 .PAS 파일: 6,000개 .DFM 파일: 2,000개 코드 줄 수: 2백만줄 써드 파티 컴포넌트 세트: 23가지 마이그레이션 프로젝트의 진행 단계 총 4단계로 나누고, 앞 단계 완료 시 다음 단계를 진행: 분석, 실행, 검증, 배포 1단계 (분석 단계) 개요 기간: 3.5개월 투입 인원 외부: 3명 (아쿠아소프트 개발자) 내부: 2명 (개발자 1명, QA 1명) 목표 측정 / 식별 / 문서화 델파이 10으로 마이그레이션이 끼칠 영향 새 데이터베이스와의 호환성 프로젝트로 인해 달라지는 점과 문제점 변경으로 인해 발생될 것으로 예상되는 문제 해소 자동 변환 도구 개발 작업 내용 외부 인력 (아쿠아소프트) 합류 전환할 컴포넌트를 3가지로 나누어 분석하고 대비 버전의 수명이 다한 컴포넌트 마이그레이션 시 문제가 많고, 작업도 많이 해야 하는 것들임 이 프로젝트에서 많이 사용될 컴포넌트 프로젝트에서 사용되는 비중이 크기 때문에, 그 만큼 프로젝트에 끼치는 영향도 큰 것들임 소스코드가 없는 컴포넌트 매우 이상하게 작동할 수 있고 마이그레이션 작업을 까다롭게 만들기 때문에 주의해야 할 것들임 예: Zeos (2003년부터 사용한 오픈 소스 데이터베이스 컴포넌트) [에러가 발생되는 코드] QPrincipal.FieldByName('datapre').AsDateTime :=now; 짐작하겠지만, 상업용 시스템에서 매우 많이 사용되는 코드이며, 모두 수정해야 하므로, 에러 해소 작업이 많다. 델파이 버전 간의 차이와 충돌을 식별하고 해소 유니코드 (영향 받는 dll이 있는 지까지도 파악할 필요가 있음) 자동 변환 도구 개발 ("마이그레이션 찾아 바꾸기"라고 이름 지음) 소스 변환 자동화 도구 개발을 이 분석 단계 안에서 완성 (그림 참조: 소스 변환 자동화 도구와 변환 결과) Zeos에서 UniDAC으로 마이그레이션하는 도구 마법사가 발생시키는 버그 수정 자동화 사용되는 모든 컴포넌트 마이그레이션 자동화 (많은 컴포넌트에서 일부 프로퍼티가 변경되었기 때문) 델파이 10과 델파이 7과의 차이로 인해 필요한 코드 변환 자동화 "모든" 소스를 변환할 수 있는 "맞춤" 도구 완성 소스 코드 동기화 소스 코드 동기화는 매우 중요! 마이그레이션 프로젝트 진행 중에도 전체 배포까지 완료되기 전까지는 전환해야 할 코드가 계속 변하기 때문이다. 분석 단계가 진행되는 중에도 내부 개발자 20명은 여전히 기존 코드나 화면을 변경하고 새 기능을 추가한다. 즉, 마이그레이션 대상인 델파이 7 소스 코드가 계속 변한다. 2단계 (실행 단계) 모든 코드를 변경하는 단계 개요 기간: 2일 (사전 준비가 완료되었으므로 가능) 참여 인원 외부: 1명 (아쿠아소프트 개발자) 내부: 1명 (개발자) 목표 코드 "전체"를 자동 변환 도구를 사용하여 델파이 7에서 델파이 10으로 변경 작업 내용 진행 전 실행 단계 직전에 기존 프로그램 변경을 금지 1일차 자동 변환 도구를 사용하여 변환 개발자 2명이 6시간 만에 완료 총 4,678개 소스 파일을 변경 2일차 컴포넌트 적합성, 데이터베이스 적합성이 파악된다. 모든 변경이 계획대로 되었는 지를 검증 3단계 (검증 단계) 개요 기간: 2.5 개월 참여 인원 외부: 3명 (아쿠아소프트 개발자) 내부: 22명 (개발자, QA, 델파이 프로젝트 별 책임자) 목표 모든 델파이 프로젝트와 모든 작동을 검증, 버그 파악 및 해소 팀 구성 개발자 (버그 픽스 전담) 그룹 개발자 (일반) 그룹 QA 그룹 델파이 프로젝트 별 책임자 그룹 작업 내용 검증 단계 시작 전 (즉, 실행 단계인 2일 간) 델파이 10 사용자 교육 이유: 모든 개발자는 이 검증 단계 시작을 기준으로, 그 이후에는 델파이 10만 사용 (그 이전에는 델파이 7만 사용) 내용: 델파이 10 사용법, 새 기능, 검증 단계 및 이후 유지 보수 시 작업 절차 결과: 개발자 등 모든 참여 인원이 검증 단계에 참여할 준비를 완료 검증 단계 시작 직후 버그가 매우 많이 보고되었고, 버그의 대부분을 신속하게 해소했다. 자동 변환 도구를 이용했기 때문이다. 버그 발생: 변환 도구에 버그가 있으면, 변환된 시스템에도 버그가 생긴다. 버그 해소: 변환 도구의 버그를 수정하면, 변환된 시스템의 해당 버그도 해소된다. 앞 단계에서 접근할 수 없었던 것들에서 발생되는 버그를 QA들이 찾아냈는데, 이런 검증은 도움이 되었다. 검증 결과 모든 기능 중 97% 검증 완료 나머지 3%는 외부 API라서 내부 테스트 불가 이유: 실제 운영 환경에서 테스트할 수 밖에 없는 외부 데이터) 대책: 외부 API 목록 작성과 운영 환경에서 완벽한 테스트를 할 수 있도록 미리 준비 (매우 중요) 이 단계에서는 버그 해소 작업에 큰 수고가 들지 않았다. 버그 등록이 지속적으로 줄어듬 종료 시점에 모두 해소 4단계 (배포 단계) RC (Release Candidate, 출시 후보) 버전 배포, 합격 판정 후 전체 배포 개요 기간: 5주 참여인원 내부: 2명 (QA 1명, 개발자 1명) 고객: 선정된 고객사 104곳 (사용 점포 브라질 18개 주에 있는 소매점에 총 184개 배포) 브라질 소매점 특성 상, "모든 지역"에서 문제가 없는 지 검증해야 함 (브라질은 각 주마다 세금과 규제가 다름) 작업 내용 4-1 단계: RC(Release Candidate, 출시 후보) 버전 배포 준비 RC (Release Candidate, 출시 후보) 버전 합격 기준 설정 중요도 0 (우회 해소 방법이 없는) 버그: 최대 5개 이내 중요도 1 (우회 해소 방법이 1가지인) 버그: 최대 20개 이내 위 기준 중 하나라도 통과하지 못하면 이 RC 버전은 불합격으로 판정하고 즉시 배포를 중단하기로 함 RC 버전 최대한 완벽한 버전을 준비 RC 버전을 배포 고객 "모든" 기능이 검증될 수 있도록 "세심하게" 고객을 선정 (고객마다 사용하는 기능, 방식, 환경이 제각각일 수 있다) 4-2 단계: RC 버전 배포 및 판정 배포 후 보고된 버그의 갯수 (모두 14개, 그림 참조: 버그 발견 및 해소 추이) 중요도 0: 1개 (기준치인 5개 이내, 통과) 중요도 1: 4개 (기준치인 20개 이내, 통과) 중요도 2: 7개 중요도 3: 2개 기준에 의거 성공 판정 4-3 단계: 전체 배포 100% 델파이 10으로 전환 완료 해소해야 할 마이그레이션 관련 버그가 없음 처음 계획한 데이터베이스를 지원 확인 현재, 99% 고객이 업데이트된 시스템을 사용 프로젝트를 통해 배운 점 분석 단계 (자동 변환 도구 개발 포함)에서 QA는 한두명만 참여하면 된다. 이 단계에서 QA가 많고, 버그를 많이 찾아낸다고 해서 무조건 좋은 것은 아니다. QA는 자동 변환 도구의 결과를 테스트 주의! 이 단계에 QA를 많이 투입할 것인지 아닌 지에 대한 결정은 프로젝트에 따라 다를 수 있으므로 매우 조심해야 한다. 써드-파티 컴포넌트는 분석이 매우 잘 되어야 한다. 심지어 프로젝트 전부터 미리 충분히 파악해야 한다. 마이그레이션 프로젝트가 시작되면 써드-파티 컴포넌트에 대한 작업과 부담이 많기 때문이다. 마이그레이션을 자동화하는 "맞춤" 변환 도구를 개발한다. 프로젝트가 많고 규모가 커도 처리할 수 있다. 검증 단계는 매우 중요하다. 충분한 테스트 시간이 필요하다. 검증 단계를 거치지 않고 바로 배포로 넘어가면 운영 시 문제가 많을 수 있다. 그러면 경영진은 이 프로젝트가 실패했다고 판정할 수 있다. 그러면, 검증 단계 하나의 실패로 끝나지 않는다. (우리는 검증 단계에 충분한 시간을 계획하였기 때문에 문제가 없었다) 프로젝트 중 소통이 매우 중요하다. 모든 팀원들이 진행 중인 작업을 항상 업데이트할 수 있는 절차와 환경이 구축되어야 한다. 그래야, 서로 다른 사람의 작업에 어떤 영향을 주거나 받는 지를 미리 파악할 수 있다. 프로젝트 평가 기준을 구체적이고 명확히 정하고 모니터링해야 한다. 계속 앞으로 갈 것인지 아니면 중단해야 하는 지에 대한 기준을 정하는 것은 매우 중요하다. 마이그레이션 목적이 분명해야 한다. 프로젝트 진행 중에 목적이 변경되면, 3-4개월 이상 지체될 수 있다. 목적과 목표가 분명해야 계획된 일정을 준수할 수 있다. 델파이 7은 매우 훌륭한 도구이지만, 거기에 머물고 있을 수 만은 없다. 머물러 있고 싶어도, 우리가 앞으로 가야할 시간은 언젠가 오게되어 있다. 20년 전에 출시된 델파이 7로는 지금 시점에서 필요한 기술 모두를 지원하지 못한다. 시스템 운영에 크리티컬할 기술에서도 그렇다. 구버전에서 벗어나서 최신 기술에 맞춰가자. 참고 자료 What's New in Delphi 10 Seattle https://www.embarcadero.com/products/delphi/whats-new Embarcadero Update Center https://www.embarcadero.com/rad-in-action/migration-upgrade-center Desktop Windows Version Market Share Worldwide http://gs.statcounter.com/windows-version-market-share/desktop/worldwide/#monthly-201509-202110 Delphi Unicode: https://www.embarcadero.com/images/dm/technical-papers/delphi-unicode-migration.pdf 그림 자료 마이그레이션 전과 후의 UI 비교: 로그인 화면 새 UI에서 사용자 테마 선택 지원: 설정 화면 새 UI에서 사용자 테마 선택 지원: 다크 테마 적용 시 화면 마이그레이션 전과 후의 UI 비교: 일반 화면 새 UI에서 대시보드 구현 새 UI에서 실시간 그래프 구현1 새 UI에서 실시간 그래프 구현2 "맞춤" 자동 변환 도구 예시: 써드 파티 컴포넌트의 경우 프로퍼티 변환이 필요함 3단계 (검증 단계)의 버그 발견 및 해소 추이 << DelphiCon 2021 목록으로 이동
  11. << DelphiCon으로 이동 엠바카데로 DelphiCon의 2021 시리즈 를 소개합니다. DelphiCon은 공식 "엠바카데로 델파이" 온라인 세미나입니다: 모든 세션 다시 보기 (아직 다시보기가 제공되지 않는 세션도 일부 있습니다.) (한글 요약이 필요하면 댓글로 요청하세요. 한글 요약본을 제공하겠습니다. 이 경우, 아래 목록에 제목이 한글로 표시됩니다) [2021. 11. 18] 델파이에서 JSON을 다룰 때 당신이 몰랐던 것들 - Dion Carlos Mai & Gustavo Mena Barreto (25 min) --APILayer: Features and Connecting with REST - Victory Fernandes ( min) --Building a Web Crawler with Delphi and Python - Maico Dal Ri & Dion Carlos Mai ( min) --Delphi Best Practices: The Top Seven Things you Should be Doing - Nick Hodges ( min) --Fintech on the Ethereum Blockchain with Delphi - Jim McKeeth & Stefan van As ( min) --FireDAC: Combining Power and Speed in Cross Platform Database Access (Live Panel) - Cary 𝔍ensen, Jens Fudge & Olaf Monien ( min) --Invoice Generation via Telegram Bot Using FastReport VCL and Delphi - Alexander Syrykh ( min) --Using C++Builder to Extend the Reach of Delphi - David Millington ( min) [2021. 11. 17] 델파이 7에서 벗어나기 - 마이그레이션 프로젝트 사례 - Dion Carlos Mai & Rafael Pereira (30 min) Control Arduino Manipulator with Delphi and Visuino over WiFi or Bluetooth - Boian Mitov ( min) Multi-Platform Explorations using Delphi, FMX, Feeds, REST and More - David Intersimone ( min) Smartwatch Android Meets Delphi - Controlling Devices - Sileide Campos & Victory Fernandes ( min) Delphi Does Low-Code: Cross-Platform REST Client in < 30 Minutes! - David Cornelius ( min) Castle Game Engine - Coming to Delphi! - Michalis Kamburelis ( min) Developing Applications for the Raspberry Pi with Delphi 11 - Dr. Holger Flick ( min) --Multi-Threaded Programming on Apple's Mac M1 vs Mac Core i7 vs Windows Core i7 - Olaf Monien ( min) [2021. 11. 16] Maximise Your Delphi Productivity - Alister Christie ( min) Why Does the Cloud Matter for a Delphi Developer? - Dion Carlos Mai ( min) Move Your UI to the 23rd Century - Building a Data Dashboard with Delphi and Skia. Engage! - Ian Barker ( min) --Thriller: A Delphi Web App in 5 Work Days - Bruno Fierens ( min) --Creating Custom Title Bars in VCL Apps - Ray Konopka ( min) 탭(Tab) 콘트롤은 데스크탑 UX를 어떻게 망가뜨리는가? - Ray Konopka (46 min) (이 세션은 UX Summit 2021에서도 진행되었으므로, 그 링크로 연결됨) 탭 콘트롤 관련 16가지 예를 매우 짧고 명확히 설명하고 탭 콘트롤 디자인 가이드라인을 제시한다. Entity Component Systems: A Different Approach to Coding - Erik van Bilsen ( min) --Convert your VCL Database Application to Mobile and Multiplatform - Miguel Angel Moreno ( min) Keynote - Beyond 10x - The Future of Development with Delphi - Marco Cantù ( min) Create Windows Installers in RAD Studio 11 Alexandria [On-Demand] - Tomas Slapka ( min) Tackling Localization with TsiLang Components Suite [On-Demand] - Gleb Sitikov ( min) Using Delphi as a No Code Development IDE [On-Demand] - Patrick Prémartin ( min) Using FireMonkey as a Game Engine [On-Demand] - Patrick Prémartin ( min) Designing Applications with Windows 11 [On-Demand] - Ziad Allaghi ( min) The SOLID Principles in Delphi - Write Better Code! [On-Demand] - Marco Geuze ( min) 델파이 또는 C++빌더에서 메모리 누수 탐지하기 [On-Demand] - Artem Razin (11 min, 한국어 더빙) (이 세션은 UX Summit 2021에서도 진행되었으므로, 그 링크로 연결됨) Beautifying IntraWeb apps with Bootstrap [On-Demand] - Jackson Gomes ( min) Delphi Modernization Made Easy! [On-Demand] - Oren Aviram ( min) << DelphiCon으로 이동
  12. << DelphiCon으로 이동 엠바카데로 DelphiCon의 2021 시리즈 를 소개합니다. DelphiCon은 공식 "엠바카데로 델파이" 온라인 세미나입니다: 모든 세션 다시 보기 (아직 다시보기가 제공되지 않는 세션도 일부 있습니다.) (한글 요약이 필요하면 댓글로 요청하세요. 한글 요약본을 제공하겠습니다. 이 경우, 아래 목록에 제목이 한글로 표시됩니다) [2021. 11. 18] 델파이에서 JSON을 다룰 때 당신이 몰랐던 것들 - Dion Carlos Mai & Gustavo Mena Barreto (25 min) --APILayer: Features and Connecting with REST - Victory Fernandes ( min) --Building a Web Crawler with Delphi and Python - Maico Dal Ri & Dion Carlos Mai ( min) --Delphi Best Practices: The Top Seven Things you Should be Doing - Nick Hodges ( min) --Fintech on the Ethereum Blockchain with Delphi - Jim McKeeth & Stefan van As ( min) --FireDAC: Combining Power and Speed in Cross Platform Database Access (Live Panel) - Cary 𝔍ensen, Jens Fudge & Olaf Monien ( min) --Invoice Generation via Telegram Bot Using FastReport VCL and Delphi - Alexander Syrykh ( min) --Using C++Builder to Extend the Reach of Delphi - David Millington ( min) [2021. 11. 17] 델파이 7에서 벗어나기 - 마이그레이션 프로젝트 사례 - Dion Carlos Mai & Rafael Pereira (30 min) Control Arduino Manipulator with Delphi and Visuino over WiFi or Bluetooth - Boian Mitov ( min) Multi-Platform Explorations using Delphi, FMX, Feeds, REST and More - David Intersimone ( min) Smartwatch Android Meets Delphi - Controlling Devices - Sileide Campos & Victory Fernandes ( min) Delphi Does Low-Code: Cross-Platform REST Client in < 30 Minutes! - David Cornelius ( min) Castle Game Engine - Coming to Delphi! - Michalis Kamburelis ( min) Developing Applications for the Raspberry Pi with Delphi 11 - Dr. Holger Flick ( min) --Multi-Threaded Programming on Apple's Mac M1 vs Mac Core i7 vs Windows Core i7 - Olaf Monien ( min) [2021. 11. 16] Maximise Your Delphi Productivity - Alister Christie ( min) Why Does the Cloud Matter for a Delphi Developer? - Dion Carlos Mai ( min) Move Your UI to the 23rd Century - Building a Data Dashboard with Delphi and Skia. Engage! - Ian Barker ( min) --Thriller: A Delphi Web App in 5 Work Days - Bruno Fierens ( min) --Creating Custom Title Bars in VCL Apps - Ray Konopka ( min) 탭(Tab) 콘트롤은 데스크탑 UX를 어떻게 망가뜨리는가? - Ray Konopka (46 min) (이 세션은 UX Summit 2021에서도 진행되었으므로, 그 링크로 연결됨) 탭 콘트롤 관련 16가지 예를 매우 짧고 명확히 설명하고 탭 콘트롤 디자인 가이드라인을 제시한다. Entity Component Systems: A Different Approach to Coding - Erik van Bilsen ( min) --Convert your VCL Database Application to Mobile and Multiplatform - Miguel Angel Moreno ( min) Keynote - Beyond 10x - The Future of Development with Delphi - Marco Cantù ( min) Create Windows Installers in RAD Studio 11 Alexandria [On-Demand] - Tomas Slapka ( min) Tackling Localization with TsiLang Components Suite [On-Demand] - Gleb Sitikov ( min) Using Delphi as a No Code Development IDE [On-Demand] - Patrick Prémartin ( min) Using FireMonkey as a Game Engine [On-Demand] - Patrick Prémartin ( min) Designing Applications with Windows 11 [On-Demand] - Ziad Allaghi ( min) The SOLID Principles in Delphi - Write Better Code! [On-Demand] - Marco Geuze ( min) 델파이 또는 C++빌더에서 메모리 누수 탐지하기 [On-Demand] - Artem Razin (11 min, 한국어 더빙) (이 세션은 UX Summit 2021에서도 진행되었으므로, 그 링크로 연결됨) Beautifying IntraWeb apps with Bootstrap [On-Demand] - Jackson Gomes ( min) Delphi Modernization Made Easy! [On-Demand] - Oren Aviram ( min) << DelphiCon으로 이동 View full 엠바카데로 기술자료
  13. << DelphiCon 2021 목록으로 이동 원본 비디오(YouTube) 보기 (30 min) DelphiCon 의 2021 시리즈 중, Things That You Don’t Know About JSON in Delphi - Dion Carlos Mai & Gustavo Mena Barreto (25 min) 의 한글 요약본입니다. 델파이에서 JSON을 다루는 방법, JSON 파서를 가장 생산적으로 사용하는 방법, JSON 직렬화 작동을 커스터마이징하고 자동화하는 옵션을 설명합니다. 발표자 Gustavo Mena Barreto는 Aquasoft 선임 개발자이며, Dion Carlos Mai은 Aquasoft 개발팀장입니다. 이 세션에서 사용된 전체 소스코드: https://github.com/gustavomenabarreto/delphicon2021 목차 델파이에서 JSON 다루기를 주제로 정한 이유 JSON을 다룰 때 델파이에서 선택할 수 있는 것들 이 세션에서 사용할 JSON 샘플 JSON을 사용하기 위해 필요한 델파이 유닛(들) 1. 가장 간단한 방법 JSON 읽기 (아래 코드와 주석 참조) JSON 쓰기 (아래 코드와 주석 참조) 2. JsonToDelphi JSON 직렬화 행위를 변경하는 옵션(들) 3. Super Object (오픈소스) 4. RESTResponseDataSetAdapter 컴포넌트 REST API를 통해서 JSON 데이터를 받아서 델파이 폼에 표현하기 5. TJSONMarshal 클래스 델파이에서 JSON 다루기를 주제로 정한 이유 요즘 개발자에게 JSON은 매우 중요한 자리를 차지하고 있다. 요즘은 API 통합이 너무나 많다. 심지어 NoSQL JSON 데이터베이스도 있다. JSON을 다루는 방법이 여러가지 라는 사실을 잘 모르는 개발자들이 있다. 이 세션에서는 JSON을 다루는 여러 가지 방법을 설명한다. JSON을 다룰 때 델파이에서 선택할 수 있는 것들 가장 간단한 방법 JsonToDelphi: JSON 오브젝트를 가지고 델파이 클래스를 자동 생성하는 웹사이트 Super Object (오픈소스): 델파이 6, 7 등 구버전에서 JSON을 다룰 수 있음 (최신 버전 사용자에게는 권장하지 않음) RESTResponseDataSetAdapter 컴포넌트: JSON을 기반으로 데이터셋을 자동 생성 TJSONMarshal 클래스: JSON 직렬화 처리를 커스터마이징할 때 사용 이 세션에서 사용할 JSON 샘플 그림. 이 세션의 코드는 비트코인 블록체인에서 사용되는 매우 구조가 큰 JSON에서 극히 일부분만 뽑아 놓은 샘플 JSON을 사용한다. JSON을 사용하기 위해 필요한 델파이 유닛(들) uses System.JSON, REST.Json; 1. 가장 간단한 방법 TJSONObject와 TJSONArray를 사용하는 방법 JSON 읽기와 쓰기 (아래 코드와 주석 참조) // [JSON 읽기] var objeto : TJSONObject; ObjetoArray: TJSONArray; I: Integer; begin // ParseJSONValue를 이용하면, 단 한줄로 JSONObject를 만들 수 있다. objeto := TJsonObject.ParseJSONValue(MemoJson.Lines.Text) as TJSONObject; // JSONObject의 Get과 GetValue 메소드를 이용하면, JSON 개체의 모든 데이터에 접근할 수 있다. ShowMessage(objeto.Get('block_hash').ToString); ShowMessage(objeto.GetValue('block_hash').Value); // 배열 형식의 JSON값은 TJSONArray로 받을 수 있다. ObjetoArray := objeto.Get('inputs').JsonValue as TJSONArray; // JSONArray 안에 있는 각 요소는 for 루프를 통해 접근할 수 있다. for I := 0 to ObjetoArray.Size - 1 do begin MemoResultado.Lines.Add( ObjetoArray.Get(i).ToString + ': ' + ObjetoArray.Get(i).Value); end; end; // [JSON 쓰기] var objeto : TJSONObject; ObjetoArray: TJSONArray; ObjetoInputs: TJSONObject; begin objeto := TJSONObject.Create; ObjetoArray := TJSONArray.Create; // JSONObject의 AddPair (필드 이름, 필드 값) 메소드를 사용하여 데이터 쓰기 // 필드 값에 문자열 넣기 objeto.AddPair('block_hash','123456789'); // 필드 값에 JSONObject의 일종인 JSONArray 넣기 Objeto.AddPair('Inputs',ObjetoArray); // 'Input' 필드 값인 ObjetoArray에 들어 갈 JSONObject 만들기 ObjetoInputs := TJSONObject.Create; // 위와 동일하게 AddPair를 사용하여 JSONObject에 데이터 쓰기 ObjetoInputs.AddPair('prev_hash','987654321'); ObjetoInputs.AddPair('script','1'); // JSON 배열인 ObjetoArray의 Add 메소드를 이용하여, 배열 안에 요소 넣기 ObjetoArray.Add(ObjetoInputs); MemoResultado.Lines.Text := objeto.ToString; end; 2. JsonToDelphi https://jsontodelphi.com는 JSON 샘플을 넣으면, 해당 JSON을 다룰 수 있는 델파이 클래스를 자동으로 받을 수 있는 웹사이트이다. SOAP / XML 파서와 사용 방식이 상당히 유사하지만, XML이 아니라 JSON을 다룬다. 우리가 직접 해당 클래스를 만들기 위해 수작업으로 코드를 작성할 수도 있지만, 많은 API들이 방대한 JSON을 사용하고 있는데, 그 JSON을 모두 클래스로 만들 기 위해 수작업으로 코드를 쓰려면, 시간도 많이 걸리고 너무 수고스럽다. 무료 서비스인 이 웹사이트를 이용하면 그 모든 수고를 덜 수 있다. 생성된 클래스의 전체 소스 코드를 다운로드 할 수 있으므로, 필요한 부분을 직접 변경할 수도 있다. // [JsonToDelphi에서 만들어 준 클래스 사용하여 읽기] // 제공한 JSON 샘플의 구조가 모두 반영된 클래스가 생성되므로, 그냥 사용하면 된다. var TesteJson: TRoot; Inputs: TInputs; begin // JsonToDelphi가 만들어준 클래스 안에 JSON을 읽어서 넣기 TesteJson := TJson.JsonToObject<TRoot>(MemoJson.Lines.Text); // 데이터 타입까지 이미 알맞게 지정된 해당 클래스의 프로퍼티를 통해 JSON 필드를 접근 ShowMessage('BlockHash - '+TesteJson.BlockHash); for Inputs in TesteJson.Inputs do begin Showmessage('ScripType - '+Inputs.ScriptType); end; end; // [JsonToDelphi에서 만들어 준 클래스 사용하여 쓰기] var TesteJson: TRoot; Inputs: TInputs; I: Integer; begin // JsonToDelphi에서 만들어 준 클래스를 생성하고 TesteJson := TRoot.Create; // 프로퍼티를 이용하여 값을 쓴다. TesteJson.BlockHash := 'www.aquasoft.com.br'; // 마찬가지 방법으로 배열을 돌면서 값을 쓸 수도 있다. for I := 0 to 2 do begin Inputs := TInputs.Create; Inputs.Age := 20; Inputs.Script := 'teste script'; TesteJson.Inputs.Add(Inputs); end; // 단 한줄로 JSON 데이터를 문자로 풀어낼 수 있다. MemoResultado.Lines.Text := //이 때 joIgnoreEmptyStrings 옵션을 사용하면, 값이 빈 문자열인 데이터는, JSON 필드를 만들 지 않고 건너뛴다. // joIgnoreEmptyStrings는 델파이의 TJsonOption의 일종이다 (아래 본문의 설명 참조) TJson.ObjectToJsonString(TesteJson,[joIgnoreEmptyStrings]); end; JSON 직렬화 행위를 변경하는 옵션(들) 델파이의 REST.Json.TJsonOption https://docwiki.embarcadero.com/Libraries/Sydney/en/REST.Json.TJsonOption JSON 생성 작동 방식 중 원하는 옵션을 선택할 수 있다. 예: 유닉스 날짜 포맷 사용하기, UTC 날짜 사용, 들여쓰기, 카멜 표기, 등등 델파이 버전이 최신일수록 선택할 수 있는 직렬화 옵션이 더 많다. 이전 버전이라서 필요한 옵션이 없다면, 원하는 작동을 하는 코드를 수작업으로 써 넣는다. [그림. 델파이 11.0 알렉산드리아의 TJsonOption (참고: 이전 버전에는 옵션이 이것처럼 많지 않다)] 3. Super Object (오픈소스) 델파이 6, 7 등 구버전에서 JSON을 다룰 수 있음 무료 오픈 소스: https://github.com/hgourvest/superobject 델파이가 오래된 버전이지만, API 연동을 위해 JSON을 다루어야 한다면 이런 역할을 하는 DLL 또는 패키지의 도움을 받을 수 있다. 하지만, 직접 코드로 구현하려면 Super Object를 사용할 수 있다. 주의! 앞에서 설명했듯이, 최신 버전에는 이미 이런 기능들이 들어있으므로, Super Object를 굳이 사용할 이유가 없음 // [SuperObject를 사용하여 읽기] var Objeto: ISuperObject; Inputs: ISuperObject; begin // SuperObject의 SO 메소드를 사용하여 오브젝트를 생성 Objeto := SO(MemoJson.Lines.Text); // S 메소드는 원하는 필드와 값을 마치 배열처럼 접근 ShowMessage(Objeto.S['block_hash']); ShowMessage(Objeto['block_hash'].AsString); // for 루프 사용 가능 (for in 루프는 델파이 7 같은 구버전에는 없지만, for 문으로 유사하게 구현하면 된다.) for Inputs in objeto['inputs'] do begin MemoResultado.Lines.Add(Inputs.AsString); end; end; // [델파이 구버전에서 SuperObject를 사용하여 쓰기] var Objeto: ISuperObject; Inputs: ISuperObject; begin // 오브젝트 생성 Objeto := SO; // 데이터 쓰기 역시 마치 배열을 다루듯이 사용 Objeto.S['block_hash'] := '123456789'; Objeto.O['inputs'] := SA([]); Inputs := SO; Inputs.S['script'] := 'Teste script 1'; Inputs.I['age'] := 30; // JSON 배열을 쓸 수도 있다. Objeto.A['inputs'].O[0] := Inputs; Inputs := SO; Inputs.S['script'] := 'Teste script 2'; Inputs.I['age'] := 60; Objeto.A['inputs'].O[1] := Inputs; // AsString 메소드를 사용하여 JSON으로 쓸 수도 있다. MemoResultado.Lines.Text := Objeto.AsString; end; 4. RESTResponseDataSetAdapter 컴포넌트 RESTResponse에 받은 JSON 데이터를 FDMemTable 등의 데이터셋에 넣어주는 컴포넌트 (델파이 최근 버전에서 추가됨) [그림. REST 디버거를 사용하면 더 쉽게 만들 수 있다] REST API를 통해서 JSON 데이터를 받아서 델파이 폼에 표현하기 REST 디버거 (REST API의 읽기와 쓰기를 테스트하는 무료 도구)를 실행한다. 테스트가 성공했다면, [Copy Components] 버튼을 클릭한다. 그러면, 해당 REST API를 다루도록 설정이 완료된 델파이 컴포넌트가 클립보드에 복사된다. RESTClient: REST 서비스 제공자에게 요청을하고 응답을 받는 사용자 오브젝트 RESTRequest: RESTClient가 REST 서비스 제공자에게 전달하는 요청 RESTResponse: RESTClient가 REST 서비스 제공자로부터 전달받은 응답 RESTResponseDataSetAdapter: 전달받은 응답을 FDMemTable 등의 데이터셋에 넣어주는 매개체 FDMemTable: 데이터셋 델파이 폼에서 붙여넣기를 하면, 복사된 컴포넌트가 모두 추가되고, 되델파이 프로젝트에서 바로 사용할 수 있다. 그 후에는, 일반 데이터와 마찬가지로 FDMemTable을 사용하면 된다. 함께 복사된 REST 관련 컴포넌트들이 자동으로 이 데이터셋에 JSON 데이터를 담는다. FDMemTable 이 가장 좋고 편한 데이터셋이기 때문에 사용한다 (원한다면 다른 데이터셋을 사용해도 된다) 예를 들어, 데이터가 표현될 그리드의 데이터소스 즉 DataSource 컴포넌트의 DataSet 프로퍼티에 FDMemTable를 지정하면 된다. 직접 작성해야할 코드는 2줄 뿐이다 (아래 코드 참조) procedure TForm1.Button5Click(Sender: TObject); begin // REST 요청을 한다 RESTRequest1.Execute; // RESTResponse에 받은 JSON 데이터를 FDMemTable 등의 데이터셋에 넣기 RESTResponseDataSetAdapter1.Active := True; end; 5. TJSONMarshal 클래스 JSON 데이터 직렬화 알고리즘을 커스터마이징 할 수 있다. RTTI를 직접 건드릴 필요가 없기 때문에 보다 안전하고 편하다. RTTI를 잘못 다루면 쓰레드 문제가 발생할 수 있다. JSON을 다룰 때는 쓰레드를 사용하고 JSON 구조를 알맞게 맞추어 쓰는 것이 좋다. 보다 자세한 내용은 사용자 오브젝트 직렬화에 대한 상세한 Docwiki 도움말을 참고하기 바란다. // [TJSONMarshal을 사용하여 맞춤 JSON 구현하기] var lMarshal : TJSONMarshal; TesteJson: TRoot; //JsonToDelphi에서 제공하는 SuperObject 타입을 사용 Inputs: TInputs; I: Integer; begin TesteJson := TRoot.Create; // 오브젝트 생성 (SuperObject) TesteJson.BlockHash := 'www.aquasoft.com.br'; for I := 0 to 2 do begin Inputs := TInputs.Create; Inputs.Age := 20; Inputs.Script := 'teste script'; TesteJson.Inputs.Add(Inputs); end; // JSONMarshal을 생성할 때 컨버터를 지정 (커스터마이징을 위해 컨버터를 이용하는 것은 뒤에서 설명) lMarshal := TJSONMarshal.Create (TJSONConverter.Create); // Marshal 메소드를 사용하면 컨버터에 지정된 대로 컨버전 된다. MemoResultado.Lines.Text := lMarshal.Marshal(TesteJson).ToString(); lMarshal.Free; end; JSON 커스터마이징 방식 1: JSONMarshalled 어트리뷰트 사용 [JSONMarshalled(False)] // 이 어트리뷰트에서 False로 지정된 것, 즉 FScript는 생성될 JSON의 필드에 들어가지 않는다. FScript: string; JSON 커스터마이징 방식 2: RegisterConverter 프로시저를 오버로딩하기 프로시저 오버로딩을 통해 파서인 TJSONMarshal 클래스의 기본 전환 방식을 덮어쓰는 방법 JSON의 특정 필드의 데이터 타입 바꾸기 등 얼마든지 처리 로직을 바꿀 수 있다. (굳이 RTTI를 건드리지 않아도 된다) 좀 복잡하긴 하지만, 필요하다면 이처럼 TJSONMarshal 클래스를 생성할 때 컨버터를 파라미터로 넣는 방식을 쓸 수 있다. << DelphiCon 2021 목록으로 이동 View full 엠바카데로 기술자료
  14. << DelphiCon 2021 목록으로 이동 원본 비디오(YouTube) 보기 (30 min) DelphiCon 의 2021 시리즈 중, Leaving Delphi 7 - A Success Migration Case - Dion Carlos Mai & Rafael Pereira (30 min) 의 한글 요약본입니다. 20년이 넘었고, 델파이 7로 운영하던 대형 시스템을 델파이 10으로 마이그레이션한 프로젝트를 정리한 내용을 공유합니다. 발표자 Rafael은 이 소매점 시스템 제공자인 Stone Co의 개발자입니다. 목차 회사 및 프로젝트 소개 현대화 마이그레이션을 계획하게 된 동기와 결과 마이그레이션 프로젝트의 개요 마이그레이션 프로젝트의 진행 단계 1단계 (분석 단계) 2단계 (실행 단계) 3단계 (검증 단계) 4단계 (배포 단계) 프로젝트를 통해 배운 점 참고 자료 그림 자료 회사 및 프로젝트 소개 회사 소개: Stone Co Linx: 뉴욕 증시에 상장된 브라질의 소프트웨어 기업. 브라질의 소매점 소프트웨어 시장에서 점유율 45.6% Stone: 뉴욕 증시에 상장된 브라질의 Stone Co.의 핀테크 기업. 지불 관리 도구와 유연한 금융 상품을 제공 Stone Co: 2012년에 시작하여 브라질 전역을 커버하고 있다. 2020년 11월, Stone Co는 Linx를 인수 대상 시스템 소개: Linx Big 20년이 넘은 소매점 소프트웨어. 약국에서 주로 사용 현재 3,000개가 넘는 고객사와, 5,000개가 넘는 소매점에서 사용 중 (2개 이상을 사용하는 점포가 많으므로, 배포된 소프트웨어는 훨씬 더 많음) 현대화 마이그레이션을 계획하게 된 동기와 결과 윈도우10은 2021년 10월 현재 전세계 데스크탑 점유율의 80%이상을 차지하고 있고 계속 증가하는 추세임 (관련 통계 보기) 윈도우 10에 집중해야 하는 상황 윈도우 10의 새 운영체제 기능을 충분히 지원하는 IDE 기능이 필요 윈도우 10에 맞는 더 좋은 시각적인 UI가 필요 (그림 참조: 예전 화면과 새 화면 비교) 스타일, 대시보드, 그래프, 메뉴 등 더 풍부한 화면을 제공하여 외관상 완전히 다른 새 소프트웨어로 보임 (그림 참조: 새 화면) 델파이 10에 내장된 컴포넌트와 스타일만 사용하여 화면 개발 새 UI를 구현하기 위한 코드는 새로 작성 하지만, 모든 클래스와 소스 코드는 예전 델파이 7과 거의 같음 스레드가 필요 요즘 소프트웨어는 API 통합이 많다. 델파이 7에서도 스레드를 구현할 수 있다. 하지만, 델파이 7은 소프트웨어를 개발하기에 여전히 매우 훌륭한 도구이지만, 20년 전에 나온 오래된 버전이다. 델파이 최신 버전을 사용하지 않으면, API 통합을 모두 지원하거나 JSON 직렬화하기 등 새 기술을 반영하기가 어렵다. 기타 개선 델파이 10의 장점을 가질 수 있게 됨: 64비트 지원, 윈도우 10 지원, FireDAC으로 데이터 연결, 다른 운영체제에서 접근 등등 델파이 10 시애틀을 선택한 이유 당시 우리 개발자 대부분이 사용할 수 있는 라이선스를 이미 가지고 있었기 때문 마이그레이션 프로젝트의 개요 목표 델파이 7에서 델파이 10 시애틀로 이전 마리아DB 10.4.13과 MySQL 8.0.21 지원 개요 기간: 총 7 개월 투입 인원 외부: 3명 (아쿠아소프트 개발자, 마이그레이션에만 집중) 내부: 22명 (개발자, QA, 델파이 프로젝트 별 책임자) 마이그레이션 대상 (소매점 관리 시스템)의 규모 델파이 프로젝트: 65개 모듈: 194개 .PAS 파일: 6,000개 .DFM 파일: 2,000개 코드 줄 수: 2백만줄 써드 파티 컴포넌트 세트: 23가지 마이그레이션 프로젝트의 진행 단계 총 4단계로 나누고, 앞 단계 완료 시 다음 단계를 진행: 분석, 실행, 검증, 배포 1단계 (분석 단계) 개요 기간: 3.5개월 투입 인원 외부: 3명 (아쿠아소프트 개발자) 내부: 2명 (개발자 1명, QA 1명) 목표 측정 / 식별 / 문서화 델파이 10으로 마이그레이션이 끼칠 영향 새 데이터베이스와의 호환성 프로젝트로 인해 달라지는 점과 문제점 변경으로 인해 발생될 것으로 예상되는 문제 해소 자동 변환 도구 개발 작업 내용 외부 인력 (아쿠아소프트) 합류 전환할 컴포넌트를 3가지로 나누어 분석하고 대비 버전의 수명이 다한 컴포넌트 마이그레이션 시 문제가 많고, 작업도 많이 해야 하는 것들임 이 프로젝트에서 많이 사용될 컴포넌트 프로젝트에서 사용되는 비중이 크기 때문에, 그 만큼 프로젝트에 끼치는 영향도 큰 것들임 소스코드가 없는 컴포넌트 매우 이상하게 작동할 수 있고 마이그레이션 작업을 까다롭게 만들기 때문에 주의해야 할 것들임 예: Zeos (2003년부터 사용한 오픈 소스 데이터베이스 컴포넌트) [에러가 발생되는 코드] QPrincipal.FieldByName('datapre').AsDateTime :=now; 짐작하겠지만, 상업용 시스템에서 매우 많이 사용되는 코드이며, 모두 수정해야 하므로, 에러 해소 작업이 많다. 델파이 버전 간의 차이와 충돌을 식별하고 해소 유니코드 (영향 받는 dll이 있는 지까지도 파악할 필요가 있음) 자동 변환 도구 개발 ("마이그레이션 찾아 바꾸기"라고 이름 지음) 소스 변환 자동화 도구 개발을 이 분석 단계 안에서 완성 (그림 참조: 소스 변환 자동화 도구와 변환 결과) Zeos에서 UniDAC으로 마이그레이션하는 도구 마법사가 발생시키는 버그 수정 자동화 사용되는 모든 컴포넌트 마이그레이션 자동화 (많은 컴포넌트에서 일부 프로퍼티가 변경되었기 때문) 델파이 10과 델파이 7과의 차이로 인해 필요한 코드 변환 자동화 "모든" 소스를 변환할 수 있는 "맞춤" 도구 완성 소스 코드 동기화 소스 코드 동기화는 매우 중요! 마이그레이션 프로젝트 진행 중에도 전체 배포까지 완료되기 전까지는 전환해야 할 코드가 계속 변하기 때문이다. 분석 단계가 진행되는 중에도 내부 개발자 20명은 여전히 기존 코드나 화면을 변경하고 새 기능을 추가한다. 즉, 마이그레이션 대상인 델파이 7 소스 코드가 계속 변한다. 2단계 (실행 단계) 모든 코드를 변경하는 단계 개요 기간: 2일 (사전 준비가 완료되었으므로 가능) 참여 인원 외부: 1명 (아쿠아소프트 개발자) 내부: 1명 (개발자) 목표 코드 "전체"를 자동 변환 도구를 사용하여 델파이 7에서 델파이 10으로 변경 작업 내용 진행 전 실행 단계 직전에 기존 프로그램 변경을 금지 1일차 자동 변환 도구를 사용하여 변환 개발자 2명이 6시간 만에 완료 총 4,678개 소스 파일을 변경 2일차 컴포넌트 적합성, 데이터베이스 적합성이 파악된다. 모든 변경이 계획대로 되었는 지를 검증 3단계 (검증 단계) 개요 기간: 2.5 개월 참여 인원 외부: 3명 (아쿠아소프트 개발자) 내부: 22명 (개발자, QA, 델파이 프로젝트 별 책임자) 목표 모든 델파이 프로젝트와 모든 작동을 검증, 버그 파악 및 해소 팀 구성 개발자 (버그 픽스 전담) 그룹 개발자 (일반) 그룹 QA 그룹 델파이 프로젝트 별 책임자 그룹 작업 내용 검증 단계 시작 전 (즉, 실행 단계인 2일 간) 델파이 10 사용자 교육 이유: 모든 개발자는 이 검증 단계 시작을 기준으로, 그 이후에는 델파이 10만 사용 (그 이전에는 델파이 7만 사용) 내용: 델파이 10 사용법, 새 기능, 검증 단계 및 이후 유지 보수 시 작업 절차 결과: 개발자 등 모든 참여 인원이 검증 단계에 참여할 준비를 완료 검증 단계 시작 직후 버그가 매우 많이 보고되었고, 버그의 대부분을 신속하게 해소했다. 자동 변환 도구를 이용했기 때문이다. 버그 발생: 변환 도구에 버그가 있으면, 변환된 시스템에도 버그가 생긴다. 버그 해소: 변환 도구의 버그를 수정하면, 변환된 시스템의 해당 버그도 해소된다. 앞 단계에서 접근할 수 없었던 것들에서 발생되는 버그를 QA들이 찾아냈는데, 이런 검증은 도움이 되었다. 검증 결과 모든 기능 중 97% 검증 완료 나머지 3%는 외부 API라서 내부 테스트 불가 이유: 실제 운영 환경에서 테스트할 수 밖에 없는 외부 데이터) 대책: 외부 API 목록 작성과 운영 환경에서 완벽한 테스트를 할 수 있도록 미리 준비 (매우 중요) 이 단계에서는 버그 해소 작업에 큰 수고가 들지 않았다. 버그 등록이 지속적으로 줄어듬 종료 시점에 모두 해소 4단계 (배포 단계) RC (Release Candidate, 출시 후보) 버전 배포, 합격 판정 후 전체 배포 개요 기간: 5주 참여인원 내부: 2명 (QA 1명, 개발자 1명) 고객: 선정된 고객사 104곳 (사용 점포 브라질 18개 주에 있는 소매점에 총 184개 배포) 브라질 소매점 특성 상, "모든 지역"에서 문제가 없는 지 검증해야 함 (브라질은 각 주마다 세금과 규제가 다름) 작업 내용 4-1 단계: RC(Release Candidate, 출시 후보) 버전 배포 준비 RC (Release Candidate, 출시 후보) 버전 합격 기준 설정 중요도 0 (우회 해소 방법이 없는) 버그: 최대 5개 이내 중요도 1 (우회 해소 방법이 1가지인) 버그: 최대 20개 이내 위 기준 중 하나라도 통과하지 못하면 이 RC 버전은 불합격으로 판정하고 즉시 배포를 중단하기로 함 RC 버전 최대한 완벽한 버전을 준비 RC 버전을 배포 고객 "모든" 기능이 검증될 수 있도록 "세심하게" 고객을 선정 (고객마다 사용하는 기능, 방식, 환경이 제각각일 수 있다) 4-2 단계: RC 버전 배포 및 판정 배포 후 보고된 버그의 갯수 (모두 14개, 그림 참조: 버그 발견 및 해소 추이) 중요도 0: 1개 (기준치인 5개 이내, 통과) 중요도 1: 4개 (기준치인 20개 이내, 통과) 중요도 2: 7개 중요도 3: 2개 기준에 의거 성공 판정 4-3 단계: 전체 배포 100% 델파이 10으로 전환 완료 해소해야 할 마이그레이션 관련 버그가 없음 처음 계획한 데이터베이스를 지원 확인 현재, 99% 고객이 업데이트된 시스템을 사용 프로젝트를 통해 배운 점 분석 단계 (자동 변환 도구 개발 포함)에서 QA는 한두명만 참여하면 된다. 이 단계에서 QA가 많고, 버그를 많이 찾아낸다고 해서 무조건 좋은 것은 아니다. QA는 자동 변환 도구의 결과를 테스트 주의! 이 단계에 QA를 많이 투입할 것인지 아닌 지에 대한 결정은 프로젝트에 따라 다를 수 있으므로 매우 조심해야 한다. 써드-파티 컴포넌트는 분석이 매우 잘 되어야 한다. 심지어 프로젝트 전부터 미리 충분히 파악해야 한다. 마이그레이션 프로젝트가 시작되면 써드-파티 컴포넌트에 대한 작업과 부담이 많기 때문이다. 마이그레이션을 자동화하는 "맞춤" 변환 도구를 개발한다. 프로젝트가 많고 규모가 커도 처리할 수 있다. 검증 단계는 매우 중요하다. 충분한 테스트 시간이 필요하다. 검증 단계를 거치지 않고 바로 배포로 넘어가면 운영 시 문제가 많을 수 있다. 그러면 경영진은 이 프로젝트가 실패했다고 판정할 수 있다. 그러면, 검증 단계 하나의 실패로 끝나지 않는다. (우리는 검증 단계에 충분한 시간을 계획하였기 때문에 문제가 없었다) 프로젝트 중 소통이 매우 중요하다. 모든 팀원들이 진행 중인 작업을 항상 업데이트할 수 있는 절차와 환경이 구축되어야 한다. 그래야, 서로 다른 사람의 작업에 어떤 영향을 주거나 받는 지를 미리 파악할 수 있다. 프로젝트 평가 기준을 구체적이고 명확히 정하고 모니터링해야 한다. 계속 앞으로 갈 것인지 아니면 중단해야 하는 지에 대한 기준을 정하는 것은 매우 중요하다. 마이그레이션 목적이 분명해야 한다. 프로젝트 진행 중에 목적이 변경되면, 3-4개월 이상 지체될 수 있다. 목적과 목표가 분명해야 계획된 일정을 준수할 수 있다. 델파이 7은 매우 훌륭한 도구이지만, 거기에 머물고 있을 수 만은 없다. 머물러 있고 싶어도, 우리가 앞으로 가야할 시간은 언젠가 오게되어 있다. 20년 전에 출시된 델파이 7로는 지금 시점에서 필요한 기술 모두를 지원하지 못한다. 시스템 운영에 크리티컬할 기술에서도 그렇다. 구버전에서 벗어나서 최신 기술에 맞춰가자. 참고 자료 What's New in Delphi 10 Seattle https://www.embarcadero.com/products/delphi/whats-new Embarcadero Update Center https://www.embarcadero.com/rad-in-action/migration-upgrade-center Desktop Windows Version Market Share Worldwide http://gs.statcounter.com/windows-version-market-share/desktop/worldwide/#monthly-201509-202110 Delphi Unicode: https://www.embarcadero.com/images/dm/technical-papers/delphi-unicode-migration.pdf 그림 자료 마이그레이션 전과 후의 UI 비교: 로그인 화면 새 UI에서 사용자 테마 선택 지원: 설정 화면 새 UI에서 사용자 테마 선택 지원: 다크 테마 적용 시 화면 마이그레이션 전과 후의 UI 비교: 일반 화면 새 UI에서 대시보드 구현 새 UI에서 실시간 그래프 구현1 새 UI에서 실시간 그래프 구현2 "맞춤" 자동 변환 도구 예시: 써드 파티 컴포넌트의 경우 프로퍼티 변환이 필요함 3단계 (검증 단계)의 버그 발견 및 해소 추이 << DelphiCon 2021 목록으로 이동 View full 엠바카데로 기술자료
  15. << DelphiCon 2020 목록으로 이동 DelphiCon 의 2020 시리즈 중, Functional Programming With Delphi - Nick Hodges 의 한글 요약본입니다. 프로그래밍 방식에 대한 새로운 관점을 가질 수 있는 세션입니다. 함수형 프로그래밍은 지금까지 일반적으로 해온 명령형 프로그래밍보다 더 간결 명료하고, 멀티 쓰레드에서도 안전한 코드를 실현합니다. 발표자 (Nick Hodges)는 델파이 개발자라면 한번쯤 들어본 저명한 델파이 전문가입니다. 저서 델파이로 코딩하기 (Coding in Delphi) 델파이로 코딩하기 속편 (More Coding in Delphi) 델파이에서 의존관계 인젝션 (Dependency Injection in Delphi) 원본 비디오에는 아래 요약보다 자세한 데모와 설명이 있습니다. 목차 상태의 실패(The Failure of State) 불변 (Immutable) 타입을 사용하자 함수형 프로그래밍과 명령형 프로그래밍 함수형(Functional) 프로그래밍이란? 명령형(Imperative) 프로그래밍이란? 함수형(Functional) 프로그래밍과 (우리에게 익숙한) 명령형(Imperative) 프로그래밍의 차이점 함수형 프로그래밍 이해하기 함수형 프로그래밍: 메소드/함수의 요건 함수형 프로그래밍: 함수의 특징 함수형 프로그래밍: 함수 (매우 중요!) 함수형 프로그램밍: 완성된 프로그램의 특징 함수형 프로그래밍 방식으로 생각하기 타협점 예문: 델파이 구현한 함수형 프로그래밍 1. 정해진 갯수까지 제곱값 구하기 2. 과잉수 (abundant number, 약수의 값이 자기 자신보다 큰 숫자) 구하기 요약 상태의 실패(The Failure of State) 함수형 프로그래밍 강연에서 Robert C. Martin는 "상태는 변하고, 이런 변화는 프로그램에 영향을 끼친다"고 설명한다. 변수의 값은 변한다. 변수 값의 변화를 추적할 수 없으면 코드를 이해하기 어렵다. 메소드 호출 사이의 관계를 파악하지 못하면 코드의 흐름을 따라가기가 어렵다. 특히, 멀티 쓰레드를 사용하는 경우, 상태가 변화가 발생하는 코드를 이해하거나 디버깅하기는 더 어렵다. 불변 (Immutable) 타입을 사용하자 불변 클래스는 (생성자에서) 한번만 값을 검증하면 된다. 이후에는 변경되지 않기 때문이다. 예를 들어, 이메일에 값이 들어있는지 아닌지 등을 확인할 때 생성자 호출 코드만 보면 된다. 불변 클래스는 한번 만들어지면 없어질 때까지 상태가 변하지 않으므로 상태 변경을 걱정할 필요가 없다. 서로 다른 쓰레드에서 함께 사용되어도 안전하다. 코드 읽기가 더 쉽다. 상태 변화를 추적하기 위해 메소드를 하나씩 추적할 필요가 없다. 가변 클래스와 불변 클래스 예시 // [1] 일반적인 클래스 타입 (내부 데이터 변경 허용, 멀티 쓰레드에서 안전하지 않음) type TMutablePerson = class private FName: string; Email: string; procedure SetName(const Value: string); procedure SetEmail(const Value: string); public constructor Create(const aName: string; const aEmail: string); property Name: string read Name write SetName; //프로퍼티에서 쓰기가 가능하므로 이름을 바꿀 수 있다 property Email: string read Email write SetEmail; //프로퍼티에서 쓰기가 가능하므로 이메일을 바꿀 수 있다 end; // [2] 불변 클래스 타입 (내부 데이터 변경 불가. 멀티 쓰레드에서도 안전) type TImmutablePerson = class private FName: string; Email: string; public constructor Create(const aName: string; const aEmail: string); property Name: string read Name; //생성된 후에는 외부에서 읽기만 가능 property Email: string read Email; //생성된 후에는 외부에서 읽기만 가능 end; // [3] 불변 클래스 타입 (내부 데이터 변경을 허용하지만, 실제로는 새 인스턴스를 제공하므로 멀티 쓰레드에서도 안전) type TPerson = class private FName: string; Email: string; public constructor Create(const aName: string; const aEmail: string); function ChangeName(const Value: string): TPerson; //데이터가 변하지만, 실제로 새 인스턴스를 반환 function ChangeEmail(const Value: string): TPerson; //데이터가 변하지만, 실제로 새 인스턴스를 반환 property Name: string read Name; //생성된 후에는 외부에서 읽기만 가능 property Email: string read Email; //생성된 후에는 외부에서 읽기만 가능 end; function TPerson.ChangeEmail (const aEmail: string) : TPerson; begin Result := TPerson.Create(FName, aEmail); //기존 Person의 이메일이 바뀌는 대신 새 Person이 생긴다. // 참고로, 델파이에는 가비지 컬렉션이 없으므로, 기존의 오브젝트는 제거하여 메모리 누수를 방지할 필요가 있다. end; 함수형 프로그래밍과 명령형 프로그래밍 함수형(Functional) 프로그래밍이란? 함수형 프로그래밍은 크게 주목받고 있다. Haskell, Scala, Clojure, F#, Erlang, Groovy 등이 모두 함수형 프로그래밍 언어이다. 함수형 프로그래밍으로 만든 프로그램에는 오로지 함수만 있다. 즉 모든 것이 함수이다. 급부상 하는 이유 저명한 프로그래머들이 함수형 프로그레밍을 하고 있다. (순수 함수형 프로그래밍은) 멀티 쓰레드에서 안전하다. 더 간결하고, 더 작성하기 쉽다. (간단한 함수 호출 코드로 기존의 긴 코드를 교체할 수 있다) 테스트와 디버깅이 더 쉽다. (상태 변화를 추적할 필요가 없기 때문에) 명령형(Imperative) 프로그래밍이란? 컴퓨터 프로그램 컴퓨터가 수행할 작업이 정의된 명령 세트 컴퓨터에게 작업 지시를 하면 컴퓨터는 지시받은 대로 수행한다. 우리가 코드를 작성하고 생각하는 익숙한 방식은 이른바 “명령형” 프로그래밍은 어떻게(HOW) 수행할 것인지를 정해주는 방식이다. “명령형” 프로그래밍은 상태를 변경하는 방식이다. 함수형(Functional) 프로그래밍과 (우리에게 익숙한) 명령형(Imperative) 프로그래밍의 차이점 명령형 (Imperative) 프로그래밍 함수형(Functional) 프로그래밍 코드의 목적 어떻게 (HOW) 하는 지를 정의 무엇을 (WHAT)을 하는 지를 정의 코드 작성 순서대로 명령을 실행하는 "과정" 중심 표현식의 "결과" 중심 문제 해결 방식(예시) 목록에서 다음 고객을 선택하고, 만약 청구할 금액이 있으면, 청구서를 발행한다. 만약 목록에 고객이 더 있으면, 첫단계로 가서 반복한다. 목록에서 청구할 금액이 있는 모든 고객에게 청구서를 발행한다. 함수형 프로그래밍 이해하기 먼저, 고정 관념에서 완전히 벗어날 필요가 있다. “객체 지향은 움직이는 부분을 캡슐화함으로써 코드를 이해할 수 있도록 한다. 함수형 프로그래밍은 부분의 움직임을 최소화함으로써 코드를 이해할 수 있도록 한다” - 마이클 페더스 (Michael Feathers) 디버깅을 해본 개발자라면, 움직이는 부분들이 너무 많고, 코드를 이해하려면 이 많은 움직임을 힘들게 쫓아다녀야 한다는 점을 잘 안다. 움직이는 부분이 최소화 된다면 훨씬 단순해 질 수 있다. 함수형 프로그래밍: 메소드/함수의 요건 함수형 프로그래밍에서 메소드/함수는 참조 투명성이 확보된다. (즉, 참조하는 쪽에서 볼 때 ‘항상’ 같은 결과를 확신할 수 있다) 즉, Method Signature가 언제나 정직하다. (즉, 인자가 같으면 항상 그 결과도 같다) 예를 들어 메소드에 A를 전달하면 결과는 항상 B이다. (B가 아닌 결과는 절대 나올 수 없다) [퀴즈] Assert.True (f(x), f(x))는 항상 ‘참’인가? 항상 ‘참’이라고 보장할 수 없다. 각 f(x)의 결과가 다를 수 있고, 그러면 ‘거짓’일 수도 있기 때문이다. 항상 ‘참’이라고 보장하려면, f(x)의 결과가 항상 같다고 보장되어야 한다. 즉 f(x)는 “참조 투명성”이 확보된 순수한 함수여서 상태가 전혀 변하지 않아야 한다. 참조 투명성이 확보된 함수와 그렇지 않은 함수의 차이 // 호출되는 시점에 따라 결과가 달라지는 함수 function GetElapseTime (const aThen: TDateTime): TTimeSpan; begin Result := Now - aThen; //같은 값을 받아도 호출되는 시점에 따라, Now의 값이 다르기 때문에, 결과도 달라진다. end; // 호출되는 시점과 관계없이 항상 결과가 같은 함수 function sGetElapseTime (const aThen, aNow: TDateTime): TTimeSpan; begin Result := aNow - aThen; //받은 값으로만 계산하므로, 같은 값을 전달하면 결과도 항상 같다. end; 함수형 프로그래밍: 함수의 특징 함수형 언어의 빌딩 블록이다. 완전히 캡슐화되어 있다. (일종의 블랙박스이다) 사전에 확실히 정해진다(순수하다) 참조 투명성이 보장된다 즉, 인자가 같으면 결과도 항상 같다. 상태 변경을 하지 않는다. 부작용이 없다. 전역 상태값을 참조하지 않는다. 교환 가능하다. 즉, 함수의 실행 순서가 바뀌어도, 결과가 바뀌지 않는다. 명령형 프로그래밍에서는 함수 간의 호출 순서가 중요해서 주석을 남기기도 하는데 그럴 필요 없다. 함수형 프로그래밍: 함수 (매우 중요!) 함수형 프로그래밍에서 함수는 가장 중요한 지위를 가진다. 추상화의 기본 단위 함수 자체가 인자(Parameter)가 되어 전달될 수 있다. 함수 자체가 결과값으로 반환될 수 있다. 결과를 해당 함수로 교체할 수 있다. 함수는 다른 언어 생성자가 보일 수 있는 곳이면 어디든지 보인다. (함수형 프로그래밍 언어에서 함수는 일종의 루트 타입이다) 부작용이 없다: 멀티 쓰레드에서 안전하고, 항상 결과가 정확하다. 함수형 프로그램밍: 완성된 프로그램의 특징 더 단순하다 (코드가 짧고, 변수의 상태 변화를 걱정하거나 확인할 필요가 없다) 코드 작성과 유지가 더 쉽다. (오직 함수만 만들어 쓰고 관리하면 된다) 시간적 결합 (Temporal Coupling) 문제가 없으므로, 호출 순서를 고민하지 않아도 부작용이 없다. 멀티 쓰레드에서 동시성 문제를 걱정하지 않아도 된다. 변수 값 변화를 확인하느라 애쓰지 않아도 된다. 함수형 프로그래밍 방식으로 생각하기 함수형 프로그래밍을 위한 새로운 생각 상태 변경이 아니라 불변 상태를 생각하자 즉, 변수나 오브젝트의 조건이나 상태를 확인하면서 지시하지 말고, 변하지 않는 것을 정의하고 조합하자. 단계가 아니라 결과를 생각하자 루프 없이 가능한가? 물론 가능하다. (아래 예문 참조) 구조가 아니라 조합을 생각하자 명령이 아니라 선언을 생각하자 원하는 것이 무엇인지를 작성하자. 어떻게 실행하는 지를 명령하지 말자. 함수형 프로그래밍에서 하지 말아야 할 것 변수값 변경 (X) 할당 연산자 (X): 할당문은 상태를 바꾸는 것이 목적이다. 루프 사용 (X): (IEnumerable로 대체하는 아래 예문 참조) 데이터 구조 변경 (X) 부작용이 있는 코드 (X) 생각할 점! GoTo문 사용 중지 운동 당시 많은 개발자들이 당황했었다. 하지만, 지금 우리 대부분은 GoTo 문 없이 코딩을 하고 있다! 타협점 WriteLn: 대부분의 프로그램은 사용자의 입력을 받을 필요가 있다. 사용자와 상호 작용을 위한 타협: 대부분의 프로그램은 결과 표시 등 사용자와 상호 작용을 한다. 예문: 델파이 구현한 함수형 프로그래밍 델파이로 함수형 프로그래밍을 하기 위해 필요한 것 함수형으로 생각하기 IEnumerable 사용 (오픈 소스 Spring4D 에서 제공) 익명 메소드 사용 for 루프를 쓰지 않기 1. 정해진 갯수까지 제곱값 구하기 // [1] 일반적인 델파이 코드 procedure PrintSquare1 (const aInteger: Integer); var i: Integer; begin for i := 1 to aInteger do // i의 값이 계속 바뀐다. begin WriteLn(i, ‘ - ‘, i * i); end; end; // [2] 상태 변경을 피하기 위해 재귀 호출 사용 // (할당문을 사용하는 상태 변경은 피했지만, 재귀 호출은 메모리 부하가 크고 매우 조심해서 사용해야 한다는 점은 다들 안다) procedure PrintSquare2 (const aInteger: Integer); begin if aInteger > 0 then begin PrintSquare2(aInteger - 1); //상태 변경으로 볼 수 있지만, 할당문은 아니다. WriteLn(aInteger, ‘ - ‘, aInteger * aInteger); end; end; // [3] TEnumerable (오픈 소스 Spring4D)와 익명 메소드 활용 uses Spring.Collections: //Spring4D … procedure PrintSquare3 (const aInteger: Integer); begin if aInteger > 0 then begin TEnumerable.Range(1, aInteger).ForEach(procedure(const aInt: Integer) //익명 메소드 begin WriteLn(aInt, ‘ - ‘, aInt * aInt); end; end; // [4] 함수를 반환하는 함수형 작성 type TPrintSquaresProc = reference to procedure (const aInteger: integer); … procedure PrintSquare4: TPrintSquaresProc; begin Result := procedure(const aInteger: integer) begin PrintSquare3(aInteger); end; end; // [5] 함수를 인자로 받는 순수한 함수형 작성 // 제곱을 어떻게 하는 지를 전혀 명령하지 않는다. 그냥 "제곱을 해라" 라고만 한다. type TPrintSquaresProc = reference to procedure (const aInteger: integer); … procedure PrintSquare5(const aInteger: integer; aProc: TPrintSquaresProc); begin aProc(aInteger); end; … //알맞은 함수만 인자로 전달하면 제곱 뿐만 아니라 무엇이든 해당 함수에 의한 출력을 수 있다. //여기서는 PrintSquare4 함수를 전달하여 제곱을 출력한다. PrintSquare5 (10, PrintSquare4()); 2. 과잉수 (abundant number, 약수의 값이 자기 자신보다 큰 숫자) 구하기 (역자 주: 이 요약에서는 일반적인 방식의 코드 설명 부분은 생략) 당연히, 꽤 길고 복잡하고 루프와 할당문이 많이 사용된다. 당연히 코드 작성도 오래걸리고, 변수의 값을 일일이 추적하면서 디버깅하는 것도 오래 걸린다. // 함수형 코드 uses Spring.Collections, uNumberClassificationTypes; type TSomewhatFunctionalNumberClassifier = class public // TSomewhatFunctionalNumberClassifiers는 클래스 함수로만 구성 class function IsFactor(aNumber: Integer; aPotentialFactor: Integer): Boolean; class function Factors(aNumber: Integer): ISet; class function IsAbundant(aNumber: Integer): Boolean; static; class function IsDeficient(aNumber: Integer): Boolean; static; class function IsPerfect(aNumber: Integer): Boolean; static; end; … function SomewhatFunctionalNumberClassifier(aNumber: Integer): TNumberClassifier; begin if TSomewhatFunctionalNumberClassifier.IsPerfect(aNumber) then begin Result := Perfect end else begin if TSomewhatFunctionalNumberClassifier.IsAbundant(aNumber) then begin Result := Abundant end else begin Result := Deficient end; end; end; // [1] 이 함수만 유일하게 상태가 변하고 루프를 사용한다. 이것은 뒤에서 다시 한번 더 함수형으로 개선하겠다. class function TSomewhatFunctionalNumberClassifier.Factors(aNumber: Integer): ISet; var LFactores : ISet; i : Integer; begin LFactores := Collections.CreateSet; for i := 1 to Round(Sqrt(aNumber)) do // 상태가 변하는 유일한 지점 begin if IsFactor(aNumber, i) then begin LFactores.Add(i); LFactores.Add(aNumber div i); end; end; Result := LFactores; end; // 위 [1]을 더 개선한 코드 (TEnumerable.Range와 익명 메소드 활용) class function TSomewhatFunctionalNumberClassifier.Factors(aNumber: Integer): ISet; begin Result := TEnumerable.Range(1, aNumber).Where( function(const aInteger: Integer) : Boolean begin Result := IsFactor(aNumber, aInteger); end); end; class function TSomewhatFunctionalNumberClassifier.IsFactor(aNumber: Integer): Boolean; begin Result := aNumber mod aPotentialFactor = 0; end; class function TSomewhatFunctionalNumberClassifier.IsPerfect(aNumber: Integer): Boolean; begin Result := Factors(aNumber).Sum - aNumber = aNumber; end; class function TSomewhatFunctionalNumberClassifier.IsAbundant(aNumber: Integer): Boolean; begin Result := Factors(aNumber).Sum - aNumber > aNumber; end; class function TSomewhatFunctionalNumberClassifier.IsDeficient(aNumber: Integer): Boolean; begin Result := Factors(aNumber).Sum - aNumber < aNumber; end; 위와 같이 ,함수로만 구성되고, 상태 변화가 없고, 함수가 파라미터로 전달되고, 이해하기 쉽고, 훨씬 단순한 코드 예문을 보았다. 이런 방식을 사용하면 델파이에서 함수형 프로그래밍을 할 수 있다. 요약 순수 함수는 부작용이 없다. 같은 입력을 받으면 항상 같은 출력을 한다. 함수형 프로그래밍은 상태 변경을 하지 않기 때문에 멀티 쓰레드 환경에서도 안전하다. 할당 연산자를 사용하지 않는다. 함수형 프로그래밍은 상태를 공유하지 않는다. << DelphiCon 2020 목록으로 이동
  16. Kori

    [DelphiCon 요약] 델파이 고성능 구현

    << DelphiCon 2020 목록으로 이동 DelphiCon 의 2020 시리즈 중, High Performance Delphi - Primož Gabrijelčič 의 한글 요약본입니다. 델파이 고성능 구현 ‘Delphi High Performance’ 도서 저자가 직접 성능 개선을 데모와 함께 설명합니다. 발표자 (Primož Gabrijelčič)는 1980년대 8비트 시절부터 파스칼 코드를 써오고 있습니다. 주로 방송용 고가용성 서버 프로그램을 개발하고 있으며, 수준높은 주제를 다루는 수많은 기고를 해오고 있습니다. (발표자의 웹페이지: http://thedelphigeek.com) 발표자가 저술한 도서 디자인 패턴을 델파이에서 실습하기 델파이 고성능 구현 (Delphi High Performance) 옴니쓰레드라이브러리를 활용한 병렬 프로그래밍 (Parallel programming with OmniThreadLibrary) 원본 비디오(YouTube) 보기 (56 min)를 권장합니다 목차 성능 향상 개요 알고리즘 향상 알고리즘 복잡도와 성능 빅오(Big-O) 표기법 알고리즘 별로 데이터 증가와 복잡도(성능 저하)의 관계를 파악 더 좋은 알고리즘으로 바꾸기 예제: 무작위 단어 검색 프로그램의 성능을 향상해보자 알고리즘 별로 성능 차이 비교 개선 전: 정렬되지 않은 TStringList 검색 개선 1: 정렬된 TStringList 검색 개선 2: TDictionary 검색 개선 3: 글자 수별로 TStringList를 따로 만들고, 이 TStringList를 다시 오브젝트 리스트에 모아두고 사용하기 코드가 지나치게 많이 실행되는 것을 방지하기 예제: 2GB 파일을 1KB 단위로 읽고, 진행률을 표시하는 프로그램을 개선해보자 개선 전(흔한 코드): “화면에 진행율을 표현하는 코드”가 성능을 크게 떨어뜨리고 있었다. 개선 후(화면 업데이트를 필요한 만큼만 실행): “화면에 진행율을 표현하는 코드”는 100번만 실행하면 충분하다. 예제: TListBox와 TMemo에 각각 항목을 10,000 개씩 넣는 프로그램을 개선해보자. 코드 개선 전/후의 소요 시간 비교표 개선 전: 10,000 항목 x 2개 컨트롤 = 20,000번 윈도우와 메시지 교환 개선 1: 루프 앞뒤에 BeginUpdate와 EndUpdate 호출하여 윈도우와 메시지 교환을 2번으로 줄인다. 개선 2.1-TMemo: 해당 루프 안에서는 항목을 화면을 사용하지 않는 오브젝트인 TStringList에 넣고, 루프 밖에서 TStringList를 TMemo에 바인딩하여 모든 항목을 한번에 넣기 개선 2.2-TListBox를 가상 모드로 사용하여 필요할 때 데이터를 추가하기 불필요한 코드 실행 없애기 예제: (캐싱) 지역변수를 활용한 캐싱 예제: 피노나치 수열 계산 프로그램 개선하기 개선 전 (기존 코드): 피보나치 수열을 계산 수학식을 그대로 코드에 넣으면 심각한 성능 문제가 발생 개선1(캐싱): 재귀 호출을 하되, 적어도 동일한 연산은 반복하지 않도록 한번 연산된 것은 결과를 캐시(저장)해 두었다가 재사용 하자. 개선2: 재귀 호출 알고리즘을 순차적 반복 호출 알고리즘으로 바꾸어서 해소 알고리즘 향상에 관심이 있는 개발자에게 권장하는 자료 성능 향상 개요 ‘성능 향상 작업’을 하는 순서 (’성능 향상’이 의미하는 바는 사람들마다 다를 수 있지만, 순서는 거의 같다.) 문제 식별 (‘측정’이 중요하다!) TStopwatch, 성능 카운터, GetTickCount 등을 활용하여 명시적으로 측정하자. AQTime 등 전문 프로파일링 도구를 사용하는 것도 좋다. ‘알고리즘 향상’: 가장 좋은 방법! 이 세션에서 다룰 내용이다! 세부적인 코드 튜닝 병렬 처리 적용 외부 라이브러리 사용 더 좋은 알고리즘을 제공하는 라이브러리를 도입하여 빠르게 문제 해결 가능. 주의할 점: 외부 라이브러리 제작자가 유지보수를 하지 않는 상황에 대한 대비가 필요 (성능 향상이 필요한 특정 부분을) 어셈블리어와 같은 저수준 언어로 대체 주의할 점: 10년 후에는 지금보다도 저수준 언어 개발자 찾기가 더 어려워 진다는 점을 고려해야 함 알고리즘 향상 알고리즘의 복잡도와 성능 빅오(Big-O) 표기법 알고리즘 별로 데이터 증가와 복잡도(성능 저하)의 관계를 파악 성능 향상 방법 더 좋은 알고리즘으로 바꾸기 코드가 불필요하게 많이 실행되는 상황을 찾아서, 실행 횟수를 줄이기 코드가 실행하지 않아도 되는 상황을 찾아서, 실행되지 않도록 하기 알고리즘 복잡도와 성능 빅오(Big-O) 표기법 컴퓨터 과학에서 빅 O 표기법은 입력 크기가 커짐에 따라 실행 시간 또는 공간 요구 사항이 어떻게 증가하는 지를 파악함으로써 알고리즘을 분류하는 데 사용된다. 데이터가 증가할 수록 프로그램의 속도가 얼마나 느려지는 지를 판단할 때에도 유용하다. 프로그램의 성능 문제는 데이터가 많아지면서 발생되는 경향이 크다. 관련 웹페이지 추천: 알고리즘 별 복잡도가 잘 정리된 웹 문서: http://bigocheatsheet.com 다양한 데이터 구조를 자세히 비교한 웹 문서: https://geeksforgeeks.org/data-structures 알고리즘 별로 데이터 증가와 복잡도(성능 저하)의 관계를 파악 O(1)은 데이터가 아무리 증가해도 성능이 저하되지 않는다. 반면에, 피보나치 수열 재귀호출은 복잡도 즉 성능이 급격하게 저하된다 (역자 주: 재귀 호출은 매우 강력하지만, 코딩에 적용하기 전에 주의해야 합니다. 뒤에서 재귀 호출과 관련된 예시와 개선 방향이 제시됩니다) 더 좋은 알고리즘으로 바꾸기 예제: 무작위 단어 검색 프로그램의 성능을 향상해보자 (비디오 13분 30초부터 보기) 프로그램: 글자수가 주어지면,그 글자수에 해당하는 영어 단어를 무작위로 만들고, 37만개 단어가 들어있는 목록 안에 있는 단어인지를 알려준다. 모든 목록은 동일한 파일(37만 단어)을 읽어서 만든다. 목록 생성은 한번만 실행되면 되지만, 검색은 훨씬 더 많이 실행된다는 점을 고려하자. 알고리즘 별로 성능 차이 비교 알고리즘 글자수 증가에 따른 결과 비고 일반적인 코드 정렬되지 않은 TStringList 검색 4글자 단어까지는 1초 이내 완료 5글자 단어는 1초 이상 소요 6글자 단어부터는 시간 초과 IndexOf 함수에서 RTL은 순차 탐색을 한다.: O(n)에 해당 최악의 경우, 37만번째 단어까지 찾아봐야 결과를 알 수 있다. 개선1 정렬된 TStringList 검색 6글자 단어까지는 1초 이내 완료 7글자 단어는 1초 이상 소요 8글자 단어부터는 시간 초과 IndexOf 함수에서 RTL은이분 탐색을 한다: O(log n)에 해당 정열된 StringList는 처음 만드는데 걸리는 시간은 더 길지만, 검색 속도는 더 빠르다. 개선2 TDictionary 사용 7글자 단어까지는 1초 이내 완료 8글자 단어는 1초 이상 소요 9글자 단어부터는 시간 초과 델파이 Disctionary의 ContainsKey 함수는 Array보다 검색이 빠르지는 않지만, 목록이 클 경우StringGrid의 IndexOf 함수보다는 검색이 빠르다. 개선3 글자 수 별로 TStringList를 따로 만들어서 사용 글자수와 관계없이 1초 이내 완료 성능 개선을 위한 알고리즘을 창의적으로 만들자. 검색 시에는 해당 글자수에 맞는 TStringList를 찾고 그 안에서만 검색한다. 개선 전: 정렬되지 않은 TStringList 검색 // 목록을 생성하는 코드 FWordsUnsorted := TStringList.Create; FWordsUnsorted.Assigned(wordList); … // 목록 안을 검색하는 코드 FindGoodWord ( function (const word: string): boolean begin Result := FWordsUnsorted.IndexOf(word) >= 0; end); 개선 1: 정렬된 TStringList 검색 // 목록을 생성하는 코드 FWordsSorted := TStringList.Create; FWordsSorted.Assigned(wordList); FWordsSorted.Sorted := True; … // 목록 안을 검색하는 코드 FindGoodWord ( function (const word: string): boolean begin Result := FWordsSorted.IndexOf(word) >= 0; end); 개선 2: TDictionary 검색 // 목록을 생성하는 코드 FWordsDictionary := TDictionary.Create(wordList.Count); for word in wordList do FWordsDictionary.Add(word, True); //Key에 단어를 넣고, Value에는 그냥 True로 모두 넣는다. … // 목록 안을 검색하는 코드 FindGoodWord ( function (const word: string): boolean begin Result := FWordsDictionary.ContainsKey(word) >= 0; end); 개선 3: 글자 수별로 TStringList를 따로 만들고, 이 TStringList를 다시 오브젝트 리스트에 모아두고 사용하기 // 목록을 생성하는 코드 FWordsLOL := TObjectList.Create; FWordsLOL.Add(nil); for word in wordList do begin while FWordsLOL.Count <= Length(word) do FWordsLOL.Add(TStringList.Create); FWordsLOL[Length(word)].Add(word); end; … // 목록 안을 검색하는 코드 wordLen := inpWordLength.Value; if (wordLen < 1) or (wordLen >= FWordsLOL.Count) then //글자수에 해당하는 목록 자체가 없으면 검색할 필요도 없다. idx := -1 else //글자수에 해당하는 목록이 있으면, 해당 검색할 문자를 만들고, 해당 글자수로 된 단어를 모아둔 리스트에서 검색한다. idx := Random(FWordsLOL[wordLen].Count); if (idx >= 0) and (idx < FWordsLOL[wordLen].Count) then lbWords.ItemIndex := lbWords.Items.Add(Format('%s (%d ms)', [FWordsLOL[wordLen][idx], time.ElapsedMilliseconds])) else lbWords.ItemIndex := lbWords.Items.Add(Format('No such word (%d ms)', [time.ElapsedMilliseconds])); 코드가 지나치게 많이 실행되는 것을 방지하기 (일반적인 GUI 프로그램에서는) 초당 수천번씩 화면을 업데이트하지 말자. 루프 앞뒤에 BeginUpdate와 EndUpdate 호출하여 윈도우와 메시지 교환을 최소화하자. (멀티 쓰레드 사용 시) 초당 수백만번 씩 운영체제에 메시지를 보내지 말자. 예제: 2GB 파일을 1KB 단위로 읽고, 진행률을 표시하는 프로그램을 개선해보자 개선 전(흔한 코드): “화면에 진행율을 표현하는 코드”가 성능을 크게 떨어뜨리고 있었다. ProgressBar1.Max := CFileSize; ProgressBar1.Position := 0; total := 0; while total < CFileSize do begin block := CFileSize - total; if block > 1024 then block := 1024; … // 해당 1KB짜리 'block’을 읽는 코드 Inc(total, block); ProgressBar1.Position := total; ProgressBar1.Update; //문제 지점!!!: 2백만번이나 화면을 업데이트하고 있었다 (여기를 주석처리하고 실행하면 훨씬 빨라진다) end; 개선 후(화면 업데이트를 필요한 만큼만 실행): “화면에 진행율을 표현하는 코드”는 100번만 실행하면 충분하다. ProgressBar1.Max := 100; ProgressBar1.Position := 0; lastPct := 0; total := 0; while total < CFileSize do begin block := CFileSize - total; if block > 1024 then block := 1024; … // 해당 1KB짜리 'block’을 읽는 코드 Inc(total, block); // 문제 지점을 해소하자. currPct := Round(total / CFileSize * 100); //백분율을 미리 계산하고 if currPct > lastPct then //1% 단위로만 (총 100번) 화면 업데이트 begin lastPct := currPct; ProgressBar1.Position := currPct; ProgressBar1.Update; end; end; 예제: TListBox와 TMemo에 각각 항목을 10,000 개씩 넣는 프로그램을 개선해보자. UI 컨트롤에 항목을 하나씩 추가한다는 것은 그만큼 프로그램과 윈도우 운영체제가 서로 메시지를 주고 받는다는 의미이다. 그 횟수를 줄이자. 코드 개선 전/후의 소요 시간 비교표 코드 (컨트롤에 10,000개 항목 추가) TListBox 실행 시간 TMemo 실행 시간 일반적인 코드 루프 안에서 컨트롤에 항목을 추가 7초 28초 개선1 해당 루프 앞뒤에 BeginUpdate와 EndUpdate 호출 0.5초 3초 개선2-TMemo 해당 루프 안에서는 화면을 사용하지 않는 TStringList에 항목을 여기에 넣고 루프 밖에서 TStringList를 컨트롤에 바인딩하여 모든 항목을 한번에 넣기 (해당 없음) 0.2초 개선2-TListBox 가상 리스트 박스 사용 (이것은 불필요한 코드 실행 없애기에서 따로 설명) 0.003초 (해당 없음) 개선 전: 10,000 항목 x 2개 컨트롤 = 20,000번 윈도우와 메시지 교환 for i := 1 to CNumLines do Memo1.Lines.Add('Line ' + IntToStr(i)); for i := 1 to CNumLines do ListBox1.Items.Add('Line ' + IntToStr(i)); 개선 1: 루프 앞뒤에 BeginUpdate와 EndUpdate 호출하여 윈도우와 메시지 교환을 2번으로 줄인다. 델파이는 (뭔가 변경을 시작할께요 라는 표시인) BeginUpdate 코드를 만나면 윈도우 운영체제에 메시지를 보내는 작업을 중단하고, (프로그램이 변경이 다 끝났어요 라는 표시인) EndUpdate를 만나면) 윈도우에 메시지를 보낸다. // [BeginUpdate, EndUpdate만 사용해도 성능이 개선된다] // TMemo는 (10,000 개 항목인 경우 기존 28초에서 3초로 속도가 향상됨) Memo1.Lines.BeginUpdate; for i := 1 to CNumLines do Memo1.Lines.Add('Line ' + IntToStr(i)); Memo1.Lines.EndUpdate; // TListBox는 (10,000 개 항목인 경우 기존 7초에서 0.5초로 속도가 향상됨) ListBox1.Items.BeginUpdate; for i := 1 to CNumLines do ListBox1.Items.Add('Line ' + IntToStr(i)); ListBox1.Items.EndUpdate; 개선 2.1-TMemo: 해당 루프 안에서는 항목을 화면을 사용하지 않는 오브젝트인 TStringList에 넣고, 루프 밖에서 TStringList를 TMemo에 바인딩하여 모든 항목을 한번에 넣기 (비디오 34분 45초부터 보기) // 루프 안에서는 TStringList에 항목을 넣는다. sl := TStringList.Create; for i := 1 to CNumLines do sl.Add('Line ' + IntToStr(i)); Memo1.Text := sl.Text; FreeAndNil(sl); // TMemo에는 루프 밖에서 한번에 넣는다. 개선 2.2-TListBox를 가상 모드로 사용하여 필요할 때 데이터를 추가하기 리스트박스에 항목이 10,000 개 있어도, 실제로 화면에서 한번에 표시되는 항목은 18개이다. 다른 항목을 보려면 스크롤해야 보인다. 따라서, 그렇다면 스크롤에 맞는 항목만 즉시 제공할 수 있다면, 10,000개 항목을 미리 가지고 있는 것과 사용자에게는 다를 바가 없다. 그렇게 한 결과, 같은 기능을 가진 리스트박스가 0.007초 만에 실행됨 가상 리스트박스 구현 방법 TListbox 설정 변경 프로퍼티: Style 프로퍼티를 lbVirtual로 변경 (기본값은 lbStandard) 이벤트: OnData, OnDataFind, OnDataObject 구현 OnData: 리스트박스에 값이 제공되는 이벤트 OnDataFind: Listbox.Items.IndexOf 함수가 사용될 때 호출되는 이벤트 OnDataObject: 리스트박스에 오브젝트가 들어가 있는 경우 사용한다. (지금은 생략) TListbox를 준비하는 코드와 OnData와 OnDataFind 이벤트를 처리하는 코드 // 10,000개 항목은 TStringList에만 넣어둔다. FList.Capacity := CNumLines; for i := 1 to CNumLines do FList.Add('Line ' + IntToStr(i)); //리스트박스의 항목 갯수는 전체 항목수인 10,000으로 지정한다. ListBox1.Count := CNumLines; //리스트박스는 항목을 표시하려고 할 때, 리스트박스는 OnData 이벤트가 발생하고 표시할 항목의 인덱스 번호를 전달한다. procedure TfrmVirtualListBox.ListBox1Data(Control: TWinControl; Index: Integer; var Data: string); begin Data := FList[Index]; //TStringList의 해당 인덱스에 해당하는 문자열을 반환하여 ListBox에 표현도록 한다. // 실제 호출되는 인덱스를 로그로 남겨서 확인해보자 // 처음에는 18개 항목만, 스크롤 하면 그에 맞는 항목만 가져오는 것을 알 수 있다. //OutputDebugString(PChar(Index.ToString)); //일단 주석처리 함 end; // DataFind 즉, (TListbox).Items.IndexOf([찾고자 하는 값]) 코드가 사용되는 경우를 대비한다. // 리스트박스에는 실제로 항목이 들어있지 않다는 점을 명심하자 function TfrmVirtualListBox.ListBox1DataFind(Control: TWinControl; FindString: string): Integer; begin Result := FList.IndexOf(FindString); //데이터를 실제 가지고 있는 곳인 TStringList의 IndexOf 결과를 반환한다. end; 팁! 이처럼 성능이 문제가 있을 때, 먼저 문제되는 코드를 아예 사용하지 않을 방법이 있는가를 생각해 보자. (이 예제에서는 10,000개 항목을 리스트박스에 넣는 부분을 아예 없애버렸다) 불필요한 코드 실행 없애기 예제: (캐싱) 지역변수를 활용한 캐싱 누구나 알고 있는데도, 실제로는 의외로 많은 코드에서 이런 부분이 간과되어 있는 방식이다. 특히, 값을 계산하거나 가져오는 시간이 오래 걸리는 것일 수록 지역변수를 활용한 캐시 효과는 크다. 앞서 사용한 FindGoodWord 함수에서 사용자가 지정한 단어의 글자수는 코드에서 여러번 사용된다. 개선 전: 글자 수를 매번 TSpinEdit에서 읽어온다 (그만큼 윈도우와 메시지를 교환하게 된다). 개선 후: 대신 한번만 읽고 WordLen이라는 지역변수에 넣고, 코드의 나머지 부분에서는 이 지역 변수를 사용하자. 예제: 피노나치 수열 계산 프로그램 개선하기 개선 전 (기존 코드): 피보나치 수열을 계산 수학식을 그대로 코드에 넣으면 심각한 성능 문제가 발생 피보나치 수열 계산 원리는 재귀 호출이다. 하지만, 프로그래밍에서 그대로 재귀 호출로 구현하는 것은 비효율적이다. 재귀 호출로 인한 성능 문제를 해소하기 위해서는 알고리즘을 개선하는 것이 좋다. // 문제점: (1) 재귀 호출이 되고, (2) 동일한 연산도 여러번 반복된다. function TfrmFibonacci.FibonacciRecursive(element: int64): int64; if element < 3 then Result := 1 else Result := FibonacciRecursive(element - 1) + FibonacciRecursive(element - 2); end; 개선1(캐싱): 재귀 호출을 하되, 적어도 동일한 연산은 반복하지 않도록 한번 연산된 것은 결과를 캐시(저장)해 두었다가 재사용 하자. (비디오 52분 17초부터 보기) 더좋은 알고리즘이 떠오르지 않을 때는 이처럼 캐싱을 검토해보는 것이 좋다. function TfrmFibonacci.FibonacciRecursiveMemorized(element: int64): int64; if FFibonicciTable[element] >= 0 then Result = FFibonicciTable[element] else begin if element < 3 then Result := 1 else Result := FibonacciRecursiveMemorized(element - 1) + FibonacciRecursiveMemorized(element - 2); FFibonicciTable[element+1] := Result; end; 개선2: 재귀 호출 알고리즘을 순차적 반복 호출 알고리즘으로 바꾸어서 해소 (비디오 54분 01초부터 보기) 재귀 호출은 대체로 순차적 반복 호출로 대체할 수 있다. 재귀 호출 시 같은 계산을 반복하지 않으면. 기하급수적인 복잡도 증가가 아니라, 순차적인 복잡도 증가 즉 O(1)이 된다. function TfrmFibonacci.FibonacciIterative(element: int64): int64; var a, b: int64; begin a := 1; b := 0; repeat if element = 1 then Exit(a); b := b + a; if element = 2 then Exit(b); a := a + b; Dec(element, 2); until false; end; GbLists.pas: O(1)을 구현한 캐싱 딕셔너리이며 사용하기도 쉽다: https://github.com/gabr42/GpDelphiUnits 에 있다. 알고리즘 향상에 관심이 있는 개발자에게 권장하는 자료 도서 Julian Bucknall, Algorithms and Data Structures PrimožGabrijelčič, DelphiHighPerformance RobertSedgewick&KevinWayne, Algorithms 웹 Algorithms, 4th Edition, https://algs4.cs.princeton.edu/home/ Udacity,edX,Udemy,Coursera... https:www.geeksforgeeks.org/data-structures/ https:www.geeksforgeeks.org/fundamentals-of-algorithms 포럼 Delphi-PRAXIS: en.delphipraxis.net << DelphiCon 2020 목록으로 이동
  17. << DelphiCon 2020 목록으로 이동 DelphiCon 의 2020 시리즈 중, Code Faster in Delphi - Alister Christie 의 한글 요약본입니다. 델파이 코딩 속도를 높여주는 신간 ‘Code Faster in Delphi’ 에 수록된 유용한 팁 중 몇가지를 데모와 함께 알려줍니다. 발표자 (Alister Christie)는 델파이를 배우려는 개발자에게 도움이 되는 LearnDelphi.tv를 운영하고 있습니다. 원본 비디오 시청을 권합니다. Alister의 비디오는 학습하기 좋게 편집되어서 제공됩니다. 이 글의 유용한 단축키가 손에 익고 나면, 더 많은 것도 활용해 보세요: 델파이와 RAD 스튜디오에서 활용할 수 있는 더 많은 단축키가 정리된 파일 다운로드 목차 코드 에디터 단축키 폼 디자이너에서 빠르게 작업하기 최신 RTL의 새 언어 기능을 이용하여, 오래된 코드를 현대화하기 정규식을 활용하여 웹페이지에 있는 모든 이미지의 url을 뽑아서 델파이로 가져오기 코드 에디터 단축키 (비디오 보기) 아래 단축키 중 혹시 사용하고 있지 않는 것이 있는 지 보고 이제부터라도 사용해보자. F12 (폼 디자이너와 코드 에디터 전환): 매주 자주하는 작업이다. 즉, 단축키를 쓰면 하루에도 엄청난 시간이 절약된다. Ctrl+Space와 방향키 (키워드를 빠르고 정확하게 입력하기): 키워드 앞글자 몇 자만 타이핑하고 Ctrl+Space를 사용하면 해당 키워드 목록이 표시된다. 이때, 방향키를 이용하여 원하는 키워드를 선택하면 자동 완성된다. Ctrl+왼쪽 방향키 (현재 줄에서 코드의 가장 앞쪽으로 커서를 이동) Ctrl+Shift+v (지역 변수 선언): 일단 변수명 부터 타이핑한다. 그리고 나서 Ctrl+Shift+v를 사용하면, 변수 선언을 바로 할 수 있다. Ctrl+y (현재 코드 줄을 한번에 삭제): 커서가 있는 곳의 코드 한 줄이 삭제된다. Ctrl+j (for 루프 코드를 빠르게 작성): 일단 for를 타이핑한다. 그리고 나서 Ctrl+j를 사용한다. Ctrl+Shift+c (구현부 코드 골격 자동 생성): 프로시저, 함수, 프로퍼티를 새로 만들 때는, 일단 선언부를 작성하고, Ctrl+Shift+c를 사용하면, 구현부 코드 골격이 자동 생성된다. 프로퍼티의 경우 선언된 Field와 Setter도 자동 생성된다. Ctrl+Shift+Alt+p (매개변수 동기화): 프로시저, 함수, 프로퍼티에서 매개 변수를 선언부( 또는 구현부에서) 변경하고, 그 자리에서 Ctrl+Shift+Alt+p를 사용하면 대응되는 구현부 (또는 선언부)의 매개 변수에도 똑 같이 반영되어 일치하게 된다. Ctrl+Shift+위/아래 방향키 (프로시저나 함수의 구현부와 선언부를 왔다갔다 하기) Ctrl+프로시저(또는 함수) 이름 클릭 (해당 프로시저나 함수의 내용으로 이동) Alt+좌/우 방향키 (뒤로 가기와 앞으로 가기: 이전 작업 위치로 가기 또는 다시 원래 위치로 되돌아 오기) Ctrl+Shif+1˜9 (코드에 북마크를 달기): 커서가 있는 줄에 해당 숫자가 지정된 북마크가 생긴다. 원하는 북마크로 이동하려면, Ctrl+1˜9를 사용한다. 참고: 겟잇 패키지 매니저에서 "bookmark"를 타이핑하고 검색하면, 보다 향상된 북마크를 설치할 수도 있다. 화면에서 코드를 한줄이라도 더 볼 수 있다: 단축키에 익숙해지면 툴바에서 해당 단축 아이콘 빼자. 툴바가 차지하는 영역을 줄일 수 있다. 예를 들어, 뒤로 가기와 앞으로 가기 아이콘을 드래그하여 툴바 바깥으로 꺼내면 툴바에서 없어진다 자주 쓰는 단축 아이콘으로 툴바를 구성하려면, 툴바에서 오른쪽 클릭 > Customize Ctrl+Shift+좌/우 방향키(코드 블록 지정) 후 시작하는 괄호 (선택된 곳의 앞뒤를 괄호로 감싸기): 대/중/소 괄호 모두 적용된다. 참고: 블록 선택 팁: And/Or 로 연결된 곳에서 Ctrl+w를 사용하면 선택되는 코드 블록이 한단위씩 늘어난다. Ctrl+/ (주석 처리): 해당 줄 앞에 //가 추가되어 주석으로 처리된다. (이미 //가 있는 주석에서 사용하면, //가 제거되어, 일반 코드가 된다) 여러 줄을 한번에 주석으로 바꾸려면, 해당 줄을 모두 선택한 상태에서 { 를 사용하여 감싸도 된다. 하지만, 각 줄 앞에 // 두는 주석 처리 방식이 더 일반적이다 Ctrl+q+b (선택 영역의 가장 앞으로 커서 이동) 후 Shift+위방향키 (앞에 있는 코드도 선택 영역에 넣기) Ctrl+q+k (선택 영역의 가장 뒤로 커서 이동) 후 Shift+아래 방향키 (뒤에 있는 코드도 선택 영역에 넣기) Shift+위/아래 방향키 (각 줄의 처음부터 끝까지를 모두 선택) Shift+Alt+위/아래 방향키 (각 줄에서 한칸만 선택): 예를 들어 모든 줄에서 한자씩 왼쪽으로 당기고 싶으며, 이 방법으로 선택하고 Delete키를 누른다 Ctrl+o+k (시작점에서 커서까지 사각형으로 코드 영역을 선택하기와 해당 줄 전체 선택하기를 선택하는 토글): 사각형으로 선택하기로 설정된 경에서는 Shift+위/아래/좌/우 방향키를 사용하여 코드의 일부 영역을 사각형으로 선택할 수 있다. 여러줄을 선택하고 Tab 또는 Shift+Tab (여러줄을 한번에 들여쓰기 또는 내어쓰기) Ctrl+Shift+I (또는 U)도 같은 기능 Ctrl+D (uses 절에 나열된 모든 유닛들을 한줄에 하나씩 배치) 주의! 이 단축키를 사용하려면, 먼저 Tools > Options > Language > Formatter > Delphi > Line Breaks 에서 Line Breaks in Uses clauses를 Yes로 설정해야 한다. 만약, Uses 절의 모든 유닛이 아니라, 일부 유닛 만 한 줄에 하나씩 배치하려면, 원하는 코드 영역을 선택한 후에 Ctrl+D를 사용한다. 폼 디자이너에서 빠르게 작업하기 (비디오 12분 15초부터 보기) TMemo를 폼에 추가할 때 바로 크기를 설정하기 툴 팔레트에서 TMemo를 클릭한다. 그리고 나서, 폼 위에서 TMemo가 위치할 왼쪽 위 지점에서 마우스 왼쪽 버튼을 누르고 그 상태에서 드래그하여 원하는 크기가 될 때까지 끌고 간 후에 마우스 버튼을 놓는다. TEdit 여러개를 폼에 한번에 추가하기 툴 팔레트에서 Shift+원하는 컴포넌트(TEdit)를 클릭하여 툴 팔레트에서 TEdit가 강조 표시되도록 한다. 그리고 나서, 폼 위에 원하는 갯수 만큼 마우스 왼쪽 버튼을 클릭한다. (툴 팔레트에 강조 표시된 컴포넌트를 풀려면, ESC를 클릭하거나 툴 팔레트에서 다른 컴포넌트를 선택한다.) 툴 팔레트 검색창에서 원하는 컨트롤을 타이핑하고 엔터키를 쳐서 바로 폼 위에 추가하기 툴 팔레트에서 Ctrl+Alt+p 설정을 한다 (툴 팔레트 > 오른쪽 클릭 > Properties > Persistent Search Filter 옵션을 활성화 하는 것과 같은 효과) TEdit를 폼 위에 추가하면, 해당 오브젝트 명이 Text 프로퍼티에 자동으로 들어간다. 이것을 지우기 해당 TEdit에서 오른쪽 클릭 > Clear Text (오브젝트 인스펙터에서 Text 프로퍼티를 찾아서 지우는 것과 같은 효과) 컨트롤의 Name, Text, Align 등을 변경하기 해당 컨트롤에서 오른쪽 클릭 > Quick Edit 뒤쪽에 가려져서 마우스로 선택하기 힘든 컨트롤의 위치/크기를 변경하기 스트럭처 창을 이용하여 해당 컨트롤을 선택 Ctrl+방향키 (위치 변경) 또는 Shift+방향키 (크기 변경) 팁! 덮고 있는 컨트롤에서 마우스 왼쪽 버튼을 누른 상태에서 ESC키를 사용한다 (그러면, 아래에 가려진 컨트롤이 선택된다). 그 상태에서 마우스를 드래그하여 뒤에 있는 컨트롤을 이동할 수 있다. 컨트롤 여러개의 위치를 한번에 정렬하기 스트럭처 창 또는 폼 에서 Shift+클릭으로 여러 컨트롤을 동시 선택하고 나서, 기준이 될 컨트롤을 마지막으로 한번 더 클릭한다 (기준 컨트롤만 모서리가 검게 표시되고, 나머지는 모소리가 회색이다). 그 상태에서, 오른쪽 클릭 > Position > Align에서 원하는 정렬을 선택한다. 컨트롤을 움직이지 않고 정렬션을 보기 컨트롤을 마우스 왼쪽 버튼으로 누른 채로 잠깐 기다린다. (또는 Shift키를 누른다) 참고로, VCL 폼 디자이너의 정렬선은,파랑색이 컨트롤 테두리 기준선이고, 핑크색은 컨트롤 안의 텍스트 기준선이다. 컨트롤을 다른 컨트롤 안에 넣기 스트럭처 창에서 컨트롤을 드래그하여 컨테이너가 될 컨트롤 안에 끌어 넣는다. 또는, 폼 위에서 컨트롤을 Ctrl+x하고 컨테이너가 될 컨트롤을 마우스로 선택한 후 Ctrl+v를 한다. TSpeedButton을 사용해야하는데 "실수로" TButton을 사용했다면 폼 화면에서 Alt+F12를 사용하여 폼 코드로 이동한다. (폼 디자니어 > 오른쪽 클릭 > View As Text 와 같은 효과) 폼 코드에서 해당 컨트롤 이름을 검색한 후, "TButton"을 "TSpeedButton"으로 변경한다. 경고 창이 나타나서 SpeedButton 은 Tab Order 프로퍼티가 없다고 해도 Ignore 버튼을 클릭한다. 오브젝트 인스펙터를 보면 TButton이 TSpeedButton으로 변경되었을 것이다. 하지만, 소스 코드에는 여전히 TButton으로 남아 있다. 따라서 컴파일을 시도한다. 그러면, 오류 창이 뜨면서 바꿀 것인지를 묻는 창이 뜬다. 이때, Yes를 클릭하면 소스 코드 역시 TSpeedButton으로 변경되고 컴파일이 진행된다. 이미 설정한 컨트롤을 기준으로 비슷한 것들을 추가하기 폼 디자이너에서 원하는 컨트롤을 선택하고 Ctrl+c 한 후에 메모장에서 Ctrl+v를 하면 해당 컨트롤을 구현하는 코드가 메모장에 복사되어 붙는다. (예를 들어, TButton을 TSpeedButton으로 변경하거나, Caption 프로퍼티의 값을 변경하는 등) 메모장에서 원하는 대로 코드를 바꾸고 나서, Ctrl+c 한다. 다시 폼 위에서 Ctrl+v를 하면 메모장에서 변경한 코드 대로 컨트롤이 추가된다. Ctrl+v를 3번 하면 해당 컨트롤 3개가 추가되므로,컨트롤 여러개를 추가할 때도 유용하다. 컨트롤 여러개에 공통으로 있는 프로퍼티를 한번에 변경하기 폼 디자이너에서 여러 컨트롤을 선택한 후 오브젝트 인스펙터의 검색창에서 원하는 프로퍼티를 타이핑하면, 해당하는 프로퍼티만 창에 표시되므로 해당는 프로퍼티의 값을 한번에 변경한다. 프로퍼티가 여러개 나타나는 경우, 화살표를 이용하여 원하는 프로퍼티를 선택한다. 최신 RTL의 새 언어 기능을 이용하여, 오래된 코드를 현대화하기 (비디오 20분 27초부터 보기) 오래전 부터 사용하던 아래의 코드를 보다 간결 명확한 현대식 코드로 바꿔보자. // 기존에 있던 코드 procedure TForm1.btnGetFileClick(Sender: Object); var F: TSearchRec; begin if FindFirst(‘c:\temp\*.*’, faAnyFile - faDirectory, F) = 0 then repeat Listbox1.Items.Add(F.Name); until FindNext(F) <> 0; end; 1단계: (TDirectory, TPath 등) System.IOUtils 유닛 을 사용하자. 보다 읽기 쉬운 코드가 된다 // [변경 1단계] IOUtils 유닛을 사용 // 개선된 점: 코드를 이해하기가 더 쉬워졌다 (더 짧아지지는 않았지만, 훨씬 읽기 쉬워졌다) uses System.IOUtils; procedure TForm1.btnGetFileClick(Sender: Object); var FilesNames: TArray; FilesName: string; begin FileNames: TArray := TDirectory.GetFiles(‘c:\temp’); for FileName in FilesNames do Listbox1.Items.Add(TPath.GetFileName(FileName)); end; 2단계: 인라인 변수를 사용하자. 현대식 문법이며, 읽기도 쉽고, 실행 효율성도 더 높다. // [변경 2단계] 인라인 변수를 사용 // 개선된 점1: 코드가 더 간결해졌다 // 개선된 점2: 인라인 변수는 해당 영역에서만 유효하다. // (코드에서 변수의 범위는 작을수록 더 좋다. 아래의 새 코드에서는 FileName 변수가 for 루프 안에서만 유효하므로, 바깥에서 사용하면 컴파일러 오류 발생) uses System.IOUtils; procedure TForm1.btnGetFileClick(Sender: Object); begin var FileNames: TArray<string> := TDirectory.GetFiles(‘c:\temp’); for var FileName: string in FilesNames do Listbox1.Items.Add(TPath.GetFileName(FileName)); end; 3단계: 타입 레퍼런스 기능(10.3버전에 추가됨)을 사용하자. 컴파일러가 이해할 수 있는 타입이라면, 이제 굳이 적지 않아도 된다. // [변경 3단계] 인라인 변수 선언 시 타입 지정 생략 // 개선된 점: 코드가 더 간결해졌다 uses System.IOUtils; procedure TForm1.btnGetFileClick(Sender: Object); begin var FileNames := TDirectory.GetFiles(‘c:\temp’); for var FileName in FilesNames do Listbox1.Items.Add(TPath.GetFileName(FileName)); end; 정규식을 활용하여 웹페이지에 있는 모든 이미지의 url을 뽑아서 델파이로 가져오기 (비디오 24분 30초부터 보기) 웹페이지에서 jpg 이미지 100개를 가져오는 작업을 해야하는 상황이라면? 각 이미지 경로를 웹브라우저에서 일일이 찾아서 메모장에 붙이는 수작업을 하지 말자. 아래와 같이 짧은 코드를 만들어서 TListBox에 표시하면, 훨씬 빠르고 정확히 가져올 수 있고, 다음에 또 쓸 수도 있다. // 아래의 버튼 클릭 이벤트 코드 // 단, 이 코드가 작동하려면, 먼저 NetHTTPRequest와 NetHTTPClient 컴포넌트를 폼 디자이너에 올리고 서로 연결을 해두어야 한다 uses System.RegularExpressions; procedure TForm1.Button1Click(Sender: Object); begin var Response := NetHTTPClient1.Get(‘….’); // ...에는 목표 웹페이지 주소 (예) https://www.trademe.co.nz/a/marketplace/gaming/nintendo-wii-u var WebText := Response.ContentAsString; var Matches := TRegEx.Matches(WebText, ‘https://[ˆ/\s]+/\S+?\.jpg'); for var Match in Matches do ListBox1.Items.Add(Match.Value); end; << DelphiCon 2020 목록으로 이동
  18. << DelphiCon 2020 목록으로 이동 DelphiCon 의 2020 시리즈 중, Leveraging High DPI in VCL Applications - Ray Konopka 의 한글 요약본입니다. 발표자 (Ray Konopka)는 CodeSite, Konopka Signature VCL로 유명한 Raize Software의 창업자이며, 월트 디즈니 어트렉션 테크놀러지의 수석 소프트웨어 엔지니어로서, 디즈니리조트, 디즈니랜드 등의 소프트웨어도 개발합니다. 도서 “델파이 컴포넌트 개발하기(Developing Custom Delphi Component)” 저자이기도 합니다. 델파이는 델파이로 만듭니다. 델파이는 11.0 버전에서 IDE 자체에 HighDPI를 적용하였습니다. 그 결과, 델파이 사용자들이 더 쾌적하게 개발할 수 있게 되었습니다. (모니터가 4K 이상이라면 더욱 효과가 큽니다) 여러분의 앱에서도 델파이 11.0과 같이 서로 다른 다중 모니터 특히 최근에 부쩍 많아진 High DPI 모니터 지원할 수 있습니다. 그 방법을 이 세션에서 설명합니다. 원본 비디오(YouTube) 보기 (54 min)를 권장합니다. 발표 자료도 참고하세요. 목차 High DPI 관련 핵심 개념 이제는 개발자가 '단 하나의 DPI' 를 기준으로 잡지 못할 만큼 모니터의 DPI 너무 다양해졌다. 개발자가 '단 하나의 DPI' 를 기준으로 정하기가 어려운 이유는? (데모) 윈도우 메모장을 통해 다중 모니터의 표현 이해하기 애플은 High DPI 처리가 단순 명확하다. 윈도우는 High DPI를 다루기가 어렵다. 윈도우에서 제공하는 DPI 확대/축소 개발한 윈도우용 앱이 High DPI 를 잘 지원하기 위해서, 개발자가 관여 해야 한다. 델파이의 DPI Awareness 옵션 5가지 (2020.11 현재) Unaware (DPI 인식 안함) System aware (시스템 DPI 반영) Per Monitor (모니터 별 DPI 반영) GDI Scaling (GDI 확대/축소) Per Monitor V2 (모니터 별 DPI 반영 버전 2) (데모) 델파이 프로젝트에서 지정한 DPI Awareness 옵션 별 결과 비교 Unaware System aware Per Monitor GDI Scaling Per Monitor V2 TImageCollection TVirtualImageList (데모) Per Monitor V2 옵션에서 TImageCollection와 TVirtualImageList를 사용하기 Per Monitor V2 옵션에서 UI 콘트롤을 동적으로 생성할 때 알맞게 표현하기 위한 VCL 함수들 (데모) Per Monitor V2 옵션에서, UI 콘트롤을 동적으로 생성할 때 알맞게 표현하기 High DPI 관련 핵심 개념 DPI (Dots Per Inch): 1인치에 들어가는 점(Dot)의 갯수 (역자 주: 점은 LCD모니터, 프린터 등 출력 장치의 물리적인 최소 표현 단위) PPI (Pixels Per Inch): 1인치에 들어가는 픽셀(Pixel)의 갯수 (역자 주: 픽셀은 Pics+Element의 복합어이며, 디지털 이미지를 만들 때 사용되는 논리적인 최소 표현 단위) 아주 오래전부터 “윈도우에서 표준 DPI는 96이다”라고 간주하면 안전했다. 그래픽의 사실 상 표준이었던 픽셀 기반은 VGA 부터 sVGA, XGA…로 이어져 오면서 지켜져왔다. DPI와 해상도(Resolution)가 서로 관련은 있지만, 항상 일치하는 것은 아니다. 지금은 더욱 그렇다. 예전에는, 대체로 차이가 거의 없었다. 얼마전까지는 대체로 모니터가 커지고 해상도가 높아져도, 이때에도 '점'의 크기 즉 DPI는 대체로 그대로 유지되면서 크기만 커졌다. 따라서 , 모니터에서 해상도가 커지는 비율 만큼 '점'의 갯수도 같은 비율로 많아지게 된다. 하지만 최근에는, High DPI 장비가 많아졌다 이제는 개발자가 '단 하나의 DPI' 를 기준으로 잡지 못할 만큼 모니터의 DPI 너무 다양해졌다. 화면 배율 (Display Scale Factor) 예전에는, 96 DPI 가 거의 모든 모니터에서 사실 상 표준으로 지켜졌으므로, 1024, 1440 등 해상도가 커져도 UI 작성에 영향이 없었다. 동일하게 96 DPI 인 경우,해상도가 커지면, 활용할 수 있는 면적이 그만큼 커진다는 점만 고려하면 충분했다. 16 x 16 아이콘을 어느 해상도에서 사용해도 큰 문제는 없었다. 이제는, High DPI 화면인 경우, 화면 요소들이 잘 보이도록하는 조치가 필요하다. 예: 226 DPI인 새 노트북에서는 16 x 16 아이콘은 실제 크기가 3mm이다. 너무 작아서 거의 보이지도 않는다. 스크린 해상도 DPI 해당 물리적 화면 크기 1024 x 769 96 10.7” x 8" 1440 x 900 96 15” x 9”.375 2560 x 1440 109 23.4” x 13.2” 3074 x 1920 226 (훨씬 높다) 13.6” x 8.”5 (얼마전에 구입한 노트북) 표1. 얼마 전에 구입한 노트북이 경우, 물리적인 화면의 크기는 더 작은데 DPI는 훨씬 높다. 개발자가 '단 하나의 DPI' 를 기준으로 정하기가 어려운 이유는? 여러 모니터를 동시에 사용하고, 각 모니터의 해상도가 다양해졌다. 사용자가 사용 중인 앱을 드래그하여 DPI가 다른 모니터로 옮기기도 한다. 이제는 다중 모니터 사용에 거의 제한이 없다. (오래 전의 윈도우는 미리 정의된 해상도에 맞는 모니터만 연결할 수 있었다) 사용자가 노트북이나 태블릿에 외부 모니터를 연결/해제하는 경우가 많다. 사용자가 원격 데스트탑을 통해 앱을 사용하기도 한다. 사용자가 컴퓨터 사용 중에 화면 배율(Display Scale Factor)을 변경하기도 한다. (데모) 윈도우 메모장을 통해 다중 모니터의 표현 이해하기 (비디오 7분 30초부터 보기) 윈도우 메모장의 250% 배율 화면: 메인 메뉴 사이의 간격이 매우 좁다. 윈도우 메모장의 일반 배율(100%) 화면 DPI, 해상도, 배율이 다른 모니터를 모두 잘 지원하기는 쉽지 않다. 윈도우 메모장을 보면, High DPI를 전반적으로 무난하게 지원하고 있다. 앱은 배율에 맞게 확대되면서도, 화면이 선명하고, 글자 폰트도 선명하다. 하지만, High DPI에서 여백도 다르고, 본문의 문장의 길이도 다르다. 무엇보다 메인 메뉴 간의 간격이 좁아져서 사용하기에 살짝 불편하다. High DPI에서 윈도우 앱은 "폰트" 확대/축소도 완벽하게 지원하기가 힘들다. "이미지"는 더욱 다루기가 어렵다. 애플은 High DPI 처리가 단순 명확하다. 애플은 모든 화면 요소에서 물리적 표현 단위인 "포인트"를 사용한다. 맥 OS와 iOS에서 PPI는 Point Per Inch를 의미한다. (Pixel Per Inch가 아니다) 애플의 표준은 1인치 당 72 포인트이고, 잘 지켜지고 있다. 따라서, 모니터에 맞게 확대/축소 시, 단순히 배율을 적용한다. 역사적 배경 그래픽 인쇄 분야에서는 DPI (인치당 표현되는 물리적인 점)이 중요하다. 애플은 오래 전부터 이 분야에서 독보적이었다. 윈도우는 High DPI를 다루기가 어렵다. (비디오 11분 47초부터 보기) 마이크로소프트는 애플과 달리 논리적인 단위인 "픽셀"을 사용한다. Dialog Unit (DLU) 마이크로소프트가 고안한 단위로써, 여러 디스플레이 장비를 다룰 수 있도록 윈도우를 설계하는 과정에 생겨났다. 1 Dialog Unit = 윈도우 시스템 폰트 너비 평균의 1/4 Dialog Unit는 논리적인 단위이므로, 물리적인 장비에 따라 달라진다. (장비 의존성이 없고, 물리적 면적에 맵핑되지 않는다) 수직 Dialog Unit와 수평 Dialog Unit가 일치하지 않을 수도 있다. 문제는 지금은 아무도 더이상 Dialog Unit을 사용하지 않는다는 점이다. 마이크로소프트의 개발도구 역시 마찬가지로, 닷넷, 윈폼, XAML 에서도 Dialog Unit을 사용하지 않는다. 요즘 개발도구는 대부분 픽셀(Pixel)을 사용한다. (마이크로소프트 개발도구도 마찬가지이다.) 픽셀은 논리적 단위이며, 물리적 크기가 고정되어있지 않다. 예전에는 거의 모든 모니터가 96 DPI 를 사용했다. 물리적인 단위가 변하지 않으므로, 그것에 기반한 논리적인 단위인 픽셀 역시 실제로 물리적 크기가 고정된 것과 같았다. 이제는 댜양한 DPI가 사용된다. High DPI인 4K 모니터와 일반 모니터는 물리적인 단위인 DPI가 다르기 때문에 그것에 기반한 픽셀의 물리적인 실제 크기 역시 서로 다르다. 윈도우에서는 논리적 크기인 픽셀과 화면의 물리적인 실제 크기를 연결할 방법이 있어야만, High DPI를 다룰 수 있다. 윈도우에서 제공하는 DPI 확대/축소 윈도우는 우리가 아무 조치를 하지 않아도 High DPI 화면에 알아서 표현한다. 윈도우 메모장 데모에서 본 것 처럼 꽤 괜찮지만 여전히 완벽하지는 않다. 개발한 윈도우용 앱이 High DPI 를 잘 지원하기 위해서, 개발자가 관여 해야 한다. 픽셀 크기의 기준을 정하고, 윈도우10 에서 제공하는 DPI 배율 확대/축소(Scaling) 기능을 활용하자. 윈도우는 최신 버전으로 오면서 High DPI 지원이 점점 좋아졌고, 윈도우10에서 상당히 향상되었다. 개발자는 DPI 인식 방식을 각 앱 별로 매니페스트(Manifest)에 기록하여 윈도우에게 알려줄 수 있다. 델파이의 DPI Awareness 옵션 5가지 (2020.11 현재) (비디오 18분 17초부터 보기) 위치: 델파이에서 Project > Options > Application > Manifest > DPI Awareness 옵션 Unaware (DPI 인식 안함) 방식: 윈도우 비트맵은 가장 일반적인 96 dpi를 기준으로 각 모니터에 맞게 확대/축소하여 렌더링한다. 장점 모든 화면 요소를 단순하게 확대/축소하므로, 요소의 위치나 크기가 잘못되지 않는다. 단점 화면이 선명하지 않다. 특히 해상도 낮은 이미지를 High DPI 모니터에서 보면 픽셀이 그대로 드러난다. 의견: 무난한 선택이지만, 보기에 좋지 않기 때문에 최고의 선택은 아니다. (데모 보기) System aware (시스템 DPI 반영) 방식:사용자가 윈도우를 시작할 때 로그인한 모니터의 DPI를 사용하여 윈도우가 알아서 확대/축소하여 렌더링한다. 장점: (언급되지 않음) 단점 사용자가 윈도우를 시작한 주 모니터에 따라, 렌더링 기준이 달라진다. 사용자가 폼을 다른 모니터로 옮기거나 화면 배율(확대/축소)을 변경하면, 화면이 그다지 좋지 않다. 의견: 권장하기 어렵다. (데모 보기) Per Monitor (모니터 별 DPI 반영) 방식: DPI 변경을 최상위 창에 공지하여 DPI가 다른 모니터에서 앱을 따로 다룰 수 있도록 한다. 마이크로소프트가 윈도우8.1부터 채택했다 장점: 윈도우가 모든 것을 임의로 확대/축소하지 않게 되었다. 단점: 실제로는 잘 지원하지 못하고 화면이 틀어진다. (뒤에서 살펴보겠다) 의견: 특별한 이유가 없다면, 사용하지 않는 것이 좋다. (데모 보기) GDI Scaling (GDI 확대/축소) 델파이 10.4에서 VCL용으로 추가되었다. (10.3에서도 가능하긴 했지만 사용하기 불편했다) 윈도우 10 Creators 업데이트 (1703)에서 도입된 기술이 반영된 것이다. 방식: 폰트와 기본 도형 등 모든 것을 GDI 프레임워크가 알아서 DPI에 맞게 확대/축소한다. 디스플레이 배율값과 동일하게 오브젝트를 확대/축소한다. 모니터에 맞게, GDI가 알아서 알맞은 폰트를 사용한다. 원래 10pt인 폰트에 만약 @200% 텍스트가 적용되면, 렌더링할 때 GDI는 실제로 20pt 폰트를 사용한다. 장점 이미지을 제외한 모든 화면 요소를 GDI가 알아서 깔끔하게 표현한다. 개발자가 가장 쉽고 빠르게 High DPI를 잘 지원하는 앱을 만들 수 있다. 단점 개발자가 각 앱별로 별도의 매니페스트를 변경/배포해야 한다. 한 단어 안에서 글자 간격이 불규칙하고 글자가 너무 가깝게 겹칠 수도 있다. 폰트를 잘 선택하여 해결할 수도 있다. 아이콘 등 이미지는 단순히 늘어나거나 줄어들기 때문에 High DPI에서 깨끗하게 표현되지 못한다. 개발자가 관여할 여지가 전혀 없으므로, High DPI 이슈를 개발자가 해소하지 못한다. 의견: 이미지에 색상이나 곡선이 많지 않거나 위의 단점이 문제 되지 않는다면, 최고는 아니지만 대안이 될 수 있다. (데모 보기) Per Monitor V2 (모니터 별 DPI 반영 버전 2) 델파이 10.4부터 제공된다. (역자 주: 델파이 10.3 에도 이 옵션이 있었다) GDI Scaling과 마찬가지로, 윈도우10 Creators 업데이트 (1703) 이후 버전에서 작동한다. 방식 자동 스케일링을 통해 해당 DPI에 맞게 이미지를 제외하고, 모든 것이 확대/축소된다. 또한, DPI 변경을 최상위 창에 공지하여 DPI가 다른 모니터에서 앱을 따로 다룰 수 있도록 한다. 장점: 앱에서 DPI 변경을 인지할 수 있어서, 개발자가 미리 대응할 수 있다. 자동으로 테마가 그리는 윈도우 비트맵은 모두 DPI에 맞게 확대/축소 된다. 비클라이언트 (NonClient) 영역까지도 해당된다. 체크 박스, 라디오 버튼등 공통 콘트롤, 파일 찾기, 폰트 설정 등 윈도우 대화상자 모두가 해당된다. 의견: High DPI를 가장 잘 다룰 수 있는 선택이다. (데모 보기) (데모) 델파이 프로젝트에서 지정한 DPI Awareness 옵션 별 결과 비교 Unaware (비디오 25분 40초부터 보기) High DPI 모니터 실제로 High DPI를 활용하지는 못한다. 앱에서는 폼의 크기는 425 x 405로 인식하고, 폼 전체가 배율에 맞게 단순하게 늘어난다. 모든 요소가 제자리에 있고, 모든 것이 일반 모니터에서와 동일하게 작동한다. 하지만, 폼 전체의 표현이 깔끔하지 않고, 글자와 이미지 곡선에서는 픽셀이 드러난다. 일반 모니터 (96 DPI) ( Unaware 설명 보기) System aware (비디오 28분 15초부터 보기) High DPI 모니터 (사용자가 윈도우 로그인을 한 주 모니터) 아이콘 이미지가 매우 작다 (High DPI에서도 여전히 16x16 크기로 표현되기 때문) 폰트 등 화면 요소들이 선명하게 표현되지는 않는다. 폼 크기는 1055x1002로 High DPI를 활용한다. 일반 모니터 (96 DPI) 96 DPI 모니터에서도 폼 크기는 1055x1002이다. 주모니터인 High DPI를 기준으로 96 DPI와 차이만큼 그대로 축소된다. 그 결과, 모든 것이 크기도 작아지고 선명하지 않다. (System aware 설명 보기) Per Monitor (비디오 30분 01초부터 보기) High DPI 모니터 High DPI에서 폰트 등 화면 요소들이 훨씬 깔끔하게 표현된다. 아이콘 이미지가 매우 작다 (High DPI에서도 여전히 16x16 크기로 표현된다) 폼 크기는 1055x1002로 High DPI를 활용한다. 일반 모니터 (96 DPI) HighDPI에서 잘 보이던 요소들이 96 DPI에서는 크기와 위치가 가 알맞게 적용되지 않는다. 스크롤 바 크기가 훨씬 굵어졌다. 체크 박스와 라디오 버튼 윗부분이 잘렸다. 툴바의 아이콘 간격이 틀어졌다. 이유는, DPI 변경을 앱의 폼에게 전달하지 못하기 때문이다. 스크롤 바와 같은 윈도우 공통 콘트롤에서도 변경전의 DPI를 그대로 반영된다. (Per Monitor 설명 보기) GDI Scaling (비디오 32분 11초부터 보기) High DPI 모니터 개발자가 앱이 GDI Scaling을 사용하도록 별도로 매니페스트를 변경/배포 함으로써, 가장 쉽고 빠르게 GDI를 지원할 수 있으므로 최고는 아니지만 대안이 될 수 있다. 폼은 자신의 크기가 425x405인 줄 알고 있다. 즉 96 DPI 인 줄 안다. 하지만, GDI가 알아서 모든 화면 요소를 High DPI에서 선명하게 표현한다. 폰트, 메뉴간의 간격, 윈도우 콘트롤 등 (단, 이미지는 제외) 폰트는 배율에 맞게 더 큰 폰트가 적용되어서 깨끗하게 표현된다. 아이콘 이미지가 선명하지 않다. (여기서는 아이콘의 16x16 이미지를 단순히 늘렸다) 이미지에 색상이나 곡선이 많지 않은 앱이라면 보기 좋지 않을 수 있다. 일반 모니터 (96 DPI) GDI Scaling은 완벽하지 않지만 멀티 모니터를 대체로 잘 지원한다. (GDI Scaling 설명 보기) Per Monitor V2 (비디오 35분 04초 부터 시청) High DPI 모니터 델파이 10.4부터 제공되며, 가장 완벽하게 High DPI를 지원할 수 있는 옵션이다. High DPI에서 화면 요소가 선명하다는 GDI Scaling의 장점을 그대로 가진다. 폰트, 배치, 윈도우 콘트롤 (스크롤 바 등)이 선명하다. 아이콘 이미지가 매우 작다. (High DPI에서도 여전히 16x16 크기로 표현된다) 하지만, 앱이 DPI 변경을 인지할 수 있으므로 해결할 수 있다 (뒤 데모에서 설명) UI 콘트롤을 동적으로 생성할 때에는 제대로 표현되지 않는다. 하지만, 앱이 DPI 변경을 인지할 수 있으므로 해결할 수 있다 (뒤 데모에서 설명) 일반 모니터 (96 DPI) (Per Monitor V2 설명 보기) TImageCollection 서로 다른 해상도를 가진 이미지들을 공유하는 저장소 예: 아이콘 이미지를 16x16, 32x32 등 여러 해상도에 맞게 보관할 수 있다. 비시각적 컴포넌트이므로 어디든지 넣고 공유할 수 있다. 데이터 모듈이나 메인 폼 등 원하는 곳에 올려두고 쓸 수 있다. 명명 규칙을 맞추어서 이미지 이름을 정하면, 알맞은 이미지가 자동으로 로딩된다. Size in the file name 옵션이 선택되어 있는 지 확인할 것 (ImageCollection 에디터) 다음 3가지 구분자 중 한가지 사용 가능 (-, _, @) 파일명 예시: File-Open-16.png , Edit-Paste-48.png TVirtualImageList 해당 폼의 DPI를 파악하여 각 폼에서 알맞은 이미지를 TImageCollection에서 가져와서 사용하도록 한다. 각 폼마다 각자 TVirtualImageList를 가지고 있어야 한다. 데이터 모듈이나 메인폼에 올려두고 공유하여 다른 폼에서 사용할 수는 없다. 각 폼은 다른 모니터에서 표현될 수 있고, 모니터에 따라 DPI가 다르게 적용될 수 있기 때문이다. AutoFill 프로퍼티 AutoFill을 True로 지정하면, TImageCollection 안의 모든 이미지 중에서 알맞은 것을 TVirtualImageList로 가져온다. 만약, TVirtualImageList에서 TImageCollection 안의 이미지 중 몇가지만 사용하고 싶으면, AutoFill을 False로 지정하고, 원하는 이미지만 선택할 수 있다. (데모) Per Monitor V2 옵션에서 TImageCollection와 TVirtualImageList를 사용하기 (영문 비디오 42분 01초부터 보기) 한국어 더빙 비디오에서 이부분 부터 재생되는 비디오 Per Monitor V2 옵션에서 UI 콘트롤을 동적으로 생성할 때 알맞게 표현하기 위한 VCL 함수들 VCL의 새 함수(들) 단, (윈도우 10 최근 버전의 API를 활용하므로) 윈도우 10 최근 버전 이후에서 만 작동한다. Vcl.Controls.GetSystemMetricsForWindow() 윈도우에 새로 추가된 API인 GetSystemMetrics()와 GetSystemMetricsForDPI()를 호출한다. 이전 버전에서 호출을 시도해도 안전하다. TControl.GetSystemMetrics() 개발자가 편하게 사용하도록 VCL에서 TControl에 GetSystemMetrics가 추가되었다. (DPI 확인은 대체로 콘트롤에서 필요하기 때문이다) 폼 등 모든 TControl이 GetSystemMetricsForWindow 를 호출할 수 있다. 혹시, 이미 윈도우 API에서 직접 GetSystemMetrics를 사용한 코드가 있다면, WinAPI.Windows.GetSystemMetrics로 변경하여 기존 유닛을 그대로 사용해도 된다. TControl.CurrentPPI 프로퍼티 (데모) Per Monitor V2 옵션에서, UI 콘트롤을 동적으로 생성할 때 알맞게 표현하기 (영문 비디오 50분 49초부터 보기) 한국어 더빙 비디오에서 이부분 부터 재생되는 비디오 // 처음 한번 알맞은 크기와 위치에 동적으로 생성되고나면, DPI가 다른 화면에서 표현될 때에도 알맞게 표현된다. procedure TFrmMain.btnAddClick(Sender: TObject); var X, Y, W, H: Integer; begin B := TButton.Create( Self ); B.Parent := pnlPreview; // (변경 전, 10 pixel로 지정) // X := 10; // (변경 후) // VCL.Controls 유닛에 있는 TControl.CurrentPPI 프로퍼티를 사용하여 해당 PPI를 가져와서, // 96 DPI일 때 10 pixel을 기준으로 하고, MulDiv 함수를 사용하여 해당 PPI에 맞게 다시 지정한다. // (참고: Muldiv는 앞의 두 숫자를 곱하고 이어서 세번째 숫자로 나눈 후에 Integer로 반올림하는 델파이 함수) // 일단 이렇게 생성되고 나면, 다른 콘트롤과 마찬가지로 DPI가 다른 모니터로 옮겨져도 알맞게 맞추어진다. X := MulDiv ( 10, CurrentPPI, 96 ); // = 10 * CurrentPPI / 96 Y := MulDiv ( 10, CurrentPPI, 96 ); W := MulDiv ( 75, CurrentPPI, 96 ); H := MulDiv ( 25, CurrentPPI, 96 ); B.SetBounds( X, Y, W, H ); end; Per Monitor V2 매니페스트와 추가된 API를 사용하여 High DPI에서 완벽하게 표현된 결과. end. << DelphiCon 2020 목록으로 이동
  19. << DelphiCon으로 이동 엠바카데로 DelphiCon의 2020 시리즈를 소개합니다. DelphiCon은 공식 "엠바카데로 델파이" 온라인 세미나입니다: : 유튜브에서 모든 비디오 보기 (한글 제목은 한글 요약본이 제공됩니다. 한글 요약본이 필요한 세션 또는 기타 의견이 있으면 댓글을 남기세요) High DPI 고해상도를 VCL에서 활용하기 Leveraging High DPI in VCL Applications - Ray Konopka (54 min) 여러분의 앱에서도 델파이 11.0과 같이 서로 다른 다중 모니터 특히 최근에 부쩍 많아진 High DPI 모니터 지원할 수 있습니다. 그 방법을 이 세션에서 설명합니다. Spring4D 소개 - 델파이 개발을 한수준 높이기 Introduction to Spring4D - Taking Delphi Development to the Next Level - Stefan Glienke (63 min) 델파이로 웹 다루기 (한글 요약 작성 중) Powering the Web with Delphi - Bruno Fierens, Dr. Holger Flick, Chad Hower & Daniele Teti (56 min) Delphi GUI Programming with FireMonkey - Andrea Magni (61 min) 델파이 코딩을 더 빠르게 하는 방법 Code Faster in Delphi - Alister Christie (69 min) 코드사이트 로깅 실전 활용 기법 Real-world CodeSite Logging Techniques - Bob Swart (58 min) 델파이로 함수형 프로그래밍하기 Functional Programming With Delphi - Nick Hodges (34 min) 델파이 고성능 구현 High Performance Delphi - Primož Gabrijelčič (56 min) Delphi at the University: Insights for Students and Teachers - Victory Fernandes (56 min) Opening Keynote: The State of Delphi - Marco Cantù (59 min) Delphi in Education Panel (67 min) FireMonkey and Multi-Device Panel (73 min) Upgrade and Migration Panel (64 min) FireDAC Database Access Panel (88 min) Windows VCL Panel (67 min) Delphi Product Management & Architect Panel (77 min) << DelphiCon으로 이동
  20. 이 팁은 엠바카데로에서 진행하는 TCoffeeAndCode를 보다가 알게되었는데, 유용한 팁인 것 같아서 여기에 공유합니다. (참고로, 당시 주제와는 전혀 상관없는 내용인데 라이브 행사이다 보니 패널들이 이야기하는 중에 불쑥 나온 내용입니다.) RAD 스튜디오(델파이, C++빌더)에서 버전 관리도구 설정을 깃허브와 연결해 놓으면 깃허브(GitHub)에 코드를 안전하게 보관할 수 있습니다. RAD 스튜디오에서 깃허브에 코드를 올리거나 받아내릴 수 있어서 많은 델파이 개발자들이 깃허브를 사용하고 있습니다. 하지만, RAD 스튜디오가 없는 컴퓨터에서, Github에 있는 소스 코드를 웹 브라우저에서 직접 봐야 하는 경우에는 코드 이외의 불필요한 화면 요소들이 많아서 불편합니다. 깃허브(Github.com)에 있는 델파이 코드를 웹 브라우저에서 보다 편하게 볼 수 있는 방법 웹 브라우저에서 Github.com에 접속하여 원하는 소스 파일을 연다. (그림1) 주소창에서 URL 중 github.com 부분만 github.dev로 변경하고 다시 접속한다. (그림2) 그러면, 웹 브라우저에서 작동하는 VS Code가 열린다. Github.com에서 코드를 읽기는 것보다는 당연히 더 좋지만, 코드 포맷이 되어 있지 않아서 조금 불편하다. Github.dev에서 설정 > Extentions 에서 "Pascal Magic"을 추가하면 코드 읽기가 훨씬 편하다. (그림3,4,5,6) 관련 화면 및 상세 설명 그림1. GitHub.com에서 코드를 열면, 웹페이지에 코드 이외의 다른 요소가 많고, 코드 화면에 포맷이 적용되지 않아 읽기 불편하다. 그림2. 웹 브라우저에서 Github의 소스 파일을 열고 나서 .com 부분을 .dev로 바꾸면 웹 브라우저 버전의 VS Code가 열린다. 그림3. Github.dev에서 보이는 코드에 포맷을 반영하려면, 설정 > Extentions를 클릭하여 플러그인을 추가하면 된다. 그림4. 플러그인 검색에서 무료 플러그인인 "Pascal Magic"을 검색하여, 설치한다. 그림5. "Pascal Magic"이 설치되고 활성화된 화면, 이제 델파이 코드를 읽기가 훨씬 좋아진다. 그림6. "Pascal Magic"을 설치하기 전의 소스 코드를 다시 열어보자. 포맷이 적용되어 코드 읽기가 훨씬 좋다.
  21. Kori

    제조사에 기술지원 요청하기

    위로 이동: 설치 방법 이 문서의 목적: 제조사인 엠바카데로 본사에 기술지원을 요청할 필요가 있는 고객이 가장 먼저 찾는 문서 데브기어의 지원에도 불구하고 문제가 해결되지 않을 경우, 제조사(엠바카데로) 지원팀에게 도움을 요청해야 합니다. 목차 제조사(엠바카데로) 지원 서비스의 지원 대상, 처리 시간, 결과 안내 EDN 계정 변경 요청 제품 등록 한도 증가 요청 라이선스 이전(Transfer) 요청 제조사(엠바카데로) 지원팀의 "지원 대상", "처리 시간", "결과 안내" 지원 대상: 누구나 지원 요청을 할 수 있지만, 업데이트 서브스크립션>이 만료된 라이선스인 경우, 지원팀으로부터 "지원 대상이 아니다"는 답변이 옵니다. 처리 시간: 유지 중인 업데이트 서브스크립션의 계약(프리미엄과 일반)>에 따라 다릅니다. 프리미엄이 아닌 경우 지원 요청 처리 시간은 약 1~2일 입니다. 결과 안내: 메일로 전달됩니다. (영문 이메일이어서 간혹 스팸 메일로 분류되는 경우가 있으므로 스팸함도 확인해보세요) EDN 계정 변경 요청 아래 경우 중 한가지만 해당되어도 엠바카데로 본사 지원이 제공되지 않거나 비용이 발생할 수 있습니다. 제조사 지원팀의 지원 대상이 아닌 경우 EDN 계정과 라이선스 수량이 일치하지 않는 경우 요청자가 라이선스 보유자임을 증명하지 못하는 경우 회사명 또는 사용하는 메일 도메인이 기존 정보와 다른 경우, 2010년 이전에 출시된 제품이며 등록된 EDN 계정을 모르는 경우 등등 [진행 절차] 엠바카데로 기술 지원 웹페이지에 접속하세요. 지원 웹페이지에서 [REGISTRATION & INSTALLATION] 버튼을 클릭하면 기술 지원 요청 양식 페이지가 나옵니다. 아래 내용을 참고하여 양식의 모든 항목을 기입한 후 [Submit Case] 버튼을 클릭하세요. 선택 목록: 목록 중에서 "Registering My product"를 선택 Serial Number: 사용하려는 제품의 시리얼번호 Summary: Lost User Name 라고 기입 Detail: (아래 내용을 참고하여 작성) Hi, I work in [회사명], who purchased the license. However I lost the registered username, so I can not register it properly. Could you please let me know the EDN email address on which my product is registered? Best Regards [성명] 조치 결과를 확인하세요. [관련 FAQ] Q: 비밀번호도 함께 전달되나요? 아닙니다. 비밀번호를 잊은 경우에는 EDN 계정의 비밀번호를 재설정하세요. Q: 제품 시리얼번호가 반드시 있어야만 EDN 계정을 찾을 수 있나요? 없으면 안 되나요? 분실된 EDN계정 정보를 찾으려면 시리얼번호가 반드시 필요합니다. Q: 제품 시리얼번호를 도무지 모르겠습니다. 찾을 방법이 있나요? EDN 계정의 이메일주소가 도무지 생각나지 않을 때 조치 방법을 참고하세요. Q: (더 많은 질문): 설치/등록 FAQ 제품 등록 한도 증가 요청 관련 오류 메시지: The registration limit for this serial now has been reached. 엠바카데로 제품은 등록 횟수 한도에 도달하면 등록이 안되므로 제품을 사용하지 못합니다. 이 경우에는, 엠바카데로 지원팀에게 한도 증가를 요청해야 합니다. 제조사 지원팀의 지원 대상이 아니면, 지원이 안될 수 있습니다. (하지만, 일단 요청은 누구나 할 수는 있으므로 아래 안내에 따라 요청해보시기 바랍니다.) [진행 절차] 엠바카데로 기술 지원 웹페이지에 접속하세요. 지원 웹페이지에서 [REGISTRATION & INSTALLATION] 버튼을 클릭하면 기술 지원 요청 양식 페이지가 나옵니다. 아래 내용을 참고하여 양식의 모든 항목을 기입한 후 [Submit Case] 버튼을 클릭하세요. 선택 목록: 목록 중에서 "Request a registration limit increase"를 선택 Serial Number: 사용하려는 제품의 시리얼번호 Reason for Increase: 자신에게 알맞은 증가 요청 사유 선택 [관련 주제] 설치/등록 FAQ (제품 등록 횟수 한도 관련) 라이선스 이전(Transfer) 요청 회사용 EDN 계정과 라이선스 관리 가이드를 지키면, (퇴사/인사발령 등으로 인해) 실사용자 변경이 필요할 때 EDN 서비스를 사용하여 직접 처리할 수 있습니다. 요청을 하기 전에 제조사 지원팀의 지원 대상인지를 먼저 확인하세요. 또한, 라이선스 이전은 매우 민감한 이슈이므로 비용이 발생하거나 지원이 거부될 수 있습니다. 주의! 라이선스 이전 요청에 대한 본사의 조치가 완료되어도 고객이 직접 새 EDN 계정에 이 시리얼번호를 다시 등록해야 합니다. 본사의 조치는 요청한 시리얼번호는 기존의 EDN 계정으로부터 풀어서, 시리얼번호를 처음 받았을 때와 같은 상태로 바꾸는 것입니다. 당장 사용할 필요가 없다면, 설치하지 않고 등록만 미리 하기를 진행할 수도 있습니다.
  22. ISBN 978-89-962516-6-8 / 유리 칼미코프 저 / 박범용 역 / 2016년 / 163 쪽 / 12,000원 / 초급자 용 도서의 예제 소스: https://github.com/devgear/delphi_algorism_book/tree/master/실습 도서의 연습문제 소스: http://www.devgear.co.kr/book/delphi_program_exercise 도서를 PDF로 무료 다운로드: (아래 목차에서 각 모듈 별로 제공됩니다) 비상업용 무료 (커뮤니티 에디션) 개발도구 다운로드: https://devgear.co.kr/free-tools 교보문고에서 구입하기: https://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9788996251668 더 많은 엠바카데로 관련 도서: https://devgear.co.kr/book 유리 칼미코프(Yuriy Kalmykov)는 소프트웨어 개발 분야에서 잘 알려진 전문가이며 "학교에서 델파이 프로그래밍 가르치기" 등 많은 프로그래밍 도서와 교과서를 저술하였다. 이 책은 러시아에서 가장 인정받는 대학 중 하나인 모스크바공학물리연구소 부속 국립원자력대학에서 정보과학 및 체어 처리 교원으로서 학생들을 지도하고 모스크바의 최상위 예비학교에서 학생들을 가르쳐 온 저자의 25년간의 경험을 통해 나온 결과물이다. 이 책은 프로그래밍을 시작하는 모든 사람들을 위한 도서이며, 델파이는 프로그래밍을 잘 배울 수 있는 매우 훌륭한 언어이다. 처음이지만, 제대로 프로그래밍을 배우고 싶다. 처음이지만, 멋진 프로그래머가 되기 위해 생각하면서 프로그래밍을 시작하고 싶다. 처음이지만, 프로그래밍을 통해 문제를 해결하는 과정을 즐기고 싶다. 이 책은 '모듈' 25개로 구성되어있다. 이 책 전체를 모듈 별로 나누어 PDF 파일로 무료 제공합니다. (출력해도 좋으며, 학습 효과 및 인쇄 비용 면에서 교보문고, 인터넷 서점 등에서 구매를 권장) [목차 및 모듈별 설명과 PDF 다운로드] 모듈 0. 책 소개. 저자 소개. 목차 누가 읽으면 좋은가? (왜, 읽을 가치가 있는가?) 이 책에 무슨 모듈이 있고, 어떤 순서로 진행되는가? 저자는 무슨 가치를 위해 이 책을 썼는가? 이 책을 어떻게 활용하면 좋은가? 도서 PDF 다운로드: https://drive.google.com/file/d/17DM-CwSVlWsDDBjfHCayZaQjDuehj49d/ 모듈 1. 델파이 소개. 단순 컴포넌트들 델파이를 실행하고, 프로젝트를 시작하고, 저장한다. 코드를 직접 쓰지는 않지만, 프로그램 화면을 만들고, 작동시켜본다. 폼, 레이블, 텍스트박스, 버튼 등 많이 쓰이는 컴포넌트를 다룰 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/1LMQhK5WWESzF8vUWnEi0fUz6XUuQDAW8/ 모듈 2. 버튼 누름 이벤트 다루기 마우스 클릭, 버튼 누름, 키보드 누름, 창 열기 등 사용자의 행위에 반응하도록 코드를 작성할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/17L4tfExdgAz3fcEeZmH38nWge4HkBil4/ 모듈 3. 변수들, 변수의 타입들, 타입 변환하기 변수(데이터를 메모리에 담아두는 그릇)을 사용할 수 있게 된다. 연산자를 사용하여 변수에 값을 담거나 숫자 계산을 할 수 있게 된다. 숫자, 문자 등 여러가지 유형의 데이터를 담기 위한 변수의 타입을 이해한다. 타입 변환(예: 숫자 타입에서 문자 타입)을 할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/17MpRWwyJuKZoZ8GCqhomb9_O_BoQ-VCA/ 모듈 4. 표준 수학 함수들 다양한 표준 수학 함수를 사용하여 수학 계산을 한다. 도서 PDF 다운로드: https://drive.google.com/file/d/17O9mtCL_RkpfKKpVIeeypo4RclH2sB9U/ 모듈 5. 논리 표현들. Boolean 타입 변수들. 논리 연산들 참과 거짓을 판단하는 논리 표현들을 사용할 수 있게 된다. 크고 작은 것을 비교할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/17V6xd_sCZDGEwbWikiUko1BueXctc0NE/ 모듈 6. 프로그램에서 조건에 따라 실행. IF...THEN...ELSE 문 조건에 따라 다른 행위를 할 수 있도록 프로그램을 만들 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/17VB21H_en0ssfr6f4AVqCPTywmahSRIb/ 모듈 7. 중첩된 IF...THEN...ELSE 문. 작업 해결 실습하기 조건 안에 다른 조건을 중첩하여 처리하도록 할 수 있다. 도서 PDF 다운로드: https://drive.google.com/file/d/17cDN_yDToEH4-iJg-8wbrzDKkr6AiUQW/ 모듈 8. 프로시저들 프로그램이 복잡해지지 않도록, 목적에 따라 프로시저를 만들 수 있게 된다. 그리고 이것을 활용할 수 있게 된다. 프로세저를 사용할 때 필요한 데이터를 넘기고 받을 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/17dCSNAPVstETfKpDqngo9JlbP8TNruR7/ 모듈 9. 함수들 처리한 결과값을 되돌려주어야 하는 프로시저는 함수로 만든다. 도서 PDF 다운로드: https://drive.google.com/file/d/17iScGAJXPFIk9E-loku5oHk3MdYLeJw_/ 모듈 10. 그래픽들 선과 도형을 그리는 코드를 작성할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/17iiD9dyyA2FiTva-bH3fUEoN5qRlK632/ 모듈 11. 반복들 같은 처리를 일정한 조건에서 계속 반복할 수 있는 코드를 작성할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/17xSeKPbwpNCZvHyHmYRSUFPHBZkzoWBF/ 모듈 12. String 문자열들 문자열을 원하는대로 비교하고 조작할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/17yGWoQH-Mae1GTcMBUlFlamMMBwFt1Km/ 모듈 13. 문자열과 숫자 타입을 서로 변환 하기 문자와 숫자를 보다 정교하게 변환할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/18-6sDvg1Enb5zKrRGfqV-WZ0DrZ4bNn8/ 모듈 14. TMemo 콘트롤 여러 줄을 입력하는 텍스트박스를 이용하여 문장을 다룰 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/181k4MeSDl-6Csotld2DEYcmarjGdf5mK/ 모듈 15. TMemo 콘트롤(계속) TMemo 콘트롤에 있는 문장을 더 자유자재로 다룰 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/18gt8gKJ-xNy9-XKTXXe9Z-VSQ7m1bYez/ 모듈 16. 무작위 숫자들, 상수들, 사용자 타입들 프로그램 실행 중에 변하지 않는 값을 지정하여 사용할 수 있게 된다. 내가 원하는 데이터 타입을 새로 만들어 쓸 수 있게 된다. 무작위 숫자를 사용할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/184v6-q_WvUZq7byG5XxX4pnTU2Z8eCoZ/ 모듈 17. 1차원 정적 배열 타입이 동일한 요소들을 모아서 배열로 다룰 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/1887XQ-InFW3uwTg91YMTsP_OFAgWVfgc/ 모듈 18. 배열 정렬하기와 선택정렬 배열 안에 있는 요소들을 정렬할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/18Aoguj4QM8-adTGe7w5tTQsC69UC9vlA/ 모듈 19. StringGrid 콘트롤 데이터를 표 형식으로 표현하고 계산할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/18J1Wgxo4W04WdQBgd6RAdA0gqJ2qSLFv/ 모듈 20. StringGrid 실습 표 안에 있는 데이터를 자유롭게 다루고 활용할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/18MUrXP33X_efoFwsd3v0tSAPUxcjgJeV/ 모듈 21. 2차원 배열들 2차원 배열을 만들고, 그 값을 표에 넣어서 표현할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/18p_gonet3v0pY8KLNPSn0xwsXtav6pdQ/ 모듈 22. 날짜와 시간 날짜와 시간을 표현하고 계산할 수 있게 된다. 도서 PDF 다운로드: https://drive.google.com/file/d/18XbwJHkoQxK9YLcQSfE-U8KA9vHRFeOz/ 모듈 23. 타이머 특정 시간 간격을 두고 실행되도록 프로그래밍할 수 있게 된다. 타이머를 사용하여 반짝이는 별들을 표현할 수 있다. 도서 PDF 다운로드: https://drive.google.com/file/d/18_ktJtgjndc24wzakxnmNsJA6weNGdPW/ 모듈 24. 텍스트 파일들 원하는 데이터를 텍스트 파일에 쓸 수 있다. 원하는 데이터를 텍스트 파일에서 꺼낼 수 있다. 도서 PDF 다운로드: https://drive.google.com/file/d/18a-xGGrL18em7PlU2QreXWASEMCFIdmR/ 모듈 25. 표준 파일 다이얼로그들 파일 열기 대화상자와 파일 저장하기 대화상자를 사용하는 프로그램을 만들 수 있다. 도서 PDF 다운로드: https://drive.google.com/file/d/18cmj9OnfikS1dmKuX9MWQ2dPkhq58nbH/ 더 많은 데브기어의 엠바카데로 도서 보기: https://devgear.co.kr/book 비상업용 무료 (커뮤니티 에디션) 개발도구 다운로드: https://devgear.co.kr/free-tools
  23. 원본: Catching memory leaks in Delphi: a definitive list of tools - 2020년 5월 18일, Wagner Landgraf 메모리 누수 감지는 델파이 개발에서 매우 중요한 작업이다. 이 점에 대해서는 "메모리 누수가 무엇이고 어떤 결과를 초래하는가?" 에서 TMS XData로 만든 서버 등 서버 애플리케이션에서는 더욱 중요하다는 점을 강조하면서 설명했던 적이 있다. 곧 출시될 델파이 10.4 버전에서는 작년에 약속한 대로 통합 메모리 관리가 실현되어 출시될 것으로 보인다. 그래서 이 글이 더욱 의미가 커졌다. 인생이 그렇듯이 변화란 100% 좋거나 100% 나쁘지 만은 않다. 10.4 버전부터 반영된 통합 메모리 관리 역시 장단점이 있다. 다만 한 가지 사실은 분명하다. 델파이의 메모리 관리 방식이 이제 모든 플랫폼에서 동일하다. 따라서 메모리 누수 감지 방법 역시 모든 플랫폼에서 더욱 유사해졌다. 개인적으로는 좋은 변화라고 생각한다. 이 변화가 모바일 플랫폼에서 "더 많은 누수"가 발생할 수 있다는 의미가 아니라는 점 역시 알아두어야 한다. (이 글을 쓰고있는 현재에도 유효한) "예전의" ARC 작동 방식 역시 순환 참조 다루기와 같은 고유한 문제가 있었다. 내 생각에는 메모리 감지가 보다 어려웠다. 소개가 너무 길었다. 이 글의 소박한 목적은 델파이 애플리케이션에서 메모리 누수를 감지하는 데 사용할 수 있는 모든 도구의 최종적인 최신 리스트를 정리하는 것이다. 이제 메모리 관리가 통합 됨에 따라, 여기에 소개되는 도구들의 효과는 예전보다 훨씬 더 커졌다. 윈도우에서 메모리 누수를 감지하고 수정하는 작업은, 윈도우 뿐만 아니라 다른 플랫폼에서도 메모리 누수를 막을 수 있기 때문이다. 이제 리스트를 살펴 보자! 목차 FastMM (무료) LeakCheck (무료) Deleaker (상업용) EurekaLog (상업용) madExcept (상업용) AQTime Pro (상업용) Nexus Quality Suite (상업용) DDDebug (상업용) Spider (무료) 델파이 전용이 아닌 메모리 누수 감지 도구들 결론 FastMM (무료) FastMM (보다 정확히는 FastMM4)은 델파이에서 메모리 누수를 감지하는 사실 상의 표준 도구이다. 이유는 간단하다. 델파이의 기본 메모리 관리자로 이미 들어있고 바로 사용할 수 있기 때문이다. FastMM은 애플리케이션에 메모리를 할당 및 할당 해제한다. 따라서 할당 해제되지 않은 블록을 누구보다도 잘 보고한다. 프로젝트에 코드 한 줄만 추가하면, FastMM이 작동하기 시작한다. ReportMemoryLeaksOnShutdown := True; 예를 들면, program MyProgram; uses ... {$R *.res} begin Application.Initialize; ... {$IFDEF DEBUG} ReportMemoryLeaksOnShutdown := True; {$ENDIF} Application.Run; end. 짜잔 , 이제 이 애플리케이션은 종료될 때 모든 메모리 누수를 보고한다. 즉, 종료 시점에 감지된 모든 메모리 누수가 대화상자에 표시된다. 델파이 개발자라면 누구나 애플리케이션에 이 코드 한줄을 넣어야 한다. 반드시. 나는 델파이에 왜 이 코드가 기본으로 들어가지 않았는지 이해하지 못하겠다. 적어도 {$IFDEF DEBUG} 지시문으로 둘러싸서 넣을 수 있었을 텐데 말이다. 아마도 역사적인 이유가 있지 않을까 싶다. 델파이 안에 기본으로 메모리 누수를 감지하는 좋은 도구가 내장되어 있고, 잘 작동하니까 이제 이 글을 마쳐도 될 것 같겠지만, 몇 가지 더 알아두어야 할 것들이 있다. 델파이에 포함된 FastMM은 FastMM4에서 껍질을 벗겨낸 버전이다. 전체 버전이 아니므로, 당신에게 필요한 디버깅 기능이 없을 수도 있다. (예를 들어 누수된 메모리를 할당한 코드의 위치를 알려주지 않는다.) 코드의 위치까지 알고 싶으면 GitHub의 FASTMM4 공개 리포지토리에 있는 전체 버전을 사용해야 한다. 또한, DLL 하나를 사용해야 모든 디버깅 기능을 쓸 수 있다. 크로스 플랫폼 도구가 아니다. 공식적으로 윈도우에서만 작동한다 (공식 리포지토리에 맥OS 버전도 있는 것 같은데 내가 사용해 본 적은 없다). 많은 기능이 있긴 하지만 실제로 사용하려면 .INC 파일을 직접 다루고 구성해야 하므로 편하게 사용하기 어려운 사용자도 있을 것이다. 그러나, FastMM은 전반적으로 훌륭한 도구이며, 메모리 누수를 감지하는 델파이의 "표준" 도구이다. (참고: FASTMM5가 방금 출시되었다. 아직 테스트하지는 못했지만 다중 스레드 애플리케이션을 위한 성능 면에서 크게 향상된 것처럼 보인다. 어서 빨리 TMS XData에서 테스트해보고 싶다.) 장점 무료 전체 소스 코드가 있음 델파이 안에 들어있음 작동시키기 쉬움 고급 기능이 많음 단점 윈도우 전용 디버깅 기능을 쓰려면 외부 DLL이 필요함 고급 기능을 설정하고 사용하는 과정이 사용자에게 친근하지 않음(내장 GUI가 없음) FastMM 자체에서 할당한 메모리 누수만 보고됨 LeakCheck (무료) 델파이 LeakCheck 는 메모리 누수 감지를 위한 훌륭한 선택이 될 수 있다. 무료이며 오픈 소스이며 FastMM에 비해 다음과 같은 몇 가지 장점이 있다. 크로스 플랫폼이므로 모바일 및 Linux 애플리케이션에서 누수를 직접 확인할 수 있다. 그리고 유닛 테스트 프레임워크 (즉, DUnit 및 DUnitX ) 와 매우 잘 통합 된다. 시작하는 방법은 FastMM과 유사하다. dpr 소스 파일에 있는 uses 절의 가장 앞에 LeakCheck 유닛을 추가하면 LeakCheck가 플러그인되어서 사용할 수 있게 된다. 유닛 테스트를 위한 설정은 조금 더 복잡하지만 어차피 필요한 작업이다. 작은 단점을 하나 들자면, 대체로 사용자 스스로 알아서 사용해야 한다는 점이다. 이 프로젝트는 한동안 업데이트 되지 않고 있다. (잘 작동하기 때문에 나쁘게만 생각할 건 아니지만다). 사용자가 LeakCheck 작성자로부터 직접적인 도움을 받기는 힘들다는 의미이다 (내가 도움을 요청해 본 적은 실제로 없다). 게다가, 인터넷에 정보가 많지 않다. 공식 Bitbucket 저장소에 있는 상세 설명 외에 내가 인터넷에서는 찾은 정보는 사용법을 설명한 글 하나가 유일했다. 장점 무료 전체 소스 코드가 있음 크로스 플랫폼 유닛 테스트(DUnit 및 DUnitX)와 잘 통합됨 단점 사용법에 대한 정보가 많지 않음 최근 업데이트가 없고, 공식 지원이 없음 Deleaker (상업용) Delaker는 이 글에서 소개하는 메모리 누수 감지 전용 도구 중 유일한 유료 도구이다. 제품을 보면 이해할 만 하다. 메모리 누수 감지를 위한 정말 좋은 기능들이 제공된다. (역자주: [UX Summit 2021] Deleaker를 활용하여 메모리 누수 탐지하기 비디오 (11 min, 한국어 더빙)과, [도움말 번역] 딜리커 ( Deleaker)를 사용하여 "델파이" 에서 메모리 누수를 찾는 방법에서 Deleaker가 어떻게 작동되는 지를 쉽게 파악할 수 있다) 앞에 소개한 두 도구와 달리, 친숙한 GUI를 통해 환경을 설정하고 결과를 볼 수 있다. 독립적으로 실행할 수도 있고, 델파이 IDE에 통합시킬 수도 있다. 또한 GDI 누수, 윈도우의 사용자(USER) 오브젝트와 핸들의 누수, 윈도우 API 누수, 써드파티 DLL의 누수 등 훨씬 더 많은 유형의 메모리 누수를 감지할 수 있다. 그런 이유 때문에, Deleaker가 무시할 메모리 누수 유형 지정이 쉽다. – 이런 제외 설정을 하지 않으면, 일반 앱 하나만 실행해도 엄청나게 많은 누수 정보를 얻게 된다. 메모리 할당 스냅샷을 찍는 기능 역시 매우 유용하다. 이를 통해 애플리케이션이 동작하는 전체 시간 뿐만 아니라 애플리케이션의 일부 특정 작업 안에서 발생되는 누출을 감지할 수 있다. 장점 독립 실행형으로 사용하거나 델파이 IDE에 통합할 수 있는 친숙한 GUI 모든 유형의 누출을 감지 CI (지속적 통합)과 연동 가능 (명령줄 도구 제공) 메모리 사용 스냅샷 공식 지원이 제공됨 단점 유료 라이선스(홈 라이선스의 경우 $99, 단일 개발자 라이선스의 경우 $399) 윈도우 전용 EurekaLog (상업용) EurekaLog는 베테랑이다. 지난 수십 년 동안 존재해 왔다. 첫 버전 출시가 언제인지 공식 웹사이트에 나와있지 않지만, 나는 18년 전인 2002년에 EurekaLog 4.0이 출시되었다는 기록을 찾을 수 있었다. EurekaLog는 메모리 누수 감지만 하는 도구가 아니다. 누수 감지는 전체 기능 중 일부일 뿐이다. EurekaLog의 목적은 애플리케이션 사용하는 고객이 경험하는 모든 문제( 예외, 누출 등 )를 감지하여 개발자에게 다시 보고하는 것이다. 따라서, 소프트웨어 품질을 개선하고 고객 지원을 향상하는 데 도움이 되는 훌륭한 도구이다. 다른 환경에서 다양한 작업을 수행하는 모든 고객으로부터 오류 및 누출 보고를 받을 수 있기 때문이다. 또한, ("개발자 환경에서는 재현이 안되는" 상황 등) 고객의 환경에서만 발생하는 까다로운 버그를 찾는 데 에도 역시 도움이 된다. 장점 메모리 및 리소스 누수를 모두 감지 고객 측에서 감지된 누출 및 오류를 개발자에게 자동 전송 가능 기타 다양한 기능: 버그 보고, 버그 추적 시스템과의 통합 등 공식 지원이 제공됨 단점 유료 라이선스(Professional 라이선스의 경우 $149, Enterprise 라이선스의 경우 $249) 윈도우 전용 메모리 누수 감지를 위한 고급 기능이 많지 않음 madExcept (상업용) 나는 MadExcept가 EurekaLog의 "사촌"이라고들 말한다. 둘 다 (약 20년 이상) 거의 동시대의 도구이다. 비슷한 기능도 많고 목적도 거의 같다. 웃기게도 "승자"는 없다. 이 둘을 비교하려고 인터넷을 둘러본다면 어떤 것이 "더 낫다"는 결론을 낼 수 없을 것이다. 두 제품 모두 고객들이 대체로 자신들이 사용하는 제품에 만족해서 경쟁 제품을 사용해 본 적이 없기 때문에 비교 의견을 내지 못하는 것 같다. 사실 내 경우가 그렇다. 나는 madExcept를 사용한 적이 없다. (메모리 누수를 잡기 위해서가 아니라 다른 목적으로 사용했지만) EurekaLog에 매우 만족한다. 만약 내가 EurekaLog 대신 madExcept를 사용하더라도 잘 사용하고 만족했을 것이다. 따라서, 나는 madExcept와 EurekaLog는 장단점도 같다고 본다. 유일하게 눈에 띄는 차이점이라면 (비상업적 용도를 위한 무료 버전도 있는) madExcept는 더 저렴하고, EurekaLog는 훨씬 더 활발하고 자주 업데이트되는 것 정도이다. 장점 비상업적 용도는 무료 메모리 및 리소스 누수를 모두 감지 고객 측에서 감지된 누출 및 오류를 개발자에게 자동 전송 가능 기타 다양한 기능: 버그 보고, 버그 추적 시스템과의 통합 등 공식 지원이 제공됨 단점 유료 라이선스(전체 소스 라이선스의 경우 € 159) 윈도우 전용 메모리 누수 감지를 위한 고급 기능이 많지 않음 AQTime Pro (상업용) AQTime은 코드 개선 목적으로는 어느 무엇보다도 최고의 도구이다. 고급 메모리 누수 감지 (훌륭한 GUI, 스냅샷, 메모리 추적, 리소스 누수 고급 감지 등) 뿐만 아니라 성능 프로파일링 (인스트루먼트 및 샘플링 프로파일러 모두 사용), 코드 커버리지, 코드 분석을 제공하는 정말 수준 높은 도구이다. 정말 멋진 도구이지만 단점이 있다. 꽤 비싸고 "유지 보수" 위주로 운영하는 것으로 보인다. 일년에 한 번 정도 업데이트 되고, "새로운 델파이 버전 지원"이 대부분이다. 지난 몇년간 몇가지 버그 수정이 있었으며 새로운 기능은 거의 없었다 . 하지만 글쎄, 많고 강력한 기능 면에 델파이 세계에서 AQTime에 견줄 만한 도구는 없다. 장점 메모리, 리소스, GDI, 핸들 누수를 감지 실시간 할당 모니터 스냅샷 번들 안에 다른 많은 도구가 포함됨(성능 프로파일러, 코드 커퍼리지 등) 단점 상당히 높은 가격(노드 고정 라이선스의 경우 $719, 플로우팅 라이선스의 경우 $2279) 윈도우 전용 Nexus Quality Suite (상업용) Nexus Quality Suite는 방식이 EurekaLog나 madExcept와 유사하면서도, 어느 정도는 AQTime과 관련이 있다고 생각한다. AQTime과 Nexus Quality Suite는 둘 다 소프트웨어 품질을 향상시키기 위한 많은 도구를 제공하며 이들 사이에는 겹치는 부분이 있다. Nexus Quality Suite는 메모리 및 리소스 누수 감지기 뿐만 아니라 성능 프로파일러, 라인 타이머, 코드 검사, GUI 자동 테스터 등을 제공하다. 나는 메모리 검사 도구를 직접 써 보지는 않았으므로 장단점은 웹 사이트에서 읽은 내용을 기반으로 정리했다. 장점 메모리 및 리소스 누수를 모두 감지 공식 지원이 제공됨, 지원 포럼이 활동적임 패키지에 다른 많은 도구가 포함됨 단점 유료 라이선스(AUD 490, 약 $300) 윈도우 전용 DDDebug (상업용) 제조사의 웹사이트에서 의하면, DDDebug는 메모리 프로파일러, 스레드 뷰어, 모듈 뷰어 및 향상된 예외 처리기 등 여러 모듈이 포함된 디버깅 도구 모음이다. DDDebug는 약간 다른 접근 방식을 가지고 있다는 점이 나는 흥미로웠다. 메모리 사용량과 통계를 애플리케이션 내부에서 즉시 제공하기 때문에, 내가 사용해보지는 않았지만, 분석과 동시에 앱과 상호 작용할 수 있어서 앱에 있는 버그를 더 쉽게 찾을 수 있는 것 같다. DDDebug는 플러스인 패키지에도 작동한다. 메모리 누수 감지 외에도 더 많은 기능을 제공하며 상용이지만 라이선스 가격이 부담스럽지 않다. 장점 GUI를 통해 애플리케이션 내부에 결과를 직접 제공 패키지를 지원함 공식 지원이 제공됨 부담스럽지 않은 라이선스 가격(€59부터) 단점 윈도우 전용 Spider (무료) 스파이더 웹사이트에는 예외 분석, 실시간 메모리 사용 분석, 메모리 누수 분석, 호출 스택 분석 등 흥미로운 기능이 많이 나열되어 있다. 난 한번 밖에 시도해보지 않았는데 사용자 화면과 결과 자체가 혼란스러워서 사용할 수 없었다. 하지만, 나만 그럴 수도 있는 문제라서 여기 리스트에 올려두기로 했다. 하지만, 나는 Spider에 대해서 공평한 평가를 할 수 없다. 장점 무료 소스 코드가 있음 단점 혼란스러운 사용자 인터페이스(개인 의견) 델파이 전용이 아닌 메모리 누수 감지 도구들 델파이 전용 또는 델파이 IDE나 소스 코드에 연결되는 도구들 외에, 메모리 누수 감지용 범용 도구들이 있다. Valgrind (무료) Valgrind는 인스트루먼트 프레임워크이다. 이 프레임워크 안에는 많은 도구들이 있으며 자신의 도구를 추가할 수도 있다. 포함된 도구 중 하나인 memcheck는 애플리케이션 누수를 감지할 때 도움이 된다. 나는 Linux 애플리케이션에서 발생하는 메모리 누수를 감지 할 때 Valgrind를 많이 사용하는데, 실제로 사용법이 매우 간단하다. Valgrind를 실행하면서 명령줄 매개변수에 검사하려는 애플리케이션 경로를 적어주기만 하면 된다. 그러면 Valgrind가 애플리케이션을 구동시키고, 애플리케이션이 끝나면 발생될 수 있는 누수 등 자세한 정보가 담긴 보고서를 제공한다. 물론 로그를 파일에 기록, 호출 스택 크기 지정, 탐지 수준 선택 등 많은 명령줄 옵션을 사용할 수도 있다. Instrument (무료) Apple Instruments는 강력하고 유연한 성능 분석 및 테스트 도구이며 Xcode 도구 세트의 일부이다. 무엇보다도 iOS 및 맥OS 애플리케이션에서 발생하는 누출을 감지할 때 사용한다. Adrian Gallero가 iOS 애플리케이션의 누출을 감지 하기 위해 Instruments 를 사용하는 방법에 대한 훌륭한 글을 TMS Software 블로그에 게시했다. 조금 오래된 글이지만 여전히 유효하다고 믿는다. 결론 승자가 없다 . 각 도구마다 고유한 장단점이 있으며 상호 배타적이지 않다는 점에 유의하자. 실제로 나 역시 목적에 따라 이 도구들 중 몇 가지를 직접 사용한다. 나는 FASTMM을 사용하여 "매일" 메모리 누수를 탐지한다. LeakCheck는 유닛 테스트에서 사용한다. Deleaker는 다른 유형의 누수를 확인하거나, 스냅샷이 필요할 때 사용한다. EurekaLog는 내 최종 사용자 애플리케이션이 버그 리포트를 하도록 만들 때 사용한다. AQTime은 대한 성능 프로파일링을 할 때, Valgrind는 Linux에서 누수를 감지할 때 사용한다. 보다시피 모두 유용하다! 무엇보다 애플리케이션에서 메모리가 새어나가지 않도록 하자! 이런 주제가 처음이라면, 지금 바로 해야할 것을 알게 되었을 것이다. ReportMemoryLeaksOnShutdown := True; 위의 코드 한 줄을 애플리케이션에 추가하고 누수 잡기를 시작하자! (리스트에 포함되어야 하는 다른 도구를 알고 있거나, 나열된 도구에 대해 다른 의견이 있다면, 아래에 댓글을 달아서 지식을 공유해 주기 바란다. 이 글이 완전한 리스트이 되는데 크게 도움이 될 것이다. 나 역시 새로운 내용이 알게 되면 자주 업데이트하겠다.)
  24. 위로 이동: 설치 방법 이 문서의 목적: 제조사인 엠바카데로 본사에 기술지원을 요청할 필요가 있는 고객이 가장 먼저 찾는 문서 데브기어의 지원에도 불구하고 문제가 해결되지 않을 경우, 제조사(엠바카데로) 지원팀에게 도움을 요청해야 합니다. 목차 제조사(엠바카데로) 지원 서비스의 지원 대상, 처리 시간, 결과 안내 EDN 계정 변경 요청 제품 등록 한도 증가 요청 라이선스 이전(Transfer) 요청 제조사(엠바카데로) 지원팀의 "지원 대상", "처리 시간", "결과 안내" 지원 대상: 누구나 지원 요청을 할 수 있지만, 업데이트 서브스크립션>이 만료된 라이선스인 경우, 지원팀으로부터 "지원 대상이 아니다"는 답변이 옵니다. 처리 시간: 유지 중인 업데이트 서브스크립션의 계약(프리미엄과 일반)>에 따라 다릅니다. 프리미엄이 아닌 경우 지원 요청 처리 시간은 약 1~2일 입니다. 결과 안내: 메일로 전달됩니다. (영문 이메일이어서 간혹 스팸 메일로 분류되는 경우가 있으므로 스팸함도 확인해보세요) EDN 계정 변경 요청 아래 경우 중 한가지만 해당되어도 엠바카데로 본사 지원이 제공되지 않거나 비용이 발생할 수 있습니다. 제조사 지원팀의 지원 대상이 아닌 경우 EDN 계정과 라이선스 수량이 일치하지 않는 경우 요청자가 라이선스 보유자임을 증명하지 못하는 경우 회사명 또는 사용하는 메일 도메인이 기존 정보와 다른 경우, 2010년 이전에 출시된 제품이며 등록된 EDN 계정을 모르는 경우 등등 [진행 절차] 엠바카데로 기술 지원 웹페이지에 접속하세요. 지원 웹페이지에서 [REGISTRATION & INSTALLATION] 버튼을 클릭하면 기술 지원 요청 양식 페이지가 나옵니다. 아래 내용을 참고하여 양식의 모든 항목을 기입한 후 [Submit Case] 버튼을 클릭하세요. 선택 목록: 목록 중에서 "Registering My product"를 선택 Serial Number: 사용하려는 제품의 시리얼번호 Summary: Lost User Name 라고 기입 Detail: (아래 내용을 참고하여 작성) Hi, I work in [회사명], who purchased the license. However I lost the registered username, so I can not register it properly. Could you please let me know the EDN email address on which my product is registered? Best Regards [성명] 조치 결과를 확인하세요. [관련 FAQ] Q: 비밀번호도 함께 전달되나요? 아닙니다. 비밀번호를 잊은 경우에는 EDN 계정의 비밀번호를 재설정하세요. Q: 제품 시리얼번호가 반드시 있어야만 EDN 계정을 찾을 수 있나요? 없으면 안 되나요? 분실된 EDN계정 정보를 찾으려면 시리얼번호가 반드시 필요합니다. Q: 제품 시리얼번호를 도무지 모르겠습니다. 찾을 방법이 있나요? EDN 계정의 이메일주소가 도무지 생각나지 않을 때 조치 방법을 참고하세요. Q: (더 많은 질문): 설치/등록 FAQ 제품 등록 한도 증가 요청 관련 오류 메시지: The registration limit for this serial now has been reached. 엠바카데로 제품은 등록 횟수 한도에 도달하면 등록이 안되므로 제품을 사용하지 못합니다. 이 경우에는, 엠바카데로 지원팀에게 한도 증가를 요청해야 합니다. 제조사 지원팀의 지원 대상이 아니면, 지원이 안될 수 있습니다. (하지만, 일단 요청은 누구나 할 수는 있으므로 아래 안내에 따라 요청해보시기 바랍니다.) [진행 절차] 엠바카데로 기술 지원 웹페이지에 접속하세요. 지원 웹페이지에서 [REGISTRATION & INSTALLATION] 버튼을 클릭하면 기술 지원 요청 양식 페이지가 나옵니다. 아래 내용을 참고하여 양식의 모든 항목을 기입한 후 [Submit Case] 버튼을 클릭하세요. 선택 목록: 목록 중에서 "Request a registration limit increase"를 선택 Serial Number: 사용하려는 제품의 시리얼번호 Reason for Increase: 자신에게 알맞은 증가 요청 사유 선택 [관련 주제] 설치/등록 FAQ (제품 등록 횟수 한도 관련) 라이선스 이전(Transfer) 요청 회사용 EDN 계정과 라이선스 관리 가이드를 지키면, (퇴사/인사발령 등으로 인해) 실사용자 변경이 필요할 때 EDN 서비스를 사용하여 직접 처리할 수 있습니다. 요청을 하기 전에 제조사 지원팀의 지원 대상인지를 먼저 확인하세요. 또한, 라이선스 이전은 매우 민감한 이슈이므로 비용이 발생하거나 지원이 거부될 수 있습니다. 주의! 라이선스 이전 요청에 대한 본사의 조치가 완료되어도 고객이 직접 새 EDN 계정에 이 시리얼번호를 다시 등록해야 합니다. 본사의 조치는 요청한 시리얼번호는 기존의 EDN 계정으로부터 풀어서, 시리얼번호를 처음 받았을 때와 같은 상태로 바꾸는 것입니다. 당장 사용할 필요가 없다면, 설치하지 않고 등록만 미리 하기를 진행할 수도 있습니다. View full 엠바카데로 개발도구 가이드
  25. 위로 이동: 설치 방법 이 문서의 목적: 라이선스를 등록하려는 고객이 가장 먼저 찾는 문서 (Docwiki 문서를 기반으로 작성됨) RAD 스튜디오는 설치할 때마다 등록 과정을 거쳐야 사용할 수 있다. 등록은 엠바카데로 제품 등록(Embarcadero Product Registration) 도구의 3가지 다른 형태 중 알맞은 것을 사용하면 된다. Embarcadero Product Registration (등록) 대화상자: 시리얼번호 등록 시 사용 Embarcadero Product Registration (등록) 마법사: 시리얼번호 등록 또는 평가판 신청/등록 시 사용 License Manager (라이선스매니저) : 엠바카데로 제품의 라이선스를 보다 세밀하기 관리 시 사용 일반 설치파일을 사용하여 설치하는 경우, 도중에 Registration (등록) 대화상자가 나타난다. (단, 사용자가 등록 파일을 미리 넣어둔 경우에는 별도의 등록이 필요없다) 오프라인 설치파일을 사용하여 설치하는 경우, 사용자의 선택 (시리얼번호 사용 또는 정품 등록 파일 사용)에 따라 Registration (등록) 대화상자 또는 License Manager (라이선스매니저)가 나타난다. 만약 오프라인 설치파일 사용 중에 평가판 요청을 선택하면 모든 설치가 완료된 후에 Registration (등록) 마법사가 나타난다. 목차 1 Embarcadero Product Registration (등록) 대화상자 2 Embarcadero Product Registration (등록) 마법사 2.1 시작 페이지 2.2 새 EDN 계정 생성 페이지 2.3 활성화 링크 페이지 2.4 시리얼번호 등록 페이지 3 License Manager(라이선스매니저) 4 엠바카데로 제품 등록 웹사이트 4.1 정품 등록 파일 확보하기 4.2 구입 후, 설치를 하지는 않지만 일단 등록만 미리 해두기 4.3 보유한 시리얼번호를 몇번 더 설치/등록을 할 수 있는지 미리 알아보기 5 관련 주제 1 Embarcadero Product Registration (등록) 대화상자 등록대화상자는 시리얼번호와 EDN 계정 로그인 정보를 사용하여 RAD 스튜디오를 등록할 때 사용할 수 있다. 입력 항목 Serial Number: 엠바카데로의 ESD 라이선스 이메일을 통해 받은 시리얼번호 EDN Login Name or Email: 시리얼번호가 연결된 EDN 계정의 로그인명 또는 이메일 EDN Password (비밀번호): 해당 EDN 계정의 비밀번호 자동 표시 항목: Registration Code: 정품 등록 시 꼭 필요한 숫자 값이다. 컴퓨터 별로 (그 컴퓨터 만의) 항상 같은 값이 자동으로 표시된다. 주의! 설치 후 Registration Code가 달라지면, 기존의 등록이 더이상 유효하지 않으므로, 다시 등록하게 된다. 위 입력 항목을 모두 입력하고 [Register]를 클릭하면 등록이 완료된다. 2 Embarcadero Product Registration (등록) 마법사 등록마법사는 시리얼번호를 등록하거나 또는 평가판을 신청/등록할 때 사용할 수 있다. 정품 등록 파일을 사용하려면 라이선스매니저를 사용해야 한다. 2.1 시작 페이지 다음 중 하나를 선택할 수 있다. RAD 스튜디오 평가판을 활성화 하려면, 이메일 주소를 입력하고 [Next]를 클릭한다. 만약 입력한 이메일이 EDN 계정과 일치하면, 평가판용 시리얼번호가 이메일로 전달되고, 시리얼번호 등록 페이지가 열린다. 만약 일치하는 이메일이 없다면, 새 EDN 계정 생성 페이지가 열린다. 시리얼번호를 사용하여 RAD 스튜디오를 등록하려면, "I have a serial number"를 선택한다. 그러면, 시리얼번호 등록 페이지가 열린다. 다른 방식을 사용하기 위해 라이선스매니저를 열려면, "I have a license file"을 선택한다. 2.2 새 EDN 계정 생성 페이지 새 EDN 계정 생성 페이지에서는 EDN 계정을 새로 생성할 수 있다. EDN 계정이 반드시 있어야 RAD 스튜디오를 설치를 마칠 수 있다. 입력 항목: - First name / Last name: EDN 계정 실사용자의 성명 - Email: 수신가능한 이메일 주소 (회사의 라이선스인 경우, '회사메일'를 사용!) - Password / Confirm Password: 새 EDN 계정의 비밀번호 - Company: 회사명 - Phone number: 담당자 전화번호 - Country: Korea (South)를 선택 위 항목을 모두 입력하고 [Next] 버튼을 클릭하면, EDN 계정이 새로 생성되고 입력한 이메일로 활성화 링크가 전달된다. 그리고 활성화 링크 페이지가 열린다. 2.3 활성화 링크 페이지 활성화 링크 페이지는 엠바카데로에서 계정 활성화 링크를 이메일로 전달했다고 알려준다. 해당 이메일의 받은 편지함에서 이메일을 열고 활성화 링크를 클릭하면, 웹페이지가 열리고 제품이 성공적으로 등록되었다는 메시지가 표시된다. 주의! 활성화 링크는 반드시 RAD 스튜디오를 설치할 컴퓨터에서 클릭해야 한다. 모바일 장비 등 다른 컴퓨터에서 실수로 열었을 경우에는 엠바카데로에 연락하여야 한다. 2.4 시리얼번호 등록 페이지 시리얼번호 등록 페이지에서 등록 대화상자와 같은 방법으로 시리얼번호를 사용하여 RAD 스튜디오를 등록한다. 입력 항목 Serial Number: 엠바카데로의 ESD 라이선스 이메일을 통해 받은 시리얼번호 팁! 옆에 있는 [Advanced] 버튼을 클릭하면 라이선스매니저가 열린다. EDN Login Name or Email: 시리얼번호가 연결된 EDN 계정의 로그인명 또는 이메일 EDN Password (비밀번호): 해당 EDN 계정의 비밀번호 자동 표시 항목: Registration Code: 컴퓨터 별로 항상 같은 고유한 숫자 값이 자동으로 표시된다. 주의! 설치 후 Registration Code가 달라지면, 기존의 등록이 더이상 유효하지 않으므로, 다시 등록하게 된다. 위 항목을 모두 입력하고 [Next] 버튼을 클릭하면 등록이 완료되고 [Finish]버튼이 있는 화면이 열린다. 3 License Manager(라이선스매니저) 라이선스매니저에서는 다음과 같은 것을 할 수 있다. 시리얼번호 등록/등록취소 정품 등록 파일 Import 라이선스 정보 조회 설치된 라이선스 업데이트 라이선스 관리 이슈 해소를 엠바카데로에서 도울 수 있도록 로그 생성 ELC 라이선스 관리 화면은 세로로 3개의 창으로 나뉘어져 있다. 왼쪽 창: 컴퓨터에서 사용 중인 제품 라이선스의 목록 가운데 창: 왼쪽 창에서 선택된 라이선스에 관한 상세 설명 오른쪽 창: 사용자가 수행할 수 있는 작업 목록 사용자가 수행할 수 있는 작업 Register: 등록 대화상자 열기 Import: 파일 선택 대화상자를 열어서 엠바카데로 정품 등록 파일을 찾아서 임포트(reg*.txt or *.slip). Update: 라이선스와 시리얼번호 정보를 인터넷에서 업데이트 Add Serial: 대화상자를 열고 시리얼번호를 입력하여 왼쪽 창의 등록되지 않은 시리얼번호(Unregistered serial numbers) 목록에 추가. 받은 시리얼번호를 실제로 등록하지 않고도 관련된 상세 정보를 조회할 수 있다. 등록되지 않은 시리얼번호(Unregistered serial numbers) 목록에 있는 시리얼번호를 등록하려면, 원하는 시리얼번호를 선택하고 Register를 한다. Delete: 왼쪽 창의 licenses 또는 Unregistered serial numbers 목록에서 시리얼 번호를 선택하고 컴퓨터에서 제거한다. Create Support Log: 엠바카데로 지원팀에 연락할 때 제공할 수 있도록 라이선스 관련 상세 정보가 기록된 파일을 생성한다. Check out (ELC 사용자 전용): 네트워크 concurrent licenses를 오프라인에서 사용할 수 있도록 체크아웃 Check in (ELC 사용자 전용): 오프라인에서 사용하던 네트워크 concurrent licenses를 다시 서버에 연결 4 엠바카데로 제품 등록 웹사이트 엠바카데로 제품 등록 웹사이트는 다음 용도로 사용된다. 오프라인 설치 과정에서 제품을 등록할 때 필요한 정품 등록 파일을 확보하기 구입 후, 설치를 하지는 않지만 일단 등록만 미리 해두기 보유한 시리얼번호를 몇번 더 설치/등록을 할 수 있는지 미리 알아보기 4.1 정품 등록 파일 확보하기 정품 등록 파일이 필요한 상황 (시리얼번호와 EDN로그인을 직접 사용하지 못하는 특수한 경우) 인터넷이 연결되지 않은 컴퓨터에서 RAD 스튜디오를 사용하기 위해 등록할 때 필요하다. 등록 횟수 낭비 방지 목적으로, 정품 등록 파일 확보하기 위해 이 절차를 진행할 필요는 "전혀" 없다. 설치 과정에 시리얼번호로 등록해도 정품 등록 파일은 확보된다. 확보 및 사용 절차 정품 등록 파일(reg*.txt 또는 *.slip)을 생성하는 웹페이지에 접속한다. 대부분의 버전: https://reg.codegear.com/ 7.x 이하 버전 (6.x 버전 제외): http://reg.borland.com (등록 마법사 화면에서는 "Register by Phone" 옵션 선택) 6.x 버전: https://reg.codegear.com/srs6/sanctOneActivation.do;jsessionid=117DEF8A3FFDB33D78065354A0FC4C9D 정품 등록에 사용될 시리얼번호가 연결된 EDN 계정으로 로그인한다. (실수로 잘못된 EDN 계정에 등록되면 안되므로) 다음 단계를 진행하기 전에 '반드시' 화면에 표시된 [LOG OFF | 이름] 을 찾아서, 원하는 EDN 계정으로 로그인 되었는지를 다시 확인한다. 주의! 업그레이드 라이선스를 구입한 고객은 이전 버전이 등록된 EDN 계정을 사용해야 한다. 아래 항목에 정보를 입력하고 [Next]를 클릭한다. Serial Number: 엠바카데로의 ESD 라이선스 이메일을 통해 받은 시리얼번호 Registration Code: 오프라인 설치파일로 RAD 스튜디오를 설치하기 3단계: 정품 등록 파일 확보하기에서 메모한 숫자 앞에서 입력한 정보가 표시되는 페이지가 열리면, 페이지 하단의 [Download or email the activation file] 에서 Download 또는 Email을 선택하고 [Register]를 클릭하면 등록이 완료되고 (직접 다운로드 또는 이메일로) 정품 등록 파일(reg*.txt 또는 *.slip)이 제공된다. RAD 스튜디오를 설치하는 컴퓨터에서 정품 등록 파일을 사용하여 등록을 완료한다. 오프라인 설치파일로 설치하는 경우: 정품 등록 파일을 RAD 스튜디오를 설치하는 컴퓨터에 넣고 오프라인 설치파일로 RAD 스튜디오를 설치하기 3단계: 정품 등록 파일 확보하기 단계를 마저 진행한다. 일반 설치파일로 설치하는 경우: 일반 설치파일 사용법 1.1의 안내에 따라 정품 등록 파일을 알맞은 폴더에 미리 넣은 후에 설치를 시작한다. 4.2 구입 후, 설치를 하지는 않지만 일단 등록만 미리 해두기 주의! 설치를 하지 않아도, 등록하려면 [Register]를 클릭해야 한다. 그 결과 하여 사용자가 해당 시리얼번호 등록 의사가 전달되므로, 해당 등록 가능 횟수가 1회 차감된다. 위 RAD 스튜디오를 인터넷이 연결되지 않은 컴퓨터에서 사용하기 위해 정품 등록 파일 확보하기 절차 1~5단계까지만 진행하면 된다. 이때, 4단계의 Registration Code에는 111111 또는 111111를 입력한다. (컴퓨터 고유값인 Registration Code는 설치 과정에만 알 수 있다) 제품이 등록되었는 지 확인하기: 등록이 잘 되었다면, EDN 서비스로 가서 "My Registered Products" 목록에 등록한 제품(과 시리얼 번호)이 들어 있어야 한다. 또는, 아래의 시리얼 번호에 몇번 더 설치/등록 할 수 있는지 미리 알아보기 결과, 등록 횟수가 0이 아니어야 한다. 4.3 보유한 시리얼 번호를 몇번 더 설치/등록을 할 수 있는지 미리 알아보기 위 RAD 스튜디오를 인터넷이 연결되지 않은 컴퓨터에서 사용하기 위해 정품 등록 파일 확보하기 절차 1~4단계까지 진행하고 5단계에서는 [Register]를 클릭하지 말고, 대신 "View extended serial number details." 링크를 찾아서 클릭한다. (팁! [Register]를 클릭하지 않으면 등록이 완료되지 않고 등록 횟수도 차감되지 않음) 이때, 4단계의 Registration Code에는 111111 또는 111111를 입력한다. (컴퓨터 고유값인 Registration Code는 설치 과정에만 알 수 있다) Serial number details (상세 정보) 페이지에서 등록 횟수를 파악할 수 있다. Serial Number: 시리얼번호(와 해당 제품 버전과 라이선스 정보) Logged in user: 현재 로그인한 EDN 계정명 Ownership status: 위 EDN 계정이 위 시리얼번호의 보유자인지 여부 (주의! 보유자가 아니라고 표시되면 아래에 표시된 등록 횟수는 정확하지 않음) Current Registration count/Maximum: 현재 등록횟수 / 최대 등록 횟수 한도 (예: 3/5 라고 표기되어 있다면 총 5회의 설치 횟수 중 3회를 사용하였고 2회 더 설치가 가능함을 의미한다.) 설치 횟수가 다 찬 경우에는 엠바카데로 본사에 제품 등록 한도 증가를 요청해야 한다. 5 관련 주제 설치 방법 일반 설치파일 사용 오프라인 설치파일 사용 View full 엠바카데로 개발도구 가이드
×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.