SlideShare a Scribd company logo
1 of 70
Download to read offline
1
9장 –멀티-클라이언트/멀티-플랫폼/
멀티-티어 애플리케이션 구축
멀티-티어 애플리케이션 작성 ................................................................................................................................3
DataSnap 애플리케이션 배포................................................................................................................................8
윈도우와 맥 멀티-티어 데이터베이스 애플리케이션 작성
REST, 웹브로커 및 서비스 기반 DataSnap 서버 애플리케이션 작성
DataSnap 바이트 스트림 필터링
윈도우와 맥 애플리케이션에서 웹 서비스 사용하기 ........................................................................................51
웹 서비스 애플리케이션과 서비스를 사용하는 윈도우 및 맥 클라이언트 애플리케이션 작성
윈도우 및 맥 애플리케이션에서 클라우드 스토리지와 서비스 사용하기 ......................................................67
RAD Studio 클라우드 서비스
애저 클라우드 서비스
아마존 클라우드 서비스
첫 번째 클라우드 기반 윈도우 및 맥 애플리케이션을 구축
애플리케이션을 클라우드에 배포
요약, 전망, 해야 할 일, 참고자료 .......................................................................................................................70
2
소개
모든 애플리케이션이 단 하나의 플랫폼에서만 실행되는 독립 실행 형 데스크톱 애플리케이션은
아닙니다. 종종 소프트웨어 시스템은 원격 데이터베이스와 원격 비즈니스 오브젝트를 사용하는
클라이언트 애플리케이션들을 포합합니다. 윈도우 및 맥 용 멀티 클라이언트, 멀티 플랫폼, 멀티-
티어 애플리케이션을 구축해야 할 때가 있을 것입니다. 이전 장에서 보았듯이 HD 및 3D 사용자
인터페이스로 데이터베이스에 연결하는 윈도우, 맥 용 멀티 플랫폼 애플리케이션을 작성할 수
있습니다. 원격 비즈니스 오브젝트 및 서비스를 작성하거나 연결하려면 어떻게 해야 합니까? RAD
Studio는 멀티 클라이언트, 멀티 플랫폼 및 멀티-티어 애플리케이션 작성을 지원합니다.
RAD Studio는 멀티 클라이언트, 멀티 플랫폼 및 멀티-티어 애플리케이션의 작성을 지원하는 다음과
같은 기술 및 컴포넌트를 포함합니다:
 파이어몽키 HD 및 3D 클라이언트 애플리케이션 – 윈도우32, 윈도우64 , 맥 OSX
 델파이와 C++ 클라이언트 애플리케이션
 VCL 클라이언트 애플리케이션 - 윈도우32, 윈도우64
 콘솔 클라이언트 애플리케이션 – 윈도우32, 윈도우64 , 맥 OSX
 웹 서비스 클라이언트 액세스 – 윈도우32, 윈도우64 , 맥 OSX
 클라우드 저장 클라이언트 애플리케이션 액세스 – 아마존 S3 와 마이크로 소프트 윈도우
애저 DataSnap 클라이언트 애플리케이션 액세스 – 윈도우32, 윈도우64 , 맥 OSX
 DataSnap 애플리케이션 서버 – VCL, 파이어몽키, 콘솔 애플리케이션, 서비스 애플리케이션-
윈도우32, 윈도우64
 웹 애플리케이션 서버 – 윈도우32 , 윈도우64
 윈도우64
 웹 서비스 - 윈도우32 및 윈도우64
9 장에서는 파이어몽키, DataSnap, 웹 서비스 및 클라우드 스토리지를 사용하는 멀티 클라이언트, 멀티
플랫폼, 멀티-티어 애플리케이션 구축에 주력합니다.
3
멀티-티어 애플리케이션 작성
멀티-티어 애플리케이션은 별도의 컴퓨터에서 실행하는, 티어 라고 불리는 논리적 단위로 분리됩니다.
로컬 영역 네트워크를 통해 또는 인터넷을 통해 멀티-티어 애플리케이션들은 서로 데이터를 공유하고
통신합니다. 중앙 집중화 된 비즈니스 로직과 가벼운 클라이언트 애플리케이션등과 같은 멀티-티어
데이터베이스 모델의 많은 장점을 제공합니다.
때때로 "3-티어 모델"라고 부르는 멀티-티어 애플리케이션은 가장 간단한 형태로 세 부분으로
나뉘어집니다.
 클라이언트 애플리케이션: 사용자 컴퓨터에 사용자 인터페이스를 제공합니다.
 애플리케이션 서버: 모든 클라이언트에서 액세스 할 수 있도록 중앙 네트워크 위치에
상주하고 있으며 일반적인 데이터 서비스를 제공합니다.
 원격 데이터베이스 서버: 관계 형 데이터베이스 관리 시스템 제공합니다(RDBMS).
3-티어 모델에서는 애플리케이션 서버는 클라이언트와 원격 데이터베이스 서버 사이에서 데이터의
흐름을 관리하므로 종종 "데이터 브로커"라고 부릅니다. 보통은 애플리케이션 서버 및 클라이언트만을
생성하지만
필요하다면, 데이터베이스 백 엔드를 만들 수 있습니다.
더 복잡한 멀티-티어 애플리케이션이라면 추가 서비스가 클라이언트와 원격 데이터베이스 서버 사이에
있을 수 있습니다. 예를 들어, 인터넷 트랜잭션 보안을 처리하기 위한 보안 서비스 브로커 또는 다른
플랫폼에서 데이터베이스와의 데이터 공유를 처리하는 브릿지 서비스가 있을 수 있습니다.
멀티-티어 애플리케이션 개발은 클라이언트 데이터 셋이 전송 가능한 데이터 패킷으로 프로바이더
컴포넌트와 통신하는 방식의 확장 기능을 사용합니다. 3-티어 애플리케이션을 작성하고 관리하는
방법을 이해한다면, 프로그램을 작성한 다음 필요에 따라 추가 서비스를 추가 할 수 있습니다.
멀티-티어 모델의 장점은 다음과 같습니다:
 중간 계층에 캡슐화된 비즈니스 로직 공유 - 다른 클라이언트 프로그램 모두가 같은 중간
계층을 액세스하여 각 개별 클라이언트 프로그램에 필요한 비즈니스 로직의 중복(및 유지
보수 비용)을 피할 수 있습니다.
 가벼운 클라이언트 애플리케이션 - 중간 계층에 더 많은 처리를 하게함으로써 클라이언트
프로그램은 가볍게 작성할 수 있습니다. 클라이언트 프로그램이 작아지는 것뿐만 아니라,
데이터베이스 연결을 위한 소프트웨어의 설치, 구성 및 관리에 대해 걱정할 필요가 없기
때문에 배포가 더 용이합니다(데이터베이스 서버의 클라이언트 측 소프트웨어와 같이).
가벼운 클라이언트 애플리케이션은 추가적인 유연성을 위해 인터넷을 통해 배포 할 수
있습니다.
 분산 데이터 프로세스 - 여러 대의 컴퓨터에 애플리케이션을 배포하여 로드 밸런싱 성능을
향상시키고 서버가 다운 될 때 다른 컴퓨터에서 중복 시스템을 대신 할 수 있습니다.
 향상된 보안 - 다른 액세스 권한을 갖는 계층에 기능을 분리 할 수 있습니다. 이렇게 하면
비즈니스 로직을 유연하게 구성할 수 있습니다. 서버에 있는 서비스 중에서 민감한 자료에
대해서는 특정 권한을 갖는 사용자만 접근할 수 있도록 제한 할 수 있습니다.
HTTPS를 사용한다면, 지원하는 보안 모델을 이용할 수 있습니다.
4
멀티-티어 애플리케이션은 툴 팔레트의 DataSnap 페이지, 데이터 액세스 페이지 및 웹 서비스 페이지에
있는 컴포넌트뿐만 아니라 New Item 대화상자의 Multitier 또는 웹 서비스 페이지 마법사에서 생성한
리모트 데이터 모듈을 사용합니다. 컴포넌트들은 전송 할 수 있는 데이터를 패킷으로 패킹하고 델타
패킷으로 받은 업데이트를 처리하는 프로바이더 컴포넌트의 기능을 기반으로 합니다.
멀티-티어 애플리케이션에 필요한 컴포넌트는 다음과 같습니다:
 리모트 데이터 모듈 및 서버 데이터 모듈 - COM 자동화 서버, DataSnap 데이터 모듈, RESTful
웹 서버의 역할을 하거나 모든 공급자에게 클라이언트 프로그램을 액세스 권한을 부여 할 수
있는 웹 서비스를 구현할 수 있습니다. 애플리케이션 서버에서 사용됩니다.
 프로바이더 컴포넌트 - 데이터 패킷을 생성하여 클라이언트 측에 데이터를 제공하고
클라이언트에서 요청한 업데이트를 처리하는 데이터 브로커. 애플리케이션 서버에 사용됩니다.
 클라이언트 데이터셋 컴포넌트 - 데이터를 관리하기 위해 사용된 특수화된 데이터셋은
데이터 패킷으로 저장됩니다. 클라이언트 데이터셋은 클라이언트 애플리케이션에서
사용됩니다. 로컬에서 발생한 업데이트를 캐시에 저장하고, 서버 애플리케이션 측에 델타
패킷으로 보냅니다.
 커넥션 컴포넌트들 – 서버에 위치하는 연결 컴포넌트들로 클라이언트 데이터셋에 사용할 수
있는 IAppServer인터페이스로 구성됩니다. 각 연결 컴포넌트는 특정 통신 프로토콜을
사용하도록 특화되어 있습니다.
프로바이더 및 클라이언트 데이터셋 컴포넌트를 사용하려면 데이터 패킷으로 저장된 데이터셋을
관리하는 midas.dll 또는 midaslib.dcu가 필요합니다. 프로바이더와 클라이언트 데이터셋을 서버
프로그램과 클라이언트에서 사용되기 때문에, midas.dll를 서버 프로그램 및 클라이언트 프로그램
모두에 배포해야 합니다. 배포에 대한 추가 중요한 정보는 설치 디렉터리에 있는 deploy.htm 파일을
참조하십시오.
5
RAD Studio 배포 대상 플랫폼
RAD Studio는 다음과 같은 배포 대상 플랫폼 및 관련 프레임 워크를 지원합니다:
 맥 OS X 는 파이어몽키 개발만을 지원합니다.
 32-bit 윈도우는 파이어몽키 및 VCL 개발을 지원합니다.
 64-bit 윈도우는 파이어몽키 및 VCL 개발을 지원합니다
프로젝트 매니저의 타깃 노드를 선택하여 애플리케이션의 타깃 플랫폼을 지정합니다.
다른 멀티 플랫폼 개발 지원이 포함되어 있습니다.
 iOS 디바이스를 위한 파이어몽키 애플리케이션 개발은 아이폰, 아이 패드, 아이팟을
지원됩니다.
그러나, FMX iOS는 기술적으로 IDE에서 선택할 수 있는 타깃 플랫폼은 아닙니다.
 DataSnap는 제공하는 특별한 DataSnap 커넥터를 사용하여 모바일 장치를 위한 네이티브-언어
개발을 지원합니다(이 과정의 뒤에 나오는 모바일 커넥터를 사용합니다 - 모바일 장치를
지원해야 할 경우 이 강의의 끝 부분에 있는 기사와 동영상 링크를 참조하십시오):
o 오브젝트- C iOS DataSnap 프록시를 사용하는 iOS 디바이스
o 프리 파스칼 DataSnap 프록시를 사용하는 iOS 디바이스
o C # 실버라이트 DataSnap 프록시를 사용하는 윈도우 7 폰
o 자바 안드로이드 DataSnap 프록시를 사용하는 안드로이드
o 자바 블랙베리 DataSnap 프록시를 사용하는 블랙베리
엠바카데로 DocWiki에 작성 할 수 있는 멀티 플랫폼 애플리케이션 타입이 요약 되어 있습니다.
http://docwiki.embarcadero.com/RADStudio/en/Types_of_Cross-Platform_Applications_You _Can_Create
WebSnap을 사용한 웹 애플리케이션 구축에 대한 자세한 내용은 엠바카데로 DocWiki의 문서를
참조하십시오. http://docwiki.embarcadero.com/RADStudio/en/Developing_Web _Applications_with_WebSnap.
멀티 클라이언트, 멀티 플랫폼, 멀티-티어 애플리케이션 디버깅
통합 RAD Studio 디버그는 지원되는 타깃 플랫폼 중 하나를 대상으로 하는 애플리케이션을 디버깅 할
수 있습니다. 통합 디버그는 델파이와 C + + 애플리케이션 모두에서 사용할 수 있습니다.
 엠바카데로 윈도우64 디버그(64 –비트 윈도우 OS가 실행하고 있는 컴퓨터에서)
 엠바카데로 OS X 디버그 (OS X 버전이 실행하고 있는 맥에서)
배포 대상 플랫폼에 플랫폼 어시스턴트를 설치하면 크로스 플랫폼 디버그 또한 설치됩니다. 시스템에
등록 된 디버그는 Tools > Options >Debugger Options에 표시됩니다.
6
플랫폼 어시스턴트 및 원격 프로파일은 크로스 플랫폼 대상 시스템에서 실행중인 애플리케이션에 대한
디버그 세션을 구축합니다. 플랫폼 어시스턴트를 필요로 하지 않는 유일한 크로스 플랫폼 구성은
윈도우32 개발 시스템입니다.
크로스 플랫폼 디버그와 프로세스는 배포 대상 플랫폼에서 실행 파일을 디버깅 할 수 있습니다.
크로스 플랫폼 디버그는 상태를 보고하고 RAD 스튜디오 IDE에서 개발 PC와 함께 상호 작용합니다.
크로스 플랫폼 디버그 중 하나를 사용하는 것은 윈도우32 애플리케이션을 위해 통합 디버그를
사용하는 것과 매우 유사합니다.
크로스 플랫폼 디버깅을 하기 위해:
 애플리케이션은 활성화된 타깃 플랫폼이 있어야 합니다(윈도우64, OS X, 또는 원격 윈도우32).
 타깃 플랫폼에 따라:
o 맥 OS X:
 플랫폼 어시스턴트는 맥에서 실행되고 있어야 합니다.
 애플리케이션에 할당 된 원격 프로필이 있어야 합니다.
 개발 시스템은 맥에 라이브로 연결되어 있어야 합니다(즉, 원격 프로파일 창에 테스트
연결이 성공해야 합니다). 이것은 통합 디버그 및 배포 관리자를 모두 사용할 수
있습니다.
o 64-비트 윈도우:
 원격 64 비트 PC에 연결하는 경우:
 플랫폼 어시스턴트 및 원격 프로파일을 사용합니다.
 개발 시스템은 원격 64 비트 PC에 라이브로 연결되어 있어야 합니다 (즉, 원격
프로파일 창에 테스트 연결이 성공해야 합니다). 이것은 통합 디버그 및 배포
관리자를 모두 사용할 수 있습니다.
 개발 시스템이 64 비트 윈도우 운영 체제를 실행하는 PC 인 경우:
7
 귀하의 디버그 환경은 기계에 포함되어 있기 때문에 플랫폼 어시스턴스를 사용할
필요가 없습니다. 그리고 통합 디버그가 자동으로 실행됩니다.
 그러나, 옵션으로 플랫폼 어시스턴스 및 64 비트 윈도우 타깃 시스템에 대한 것처럼
배포 대상 플랫폼에 대한 원격 프로필을 사용하도록 선택할 수 있습니다. 이렇게
하면 배포 관리자를 사용 할 수 있습니다.
OS X에서 디버깅 하는 것은 권한 작업이며 적절한 액세스 권한을 갖는 프로세스만 디버그 할 수
있습니다. 맥에서 디버깅에 대한 지원을 받기 위해, 관리자 또는 루트 사용자 암호를 사용하여 개발자
도구 액세스 대화 상자에서 로그인 해야 합니다. 세션에서 플랫폼 어시스턴스를 처음으로 시작할
때(또는 맥에서 디버깅 세션을 시작할 때), 맥 개발자 도구 액세스 로그인 대화 상자를 표시합니다.
맥에서 루트 사용자 암호를 제공해야 합니다. 패스워드는 세션 당 한 번만 필요합니다.
8
DataSnap 애플리케이션 배포
DataSnap 기술은 분산 컴퓨팅 증가에 대한 요구로 발전을 계속하고 있습니다. DataSnap의 숨은 기술은
TCP / IP를 기반으로 보다 개방 된 커뮤니케이션 방식에 마이크로 소프트 COM / DCOM을 통해 원격
데이터에 접근합니다. 완벽한 미들웨어 기술을 포함하기 위해 DataSnap 기술 기능을 확장할 수
있습니다. 기술의 주요 기능 중 하나는 속도가 빠르다는 것입니다: 제품에서 작성이 빠르고, 배포가
빠르고, 실행이 빠릅니다.
이제 DataSnap 기술은 거의 모든 표준 기반의 인프라 내에서 작동 할 수 있도록 기능이
확장되었습니다. 최신 DataSnap은 여전히 COM / DCOM 접근방식과 하위 호환이 가능한 반면, TCP / IP를
통한 기본적인 통신 또는 HTTP 또는 HTTPS중 하나를 통해 통신할 수 있습니다. 동시에 DataSnap
서버에 있는 비즈니스 로직은 RESTful(표시 상태 전송) 웹 서비스로 전송 할 수 있습니다.
DataSnap은 TCP / IP 또는 HTTP를 통해 JSON(자바 스크립트 객체 표기법) 데이터 콘텐트의 보안 전송을
사용하여 클라이언트가 안전하게 서버와 통신 할 수 있는 방법을 제공합니다. 통신 채널의 양쪽
끝에서 필터를 정의 할 수 있는 기능은 암호화 및 압축을 위해, 보안을 향상시킵니다.
DataSnap 기술의 또 다른 혜택은 서버의 변경 사항에 대해 모든 클라이언트 애플리케이션을
비동기적으로 통보 할 수 있는 가능성을 제공하여 클라이언트가 적절한 조치를 취할 수 있도록 해주는
것입니다.
콜백은 클라이언트가 서버 메소드중 하나를 반드시 실행할 필요가 없습니다.
RAD Studio XE2, 델파이 XE2 또는 C + + 빌더 XE2 엔터프라이즈 및 아키텍트 에디션을 구입한 경우
DataSnap 기술을 사용하거나 배포 하기 위한 추가 비용은 없습니다.
Start |Programs | Embarcadero RAD Studio XE2 | Samples에서 DataSnap 샘플 애플리케이션을 (RAD
스튜디오와 함께 설치됩니다) 찾을 수 있습니다. 관심 폴더는 DataSnap XE 멀티플랫폼 데모를 포함하는
DataSnapXE와 여러 DataSnap 애플리케이션을 포함하는 Delphi DataSnap 입니다. 이러한 DataSnap
샘플들은 폴더 이름으로 불려집니다:
9
 기본 DataSnap 클라이언트와 서버 예제 -
http://docwiki.embarcadero.com/CodeExamples/XE2/en/DataSnap.Basic_DataSnap_Client_and_Server_S
ample
 권한 인증 예제 -
http://docwiki.embarcadero.com/CodeExamples/XE2/en/DataSnap.Role_Authorization_Sample
 채팅룸 예제 -
http://docwiki.embarcadero.com/CodeExamples/XE2/en/DataSnap.ChatRoom_Sample
 장애발생시 조치 - DataSnap HTTP 터널링 예제 -
http://docwiki.embarcadero.com/CodeExamples/XE2/en/DataSnap.Failover_DataSnap_HTTP
_Tunneling_Sample
 JSON 보기 예제 -
http://docwiki.embarcadero.com/CodeExamples/XE2/en/DataSnap.JSON_Viewer_Sample
 프록시 생성 예제 -
http://docwiki.embarcadero.com/CodeExamples/XE2/en/DataSnap.Proxy_Gener ator_Sample
첫번째 윈도우 및 맥 DataSnap 애플리케이션 배포
DataSnap 기술은 인터넷, 로컬 네트워크 또는 로컬 호스트를 통해 통신하는 클라이언트 - 서버
애플리케이션을 만들 수 있는 능력을 제공합니다.
다음 단계는 간단한 서버 및 클라이언트 애플리케이션을 구축하기 위해 DataSnap를 생성하고 사용하는
방법을 보여줍니다. 서버를 작성한 후 클라이언트와 DataSnap 서버 사이의 연결을 활성화하면
클라이언트는 DataSnap 서버에 정의되고 구현된 메소드를 호출 할 수 있습니다. 다음 섹션에서
DataSnap 애플리케이션에서 데이터베이스를 사용하는 방법을 배우겠습니다.
델파이 또는 C+ +을 사용하여 서버를 구현할 수 있는데 예제에서는 델파이와 C++ 모두 보여줍니다.
클라이언트는 서버와 동일한 언어로 구현 될 필요는 없습니다. DataSnap은 델파이 서버와 C + +
클라이언트로 또는 그 반대로도 할 수 있습니다.
주요 DataSnap 서버 컴포넌트는
 TDSServer - TDSServer 구성 요소는 DataSnap 서버 애플리케이션의 논리적 중심입니다. 서버를
시작하고 중지하기 위한 Start 과 Stop 메소드를 포함합니다. 또한 AutoStart 속성을
포함합니다. 기본값으로, AutoStart 값이 True로 설정 되어 있어서 애플리케이션이 실행될 때
서버가 자동으로 시작합니다. 서버 애플리케이션마다 하나의 TDSServer 컴포넌트가
필요합니다.
 TDSServerClass - TDSServerClass 컴포넌트는 서버 클래스를 나타냅니다.
DataSnap 서버는 서버 클래스의 인스턴스를 자동으로 생성하고 파괴합니다. 서버 클래스의 인스턴스는
TDSServerClass 컴포넌트의 LifeCycle 속성으로 제어됩니다. LifeCycle 속성은 세 가지 값을 사용할 수
있습니다: Server, Session, 및 Invocation.
 LifeCycle을 Server로 설정하는 것은 DataSnap 서버가 서버 애플리케이션에 연결된 모든
10
클라이언트에 의해 사용되는 서버 클래스의 하나의 인스턴스를 생성한다는 의미입니다.
이것은 '싱글톤' 패턴을 나타냅니다. 서버 클래스 구현은 스레드로부터 안전해야 하기 때문,
서버 라이프 사이클을 사용할 때 주의하십시오: 여러 스레드에서 동시에 액세스 할 수 있도록
이 서버 클래스를 설계해야 합니다.
 LifeCycle의 기본 값은 Session입니다. 이것은 DataSnap 서버가 모든 연결 클라이언트에 대한
서버 클래스의 인스턴스 하나를 생성 있다는 것을 의미합니다.
 LifeCycle 속성의 가능한 세 번째 값은 Invocation입니다. 이 경우는, 클라이언트에서 호출하는
각 메소드마다 서버 클래스 인스턴스가 생성되고 파괴됩니다, 그리고 서버 클래스의 상태가
메소드 호출 사이에 보존되지 않습니다.
TDSTCP ServerTransport 컴포넌트는 클라이언트와 서버 간의 통신을 제공하기 위해 필요 합니다.
TDSTCP ServerTransport 컴포넌트는 여러 스레드에서 들어오는 클라이언트 연결을 위한 수신 멀티
스레드 TCP 서버를 구현합니다. 이 컴포넌트는 어떠한 이벤트도 없습니다. Port 속성은 사용하는 TCP
포트를 가리키는데, 기본값으로 211로 지정되어 있습니다. 클라이언트와 서버 간에 또한 HTTP 통신을
사용할 수도 있습니다.
1 단계: DataSnap 서버 애플리케이션 작성
델파이와 C + +의 DataSnap 프로젝트를 시작하기 위해 세 개의 마법사가 있습니다:
 DataSnap 서버 – DataSnap 서버 마법사는 DataSnap 기술을 사용하여 서버를 쉽게 구현하는
방법을 제공합니다.
 DataSnap 웹브로커 애플리케이션 – DataSnap 웹브로커 애플리케이션 마법사는 웹브로커와
DataSnap 두 기술을 사용하여 서버 애플리케이션을 쉽게 구현하는 방법을 제공합니다.
 DataSnap REST 애플리케이션 –REST 통신의 지원과 자바스크립트와 JSON을 사용하여 서버
메소드를 실행하는 웹 페이지를 사용하여 DataSnap 서버를 작성합니다.
11
또한 콘솔 애플리케이션 또는 파이어몽키 애플리케이션을 작성하고 DataSnap 서버 컴포넌트를 별도로
추가 할 수 있습니다.
이 장에서는, DataSnap 서버 마법사를 사용하겠습니다. File > New> Other… 사용하여 마법사를 시작하고
Delphi Projects > DataSnap Server category 또는 C++Builder Projects > DataSnap Server category에서 DataSnap
서버 마법사를 선택합니다.
마법사를 선택하면 DataSnap 서버 애플리케이션을 작성하도록 도와주는 4개의 마법사 대화 상자가
표시됩니다. DataSnap 서버 마법사는 DataSnap 기술을 사용하여 서버 애플리케이션을 쉽게 구현하는
방법을 제공합니다. 사용자가 선택한 옵션에 관계없이, TDSServer 컴포넌트를 포함하는
ServerContainerUnit을 만듭니다. 추가적인 모든 컴포넌트들은 Server 속성에 TDSServer 컴포넌트의
이름을 지정하여 TDSServer에 연결됩니다.
선택한 프로토콜이 TCP / IP이면, 서버는 또한 TDSTCPServerTransport를 포함합니다. HTTP는 통신
프로토콜로 선택하면, 서버는 TDSHTTP 서비스 컴포넌트가 포함되어 있습니다. HTTPS를 선택하면,
서버는 HTTPS 운영을 위한 구성된 TDSHTTP 서비스 컴포넌트를 포함합니다.
첫 번째 단계(4 단계 중 1 단계) 마법사는 DataSnap 서버에서 원하는 애플리케이션 유형을 선택합니다.
선택할 수 있는 유형은 다음과 같습니다: VCL 애플리케이션, 콘솔 애플리케이션 및 서비스
애플리케이션. 앞에서 언급 한 바와 같이, 유저 인터페이스를 갖는 DataSnap 서버 애플리케이션을
작성하려면, 파이어몽키 애플리케이션을 만들고 DataSnap 서버 컴포넌트를 추가할 수도 있습니다.
간단하게 작성 하기 위해, DataSnap 서버용 VCL Forms 애플리케이션을 작성합니다. 이를 선택하면
DataSnap 서버에 얼마나 많은 DataSnap 클라이언트가 서버에 연결되어 있는지 표시 하기 위한 추가
컨트롤을 배치 할 수 있는 간단한 유저 인터페이스를 제공합니다.
12
다음 마법사는(4 단계 중 2 단계) DataSnap 서버 애플리케이션에 포함하고 싶은 서버 기능을 묻습니다.
체크 리스트의 모든 기능은 자체 설명이 있습니다: 하나를 선택하면 힌트는 마법사 상단에 표시됩니다.
사용 가능한 통신 프로토콜은 다음과 같습니다:
 TCP/IP
 HTTP
 HTTPS
원하는 프로토콜을 선택할 수 있지만 TCP / IP는 항상 선택되어 있습니다. 이 목록에서 통신 프로토콜을
선택하면 DataSnap 서버 마법사의 다음 단계에서, 선택된 프로토콜을 위한 통신 포트의 선택이
가능합니다. 통신 프로토콜로 HTTPS를 선택하면 DataSnap 서버 마법사는 인증서 파일에 대한 정보를
요청하는 추가 페이지를 표시합니다.
인증 옵션을 선택하면 TDSHTTPServiceAuthenticationManager 컴포넌트가 서버 폼에 배치됩니다.
TDSHTTPService 컴포넌트는 DataSnap 서버에 대한 HTTP 사용자 인증을 구현하기 위해 인증관리자로
TDSHTTPServiceAuthenticationManager를 사용합니다. 인증 이벤트가 구현부분에 기본 구성되어 있습니다.
인증을 선택하면 클라이언트는 SQL 연결 속성으로 DataSnap 사용자 이름과 암호를 제공해야 합니다.
서버 메소드 클래스 옵션을 선택하면, 클라이언트 프로그램 측에 서버 메소드를 알려주는
TDSServerClass 컴포넌트가 서버에 추가됩니다.
샘플 메소드 옵션을 선택하면, ServerMethodsUnit는 매개변수로 주어진 값을 그대로 반환하는 EchoString
및 반대로 반환하는 ReverseString라는 두 가지 간단한 메소드들의 코드를 포함합니다.
필터 카테고리는 DataSnap 서버가 사용하는 필터를 지정합니다. 암호화 필터, 압축 필터, 또는 둘
모두를 포함하여 선택할 수 있습니다:
 암호화 필터는 선택한 통신 프로토콜에 대한 PC1과 RSA 필터를 추가합니다. RSA 필터는
서버와 이 서버에 연결하는 모든 클라이언트에 있어야 하는 OpenSSL 라이브러리가
13
필요하다는 것에 주목하십시오.
 압축 필터는 선택한 통신 프로토콜에 대한 ZLib 압축 필터를 추가합니다.
 자바 스크립트 파일은 자바 스크립트 프레임 워크 및 프록시 생성기로 프로젝트를
시작합니다.
모바일 커넥터를 선택하면 프로젝트는 안드로이드, 윈도우폰, 아이폰과 같은 모바일 장치에
애플리케이션을 디스패치 하는 프록시를 지원합니다. 더 자세한 내용은 엠바카데로 DocWiki에서
모바일 장치를 위한 DataSnap 커넥터를 참조하십시오
http://docwiki.embarcadero.com/RADStudio/en/Getting_Started_with_DataSnap_Mobile_Connectors
간단하게 TCP / IP 만을 사용하여 마법사가 클라이언트가 사용하는 샘플 메소드를 생성합니다.
세 번째 마법사(4 단계 중 3 단계)에서 DataSnap 마법사는 TCP / IP 기반 DataSnap 서버의 포트 번호를
요구합니다. 원하는 모든 포트를 선택할 수 있습니다(또는 방화벽에서 개방되는 포트). 포트를 실제로
사용할 수 있는지 확인하는 "테스트 포트" 버튼이 있고 열려있는 포트를 찾는데 사용하는 두 번째
버튼이 있습니다. 이전 단계에서 HTTPS 기능을 선택했다면, 또한 HTTPS 통신 포트를 지정해야 합니다.
사용 가능한 TCP / IP 통신 포트용으로 동일한 버튼을 사용할 수 있습니다: 포트 테스트 및 열린 포트
검색. 포트 211의 기본값을 그대로 두고 이 포트를 사용할 수 있는지 확인하려면 "테스트 포트"
버튼을 클릭합니다. 대화 상자에서 "테스트 포트 성공"이 표시되면, 계속 진행하셔도 됩니다.
14
마지막 마법사 단계 (4 단계 중 4 단계)는 서버 메소드 클래스에 대한 조상 타입을 선택합니다. 서버에
있는 데이터셋과 클라이언트 애플리케이션에서 연결하기 위해 TDSServerModule을 선택합니다. 서버
클래스에서 비 시각적 컴포넌트를 사용하려면 TDataModule을 선택합니다. 코드만 있는 서버 클래스를
구현하려면 TComponent를 선택합니다. 첫 번째 DataSnap 서버에 대해서는 디폴트 선택인 TComponent
그대로 둡니다.
15
DataSnap 마법사에서 추가 기능을 선택한 경우, 추가 마법사 단계를 볼 수 있습니다.
“Finish” 버튼을 클릭하면 ServerContainerUnit, ServerMethodsUnit 및 서버 유니트로 DataSnap 서버
애플리케이션 프로젝트가 생성되는 것을 볼 수 있습니다. 프로젝트 이름을 "DelphiDataSnapServer" 또는
"CppDataSnapServer"로 서버 유니트 이름을 ServerUnit를 사용하여 폴더에 프로젝트를 저장합니다.
ServerMethodsUnit는 마법사에 의해 생성된 샘플 DataSnap 서버 메소드에 대한 소스 코드를
포함합니다(그 옵션을 선택한 경우):
// Delphi – ServerMethodsUnit1.pas
unit ServerMethodsUnit1;
interface
uses System.SysUtils, System.Classes, Datasnap.DSServer,
Datasnap.DSAuth;
type
{$METHODINFO ON}
16
TServerMethods1 = class(TComponent)
private
{ Private declarations }
public
{ Public declarations }
function EchoString(Value: string): string;
function ReverseString(Value: string): string;
end;
{$METHODINFO OFF}
implementation
uses System.StrUtils;
function TServerMethods1.EchoString(
Value: string): string;
begin
Result := Value;
end;
function TServerMethods1.ReverseString(
Value: string): string;
begin
Result := System.StrUtils.ReverseString(Value);
end;
end.
// C++ - ServerMethodsUnit1.cpp
//--------------------------------------------------------
#include <SysUtils.hpp>
#pragma hdrstop
#include "ServerMethodsUnit1.h"
//--------------------------------------------------------
#pragma package(smart_init)
//--------------------------------------------------------
System::UnicodeString TServerMethods1::EchoString(
System::UnicodeString value)
{
return value;
}
//--------------------------------------------------------
System::UnicodeString TServerMethods1::ReverseString(
System::UnicodeString value)
{
return ::ReverseString(value);
}
//--------------------------------------------------------
#ifndef ServerMethodsUnit1H
#define ServerMethodsUnit1H
17
//--------------------------------------------------------
#include <Classes.hpp>
#include <DSServer.hpp>
//--------------------------------------------------------
class DECLSPEC_DRTTI TServerMethods1 : public TComponent
{
private: // User declarations
public:// User declarations
System::UnicodeString EchoString(
System::UnicodeString value);
System::UnicodeString ReverseString(
System::UnicodeString value);
};
#endif
DataSnap 서버 애플리케이션은 윈도우에서 컴파일 및 실행합니다. 프로젝트 매니저에서 타깃 플랫폼
노드를 윈도우32 또는 윈도우64로 지정합니다. DataSnap 서버 애플리케이션을 시작하려면 DataSnap
서버 애플리케이션에서 오른쪽 마우스 버튼을 클릭하고 팝업 메뉴에서 Run without Debugging을
선택합니다.
DaSnap 서버 애플리케이션을 시작했을 때 서버 메인 창을 볼 수 있고 윈도우 방화벽이 설정되어있는
경우 윈도우 보안 경고 창이 표시됩니다. DataSnap 서버가 포트 211를 사용하려고 할 때 경고가
발생합니다.
18
보안 경고 창에서 "액세스 허용” 버튼을 클릭합니다. DataSnap 서버 애플리케이션은 이제 메소드들을
호출하기 위해 클라이언트 애플리케이션에 대한 포트 211에서 수신 대기합니다. DataSnap 서버 콘솔
애플리케이션을 중지하려면 ALT-F4를 누르거나 프로그램 닫기 버튼을 클릭합니다.
2 단계: 윈도우 및 맥 DataSnap 클라이언트 애플리케이션
방금 만든 서버 애플리케이션의 동일한 프로젝트 그룹에 클라이언트 애플리케이션을 추가하려면,
프로젝트 매니저의 프로젝트 그룹 이름에서 오른쪽 마우스 버튼을 클릭하고 팝업 메뉴에서 Add New
Project를 선택합니다. 새 아이템 대화 상자가 표시됩니다.
델파이 프로젝트 카테고리에서, FireMonkey HD Application를 선택하고 OK를 클릭합니다.
C++빌더 프로젝트 카테고리에서, FireMonkey HD Application를 선택하고 OK를 클릭합니다.
폼의 Caption 및 Name 속성을 Delphi DataSnap Client 와 DelphiDataSnapClientForm으로 또는 C++ DataSnap
Client 와 CppDataSnapClientForm으로 지정합니다. 메인 메뉴의 File > Save All를 클릭합니다. 유니트 파일
이름을 DelphiClientUnit 또는 CppClientUnit로 저장하고 프로젝트 이름을 DelphiDataSnapClient
또는CppDataSnapClient로 저장합니다. 프로젝트 그룹 이름은 DelphiDataSnapprojectGroup 또는
CppDataSnapProjectGroup으로 저장합니다.
윈도우 및 맥 애플리케이션 유저 인터페이스를 만듭니다. 클라이언트 애플리케이션에 TEdit, TLabel과
TButton(s) 2개를 추가합니다. 정렬하고 크기를 조정하여 아래 화면과 같이 보이도록 합니다:
Button1의 Text 와 Name 속성을 “Echo String” 과 “ EchoStringButton”으로 지정합니다. Button2의 Text 와
Name 속성을 “Reverse String” 과 “ReverseStringButton”으로 지정합니다.
툴 팔레트에서 dbExpress 카테고리의 TSQLConnection 컴포넌트를 추가합니다. 오브젝트 인스펙터를
사용하여 TSQLConnection 컴포넌트에 대한 다음 속성들을 설정합니다:
 Driver: Datasnap (고객의 관점에서, 데이터베이스에 연결하는 것처럼 보이지만 사실은 DataSnap
서버에 연결을 제공합니다.)
 LoginPrompt: False (클라이언트가 서버에 연결할 때마다 사용자 이름과 암호 대화 상자를
표시하지 않기 위한 선택사항입니다).
 마법사에서 포트 211과 다른 포트 번호를 선택한 경우, 오브젝트 인스펙터를 이용해서 Params
속성을 더블클릭하고 Port 매개변수를 변경합니다.
다른 윈도우 컴퓨터에서 DataSnap 서버를 실행하고 있다면 Params 속성을 더블 클릭하여 Host Name
매개변수를 수정해야 합니다.
19
DataSnap 클라이언트 애플리케이션 화면은 다음과 같아야 합니다:
20
DataSnap 클라이언트 애플리케이션을 만드는 가장 중요한 단계는 DataSnap 서버에 구현된 모든 함수의
프로토(proto)타입을 포함하는 인터페이스를 생성하는 것입니다. 다음과 같이 작업을 수행합니다:
 프로젝트 매니저에서 서버 프로젝트의 이름을 두 번 클릭하여 DataSnap 서버 프로젝트를
활성화합니다.
 메인 메뉴의 Run > Run Without Debugging을 클릭하여 DataSnap 서버를 실행합니다(이미
실행되고 있지 않는 한).
 서버가 실행되는 동안 프로젝트 매니저에서 해당 DataSnap 클라이언트 프로젝트 이름을 더블
클릭하여 활성화합니다.
 디자인 탭에서, TSQLConnection 컴포넌트의 Connected 속성을 True로 설정합니다. 작동한다면,
설계 시점에서 DataSnap 클라이언트는 이제 DataSnap 서버에 연결되었습니다.
 클라이언트 폼에서 TSQLConnection 컴포넌트를 오른쪽 마우스 클릭하여 팝업 메뉴에서
“Generate DataSnap client classes”를 선택합니다. 서버에 구현된 클래스와 이 클래스에 포함 된
모든 메소드에 대한 정보를 포함하는 새로운 유니트가 클라이언트 프로젝트에 추가됩니다.
21
O 델파이의 경우, 새로운 유니트를 DataSnapClientClasses.pas로 저장합니다. 클라이언트 클래스
유니트 이름을(DataSnapClientClasses) DataSnapClient.pas 파일의 구현 부분에 추가하기 위해
DelphiClientUnit 폼을 선택하고 File > Use Unit 메뉴를 선택하여 유니트를 선택하고 OK
버튼을 클릭합니다.
O C ++ 경우는, 새로운 유니트를 DataSnapClientClasses.cpp로 저장합니다. CppDataSnapClient.cpp
파일의 처음에 아래 라인을 추가합니다:
#include "DataSnapClientClasses.h"
TEdit 상자에 입력 한 텍스트를 그대로 또는 반대로 보기 위한 DataSnap 서버 메소드를 호출하는
TButton (들)의 각각에 대해 이벤트 핸들러를 추가합니다. 다음은 각 버튼 이벤트 핸들러에 대한
코드입니다(델파이와 C++):
// Delphi:
procedure TDelphiDataSnapClientForm.EchoStringButtonClick(
Sender: TObject);
var
Temp : TServerMethods1Client;
Begin
Temp := TServerMethods1Client.Create(
SQLConnection1.DBXConnection);
try
Label1.Text := Temp.EchoString(Edit1.Text)
finally
Temp.Free();
end
end;
procedure TDelphiDataSnapClientForm.ReverseStringButtonClick(
Sender: TObject);
Var
Temp : TServerMethods1Client;
22
begin
Temp := TServerMethods1Client.Create(
SQLConnection1.DBXConnection);
try
Label1.Text := Temp.ReverseString(Edit1.Text)
finally
Temp.Free()
end
end;
// C++:
//--------------------------------------------------------------
void __fastcall TCppDataSnapClientForm::EchoStringButtonClick(
TObject *Sender)
{
TServerMethods1Client *Temp;
Temp = new TServerMethods1Client(
SQLConnection1->DBXConnection);
try
{
Label1->Text = Temp->EchoString(Edit1->Text);
}
__finally
{
delete Temp;
}
}
//--------------------------------------------------------------
void __fastcall TCppDataSnapClientForm::ReverseStringButtonClick(
TObject *Sender)
{
TServerMethods1Client *Temp;
Temp = new TServerMethods1Client(
SQLConnection1->DBXConnection);
try
{
Label1->Text = Temp->ReverseString(Edit1->Text);
}
__finally
{
delete Temp;
}
}
//--------------------------------------------------------------
마지막으로, 클라이언트 애플리케이션을 작성하고 실행합니다.
23
런타임에 다음과 같은 오류 메시지가 나타나면,
SQLConnection 컴포넌트의 Connected 속성이 True로 설정되어 있지 않은 경우 이런 오류가 발생할 수
있습니다. DataSnap 클라이언트 애플리케이션을 실행하기 전에 SQLConnection의 Connected 속성이
True로 설정되어 있는지 확인하십시오. 클라이언트 프로그램에 대한 실시는 SQLConnection의 Connected
속성을 ON/OFF 하기 위해 세 번째 버튼을 추가하는 것입니다. 또 다른 방법은 FormCreate에서
Connected 속성이 참인지 확인하고 거짓인 경우, Connected 속성을 True로 설정하고 FormDestroy에서
Connected 속성을 False로 설정하는 것입니다.
DataSnap 서버 프로그램이 실행되어 있지 않은 상태에서 SQLConnection의 Conneted 속성은 True로
설정되어 있고 DataSnap 클라이언트 프로젝트가 활성화 되어있는 프로젝트 그룹을 로드 할 때 실행
오류가 발생 수 있습니다:
오류가 발생하여도 걱정할 필요는 없습니다. 폼 디자이너가 설계 시점에 DataSnap 서버와 통신하려고
하고 포트 211에서 실행되는 서버를 찾을 수 없습니다. OK를 클릭하여 DataSnap 서버 애플리케이션을
시작하고 DataSnap 클라이언트 애플리케이션을 다시 활성화하십시오.
DataSnap 서버를 실행하려고 할 때 마지막으로 "주소 및 포트는 이미 사용 중 입니다” 라는 오류를 볼
수 있습니다.
DataSnap 서버가 동일한 포트 번호를 사용하려고 하는 경우 이 오류가 런타임 또는 프로젝트 설계
시에 발생할 수 있습니다. 문제를 해결하려면 DataSnap 서버를 종료하거나 모두를 실행해야 한다면
다른 포트를 사용하고 있는지 모두 확인하십시오.
DataSnap 클라이언트 프로그램이 성공적으로 DataSnap 서버에 연결하는 경우, 클라이언트 폼이
표시됩니다. 에디터 박스에 무언가의 텍스트를 입력하고 Echo String 과 Reverse String 버튼을
24
클릭합니다.
이벤트 핸들러는 DataSnap 서버 메소드를 호출하여 반환되는 문자열을 TLabel의 Text 속성에
할당합니다.
맥 OS X에서 DataSnap 클라이언트를 실행하려면 다음과 같은 절차가 필요합니다.
 OS X의 타깃 플랫폼 노드를 추가하고 활성화 시킵니다.
 SQLConnection의 Params 속성에서 HostName 값을 DataSnap 서버를 실행하고 있는 컴퓨터
이름 또는 IP 주소로 설정합니다 (기본 HostName 값은 “localhost”입니다, 맥 IP 주소
192.168.xx.xxx에 대한 VM웨어 퓨전 아래에 윈도우 7 게스트 OS에서)
 RAD Studio IDE에서 서버와 클라이언트 애플리케이션을 제어하려는 경우, 서버가 맥에서
실행되고 있는지 확인하십시오.
DataSnap 클라이언트 애플리케이션을 실행합니다. IDE는 원격 프로파일 설정을 사용하여 DataSnap
클라이언트 애플리케이션을 맥에 배포합니다. DataSnap 서버 메소드를 호출하기 위해. 맥에서 에디터
박스에 텍스트를 입력하고 버튼을 클릭합니다.
델파이와 C+ +을 사용하여 DataSnap 클라이언트와 서버를 혼합하고 매치할 수 있습니다. VCL
애플리케이션뿐만 아니라 콘솔 애플리케이션, 파이어몽키 애플리케이션 등을 사용할 수 있습니다.
서버 애플리케이션을 종료하기 전에 모든 SQL 연결을 종료해야 합니다. 이 예제에서, 클라이언트에서
TSQLConnection 컴포넌트의 Connected 속성을 False로 지정합니다.
DataSnap은 서버를 종료하는 경우에도, 현재 연결되어 있는 클라이언트가 있는지 경고하지 않습니다.
25
델파이 IDE는 자동으로 서버에 연결하고 노출 된 클래스와 메소드를 검색하기 때문에 모든 클라이언트
프로그램을 종료하는 것이 이 문제를 해결하지 못합니다.
엠바카데로 DocWiki에서 다른 간단한 DataSnap 서버와 클라이언트 자습서를 찾을 수 있습니다
http://docwiki.embarcadero.com/RADStudio/en/Tutorial:_Using_a_DataSnap_S erver_with_an_Application.
이 튜토리얼은 숫자 두 개를 합산하는 DataSnap 서버 메소드 및 DataSnap 클라이언트 프로그램을
작성하는 방법을 보여줍니다. Pawel Glowacki는, 자신의 델파이 랩, DataSnap 에피소드 1에서 델파이를
사용하여 간단한 DataSnap 계산기 서버와 클라이언트를 작성하는 방법을 보여줍니다.
http://edn.embarcadero.com/article/41176에서 기사를 보실 수 있습니다.
다음에서 소스 코드를 다운 로드 받을 수 있습니다
http://cc.embarcadero.com/item/28184.
윈도우와 맥 멀티-티어 데이터베이스 애플리케이션 작성
DataSnap 기반의 멀티 클라이언트, 멀티 플랫폼, 멀티-티어 데이터베이스 애플리케이션을 생성합니다.
다음과 같은 애플리케이션을 포함합니다:
 인터베이스 데이터베이스를 사용하는 파이어몽키 기반의 DataSnap 서버
 데이터베이스 작업을 위한 사용자 인터페이스를 제공하며, 윈도우 및 맥에서 실행할 수 있는
파이어몽키 DataSnap 클라이언트.
DataSnap 클라이언트는 데이터베이스에 액세스하는 DataSnap 연결만 필요한 가벼운 클라이언트가
됩니다. DataSnap 서버는 로컬 또는 원격 데이터베이스와 작업 할 수 있는 데이터베이스 드라이버와
비즈니스 로직을 갖추고 있습니다.
DataSnap 서버 애플리케이션은 델파이 또는 C + +중 하나를 사용하여 윈도우에서 실행합니다. 델파이와
C + +을 사용하여 윈도우와 맥에서 실행하는 DataSnap 클라이언트 애플리케이션을 구축 할 수 있습니다.
또한 RAD Studio를 사용하여, RadPHP, 자바 스크립트의 DataSnap 클라이언트 애플리케이션을 구축 할 수
있고 iOS (오브젝트-C와 델파이), 안드로이드(자바), 블랙 베리(자바), 및 윈도우 폰(C #)를 지원하는
DataSnap 모바일 커넥터를 사용할 수 있습니다 DataSnap 클라이언트 프로그램은 DataSnap 서버와
동일한 언어로 구현 할 필요가 없습니다.
DataSnap 서버와 클라이언트를 작성하려면 다음 단계를 실행하십시오. 각 단계의 끝에서 File > Save All
(shift-control-s) 하는 것을 기억하십시오.
1 단계: 새로운 파이어몽키 DataSnap 서버 프로젝트 생성.
델파이의 경우, File > New > FireMonkey HD Application – Delphi를 선택하여 새로운 델파이 프로젝트를
생성합니다.
C ++의 경우에는, File > New > FireMonkey HD Application - C ++Builder를 선택하여 새로운 C ++빌더
프로젝트를 생성합니다.
폼의 Caption 속성을 "Delphi DB DataSnap Server Application" 또는 “C ++ DB DataSnap Server Application”로
지정합니다.
File > Save All를 클릭하여 프로젝트를 저장합니다.
26
델파이에서는 DelphiDBServerUnit.pas로 유니트 파일을 저장하고 DelphiDBDataSnapServer.dproj로 프로젝트
파일을 저장합니다. C ++에서는, CppDBServerUnit.cpp로 파일을 저장하고 CppDBDataSnapServer.cbproj로
프로젝트 파일을 저장합니다.
2 단계: DataSnap 서버 컴포넌트 추가하기
툴 팔레트의 Datasnap 서버 카테고리에 아래 컴포넌트를 폼 위에 드래그&드롭 합니다:
 TDSServer
 TDSServerClass
 TDSTCPServerTransport
File > Save All 클릭하여 프로젝트를 저장합니다.
서버 폼이 다음과 같이 보일 것 입니다:
3 단계 – 서버 컴포넌트들 서로 연결하기
3 개의 DataSnap 서버 컴포넌트를 서로 연결하기 위해 오브젝트 인스펙터를 사용하여 다음과 같이
합니다:
폼 위의 TDSServerClass 컴포넌트를 선택하여 드롭-다운 메뉴에서, Server 속성을 TDSServer 컴포넌트
이름인 DSServer1으로 설정합니다.
폼 위의 TDSTCPServerTransport 컴포넌트를 선택하여, Server 속성을 TDSServer 컴포넌트 이름인
DSServer1로 설정합니다.
File > Save All 클릭하여 프로젝트를 저장합니다.
4 단계– 프로젝트에 ServerModule 추가하기
File > New > Other…를 사용하여 “New Items” 오브젝트 갤러리를 불러옵니다. 또한 툴 바에 있는 “New
Items” 스피드 버튼을 클릭할 수 있습니다(녹색 + 기호가 있는 페이지 아이콘).
델파이 DataSnap 서버인 경우, Delphi Projects > DataSnap Server 탭을 클릭하여 서버 모듈이라 불리는
새로운 델파이 파일을 추가합니다.
27
서버 모듈을 선택하고 OK를 클릭합니다. OK를 클릭한 후 다음과 같은 경고 대화상자가 표시될
것입니다:
서버 모듈은 VCL, 파이어몽키 및 일반 컴포넌트와 같이 사용할 수 있기 때문에, IDE는 파이어몽키와
공통 컴포넌트로 사용을 제한하는 신호로 이 경고 메시지를 표시합니다. 계속 진행하기 위해 Yes
버튼을 클릭합니다.
오브젝트 인스펙터에서 ClassGroup 속성을 FMX.Types.TControl로 설정합니다.
서버 모듈 마법사는 서버 모듈 폼과 서버 모듈 클래스 선언을 생성합니다.
다음 단계에서 서버 클래스 폼에 데이터베이스 액세스 컴포넌트 추가하고 서버 클래스 안에 추가적인
public 메소드를 추가할 것입니다. 생성 된 델파이 서버 모듈 클래스 선언은 다음과 같습니다:
TDSServerModule1 = class(TDSServerModule)
private
{ Private declarations }
public
{ Public declarations }
end;
모듈을 DelphiServerModule.pas로 저장합니다.
C ++ DataSnap 서버의 경우에는, C ++Builder Projects > DataSnap Server 탭을 클릭하여 서버 모듈이라
불리는 새로운 C ++ 파일을 추가합니다.
28
Server Module을 선택하고 OK를 클릭합니다. OK를 클릭한 후 다음과 같은 경고 대화상자가 표시될
것입니다:
서버 모듈은 VCL, 파이어몽키 및 일반 컴포넌트와 같이 사용할 수 있기 때문에, IDE는 파이어몽키와
공통 컴포넌트로 사용을 제한하는 신호로 이 경고 메시지를 표시합니다. 계속 진행하기 위해 Yes
버튼을 클릭합니다.
오브젝트 인스펙터에서 ClassGroup 속성을 FMX.Types.TControl로 설정합니다.
서버 모듈 마법사는 서버 모듈 폼과 서버 모듈 클래스 선언을 생성합니다.
다음 단계에서 서버 클래스 폼에 데이터베이스 액세스 컴포넌트 추가하고 서버 클래스 안에 추가적인
public 메소드를 추가할 것입니다. 생성 된 C++ 서버 모듈 클래스 선언은 다음과 같습니다:
__published:// IDE-managed Components
private:// User declarations
public:// User declarations
__fastcall TDSServerModule1(TComponent* Owner);
};
모듈을 CppServerModuleUnit.cpp로 저장합니다.
델파이와 C + + DataSnap 서버 모두에서, TDSServerModule 클래스는 TDSServerModuleBase에서 상속받고
TDSServerModuleBase클래스는 TProviderDataModule에서 상속받고 TProviderDataModule 클래스는
TDataModule에서 상속받습니다. 서버 모듈에 다양한 데이터베이스 컨트롤을 추가할 수 있습니다. 또한
코드 에디터를 사용하여 서버 모듈에 public 메소드를 추가합니다.
데이터 모듈은 초기 중립 프레임 워크입니다. 프레임워크 별 라이브러리 요소를 사용하려면, ClassGroup
슈도-속성에 대한 프레임워크-특정 값을 선택하여 플랫폼 선호도를 설정해야 합니다:
29
 System.Classes.TPersistent, 디폴트 설정, 프레임 워크 중립을 나타내며 특정 프레임워크가 아닌
RTL 요소만 포함합니다.
 Vcl.Controls.TControl - VCL 프레임워크로 설정합니다 특정 프레임워크가 아닌 RTL 요소만
포함합니다.
 FMX.Types.TControl - FMX 프레임워크로 설정합니다 특정 프레임워크가 아닌 RTL 요소만
포함합니다.
 FMX _Types.TControl - FMX iOS 프레임워크로 설정합니다 특정 프레임워크가 아닌 RTL 요소만
포함합니다.
File > Save All를 클릭하여 프로젝트를 저장합니다.
5 단계 – DataSnap 서버 프로젝트에 데이터베이스 컴포넌트 추가하기
데이터 탐색기에서 아이템을 드래그하여 프로젝트에 컴포넌트를 추가 할 수 있습니다. 프로젝트
매니저에서 데이터 탐색기(Data Explorer) 탭을 클릭합니다. 트리 보기에서 INTERBASE 항목이 확장되어
있지 않으면 확장 하기 위한 (+) 기호를 클릭 합니다. INTERBASE 아래의 EMPLOYEE 항목을 연 다음
테이블 항목을 확장합니다. DelphiServerModuleUnit 폼이나 CppServerModuleUnit 폼에 EMPLOYEE
테이블을 드래그하면 두 개의 새로운 dbExpress 컴포넌트가 폼 위에 추가됩니다:
 오브젝트 인스펙터에서 TSQLConnection 컴포넌트의 Name 속성을 "EMPLOYEE_CONNECTI ON"로
지정합니다.
 오브젝트 인스펙터에서 TSQLDataSet 컴포넌트의 Name 속성을 "EMPLOYEE_TABLE"로
지정합니다.
폼에 테이블을 드래그한 경우, 두 개의 컴포넌트가 자동으로 연결되어 있습니다. TSQLConnection
컴포넌트의 Name 속성을 설정하면, 당신은 EMPLOYEE_TABLE의 SQLConnection 속성이
EMPLOYEE_CONNECTION로 변경된 것을 알 수 있습니다.
DelphiServerModuleUnit 폼이나 CppServer ModuleUnit 폼 위에 2 개의 컴포넌트를 추가합니다:
 TDataSetProvider를 추가합니다. 오브젝트 인스펙터에서, DataSet 속성을 드롭-다운 메뉴에서
EMPL OYEE_TABLE로 설정합니다. 뒤에 추가되는 다른 TDataSetProvider와 구별하기 위해 name
속성을 ServerDataSetProvider1로 설정합니다.
TSQLStoredProc 컴포넌트를 추가합니다. 드롭-다운 메뉴를 사용하여 SQLConnection 속성을
"EMPLOYEE_CONNECTION" 도 설정합니다. 드롭-다운 메뉴를 사용하여 StoredProcName 속성을 "GET_EMP
_PROJ"로 설정합니다. "GET_EMP_P ROJ" 는 Employee 데이터베이스에 있는 저장 프로시저 중 하나입니다.
이 저장 프로시저는 직원 번호와 연관된 프로젝트 ID를 얻습니다.
File > Save All 메뉴를 클릭하여 프로젝트를 저장합니다.
델파이 또는 C + + 프로젝트에 대한 서버 모듈은 아래 그림과 같이 표시됩니다.
30
6 단계- 서버 모듈에 함수 추가하기
서버 모듈의 public 부분에 함수를 추가합니다. 서버 모듈의 public 섹션에 있는 모든 서버 메소드는
연결되어있는 DataSnap 클라이언트 프로그램에 의해 호출 될 수 있습니다.
델파이: DelphiServerModuleUnit를 선택하고 코드 탭을 클릭합니다. ServerModule의 타입 부분의 Public
섹션 아래에 이 함수 선언을 추가합니다:
function callStoredProcedure (mylocalkey : Integer) : String;
구현 섹션에서 이 함수에 대한 기본 구조를 생성하기 위해 CTRL-SHIFT-C를 눌러 클래스 완성을
사용합니다:
C ++: CppServerModuleUnit를 선택하여, 헤더 파일을 보기 위해 CppServerModuleUnit.h 탭을 클릭합니다.
public 아래 부분에 다음 함수를 추가합니다:
String _fastcall callStoredProcedure (int mylocalkey);
데이터베이스 컴포넌트와 public 메소드를 추가한 후 델파이와 C는 + + 서버 모듈 클래스는 다음과
같이 선언됩니다.
// Delphi
TDSServerModule1 = class(TDSServerModule)
EMPLOYEE_CONNECTION: TSQLConnection;
EMPLOYEE_TABLE: TSQLDataSet;
ServerDataSetProvider1: TDataSetProvider;
SQLStoredProc1: TSQLStoredProc;
31
private
{ Private declarations }
public
{ Public declarations }
function callStoredProcedure (mylocalkey : Integer) : String;
end;
// C++
class TDSServerModule1 : public TDSServerModule
{
__published:// IDE-managed Components
TSQLConnection *EMPLOYEE_CONNECTION;
TSQLDataSet *EMPLOYEE_TABLE;
TDataSetProvider *ServerDataSetProvider1;
TSQLStoredProc *SQLStoredProc1;
private:// User declarations
public:// User declarations
String _fastcall callStoredProcedure (int mylocalkey);
__fastcall TDSServerModule1(TComponent* Owner);
};
File > Save All를 클릭하여 프로젝트를 저장합니다.
7 단계 - 방금 추가된 함수에 대한 서버 측 코드 작성하기
callStoredProcedure 함수는 정수형 매개 변수 직원 번호 (EMP_NO)를 가지고 저장 프로시저를
호출합니다. 이 함수는 문자 프로젝트 ID (PROJ_ID)를 얻습니다. 이 함수는 입력 매개 변수를 지정하고
프로시저를 실행 한 후 출력 매개 변수를 검색합니다. TSQLStoredProc 컴포넌트의 StoredProcName
속성의 값을 이미 저장 프로시저 이름 "GET_EMP_PROJ"로 설정했습니다. 델파이에서,
DelphiServerModuleUnit.pas에 다음 함수를 추가합니다:
델파이의 경우, DelphiServerModuleUnit.pas에 다음의 함수를 추가합니다:
function TDSServerModule1.callStoredProcedure(
mylocalkey: Integer): String;
var
myString :String;
begin
SQLStoredProc1.ParamByName('EMP_NO').AsInteger := mylocalkey;
SQLStoredProc1.ExecProc;
myString := SQLStoredProc1.ParamByName('PROJ_ID').AsString;
result := myString;
end;
C ++의 경우, CppServerModuleUnit.cpp 안에 다른 멤버 함수 뒤에 다음 함수를 추가합니다:
String _fastcall TDSServerModule1::callStoredProcedure (
int mylocalkey) {
String myString;
SQLStoredProc1->ParamByName("EMP_NO")->AsInteger = mylocalkey;
SQLStoredProc1->ExecProc();
myString = SQLStoredProc1->ParamByName("PROJ_ID")->AsString;
32
return myString;
}
실제 저장 프로시저 매개 변수 이름으로 EMP_NO 및 PROJ_ID가 사용되므로, ParamByName으로 값을
얻을 수 있습니다.
8 단계 – DataSnap 서버 클래스의 OnGetClass 이벤트 핸들러 추가
DelphiDBServerUnit 폼이나 CppDBServerUnit 폼으로 다시 돌아 갑니다. 오브젝트 인스펙터에서
TDSServerClass 컴포넌트를 선택합니다. 오브젝트 인스펙터에서, 이벤트 탭을 클릭하여 OnGetClass
이벤트를 더블 클릭합니다. 이 이벤트 핸들러 코드는 DataSnap 서버가 사용하는 서버의 클래스를
결정합니다:
// Delphi
procedure TForm1.DSServerClass1GetClass(
DSServerClass: TDSServerClass;
var PersistentClass: TPersistentClass);
begin
PersistentClass := TDSServerModule1;
end;
// C++
void __fastcall TForm1::DSServerClass1GetClass(
TDSServerClass *DSServerClass,
TPersistentClass &PersistentClass) {
PersistentClass = __classid(TDSServerModule1);
}
변수 PersistentClass가 오브젝트 참조가 아니라 클래스 참조에 할당되어 있는 것을 주목하십시오.
서버 모듈에 ServerForm에 필요한 연결을 제공합니다.
델파이에서, ServerForm 유니트의 Uses 절로 가서 DelphiServerModuleUnit를 추가하여
TDSServerModule1이 인식됩니다. (또한 File > Use Unit을 사용할 수도 있습니다).
C ++의 경우는, CppDBServerUnit.cpp 안에 다른 includes 뒤에 다음 라인을 추가합니다:
#include "CppServerModuleUnit.h"
유니트를 저장합니다. 서버 프로젝트를 빌드 하고(Project > Build 또는 Shift-F9) 오류를 수정하지만, 지금
서버를 실행하지 않습니다.
RAD Studio에서 프로젝트 매니저 보기에서 클릭합니다. 프로젝트 그룹을 오른쪽 마우스 버튼 클릭하여
프로젝트 그룹을 저장합니다. 프로젝트 그룹 이름을 DataSnapDBApplication.groupproj로 저장합니다. 다음
섹션에서 이 프로젝트 그룹에 다른 프로젝트를 추가할 것 입니다.
두 가지를 수행하는 서버를 완료합니다:
 업데이트 할 수 있는 데이터베이스 데이터를 제공합니다.
 저장 프로시저를 실행하고 값을 반환합니다
다음으로, 서버를 사용하는 DataSnap 클라이언트를 생성합니다. 클라이언트는 서버의 두 함수를
연습해봅니다:
33
 저장 프로시저를 호출하고 값을 반환합니다.
 데이터베이스 테이블의 데이터를 표시하고 업데이트합니다.
File > Save All를 클릭하여 프로젝트와 프로젝트 그룹을 저장합니다.
9 단계 – 클라이언트 애플리케이션 프로젝트 작성하기
서버 프로그램과 같은 프로젝트 그룹에 클라이언트 프로그램을 작성하려면 프로젝트 매니저의
프로젝트 그룹 이름에서 오른쪽 마우스 버튼을 클릭하여 Add New Project를 선택하거나 메뉴의 Project
> Add New Project를 선택합니다. 새 항목 대화상자가 나타날 것입니다.
델파이에서, 델파이 프로젝트 카테고리에서 FireMonkey HD Application를 선택합니다. C ++빌더에서는,
C++빌더 프로젝트 카테고리에서 FireMonkey HD Application를 선택합니다.
OK를 클릭합니다. 새 폼을 선택하고 오브젝트 인스펙터에서 폼의 Caption 속성을 “Delphi DB DataSnap
Client Application” 또는 “C++ DB DataSnap Client Application”로 지정합니다.
File > Save All을 선택하여 파일들을 저장합니다:
델파이의 경우, 유니트를 DelphiDBClientUnit.pas로 저장합니다. 프로젝트를 DelphiDBDataSnapClient.dproj로
저장합니다. C ++의 경우, 유니트를 CppDBClientUnit.cpp로 저장합니다. 프로젝트를
CppDBDataSnapClient.cbproj로 저장합니다.
프로젝트 매니저에서 CppDBDataSnapServer.cbproj.exe를 더블 클릭합니다(프로젝트를 활성화하기 위해).
Run > Run Without Debugging (또는 Shift -Control-F9를 눌러)을 선택하여 DataSnap 서버 애플리케이션을
실행합니다. 나타나는 서버 프로그램 화면을 최소화합니다.
참고: 다음 단계에서 서버에 연결하고 DataSnap 클라이언트 클래스를 생성 할 수 있도록 서버가
실행되고 있어야 합니다.
File > Save All를 클릭하여 프로젝트와 프로젝트 그룹을 저장합니다.
10 단계 – DataSnap 서버에 DataSnap 클라이언트 연결하기
새 폼 위에 TSQLConnection 컴포넌트를 내려 놓고 오브젝트 인스펙터에서 다음의 속성들을 설정합니다:
 Driver 속성을 "DataSnap"으로 지정합니다. 오브젝트 인스펙터에서, Driver 속성의 왼쪽에 있는
+ 기호를 클릭하여 드라이버 하위 속성들을 표시합니다(설정할 수 있습니다):
o Port 속성을 "211" (기본값)로 지정합니다.
o HostName 속성을 "localhost" (기본값)로 지정합니다. 같은 컴퓨터에서 DataSnap 서버와
클라이언트 테스트를 위한 localhost를 사용합니다.
DataSnap 서버가 다른 컴퓨터에 있다면, 클라이언트의 TSQLConnection컴포넌트의 HostName
속성에 DataSnap 서버가 실행하고 있는 컴퓨터 이름이나 TCP /IP 주소를 지정해야 합니다.
o 이러한 속성들(및 다른 속성들)은 Params 속성을 변경하므로 서 설정될 수도 있습니다.
Params 속성에서 엘립시스(...) 버튼을 클릭하여 값 리스트 에디터를(Value List
Editor)표시합니다. 대화상자에서 속성 값을 입력하고 값을 설정하기 위해 OK 를 클릭합니다.
34
 LoginPrompt 속성을 false로 설정하여 클라이언트가 서버에 연결할 때마다 사용자 이름과 암호
대화상자가 표시되는 것을 피합니다.
 Connected 속성을 true로 설정합니다.
DataSnap 서버가 실행하고 있는 동안, TSQLConnection에서 오른쪽 마우스 버튼을 클릭하여 컨텍스트
메뉴에서 “Generate DataSnap client classes”를 선택합니다. 이 작업은 작성한 DataSnap 서버의 함수
연결과 사용을 지원하는 코드로 새로운 유니트를 생성합니다. 델파이에서는 생성된 유니트를
DelphiDBClientClasses.pas로 저장합니다. C ++에서는, 생성된 유니트를 CppDBClientClasses.cpp로 저장합니다.
델파이 또는 C + + 클라이언트 클래스 유니트에 DataSnap DB 클라이언트 유니트에 연결합니다.
델파이에서는, DelphiDBClientUnit 탭을 클릭하고, 코드 탭을 클릭하여 DelphiDBClientUnit의 uses 절에
DelphiDBClientClasses를 추가합니다(또는 File > Use Unit 사용하여).
C ++에서는, 코드 에디터의 상단에 CppDBClientUnit.cpp 탭을 클릭하고, 코드 에디터의 밑에 코드 탭을
클릭합니다. CppDBClientUnit.cpp 안에 다른 includes 뒤에 다음 include문을 추가합니다:
#include "CppDBClientClasses.h"
File > Save All를 클릭하여 프로젝트와 프로젝트 그룹을 저장합니다.
11 단계 – DataSnap 클라이언트 애플리케이션 사용자 인터페이스 작성 시작
다음으로 DataSnap 클라이언트 애플리케이션의 사용자 인터페이스 작성을 시작하겠습니다.
DelphiDBClientUnit 폼에서, 디자인 탭을 클릭하고 툴 팔레트로부터 컴포넌트를 폼 위에 드래그합니다:
 데이터베이스를 이동하기 위한 TBindNavigator 컨트롤.
 데이터베이스 테이블을 보기 위한 TStringGrid 컨트롤.
 DataSnap 서버 연결을 열기/닫기 하고 ClientDataSet을 활성화/비활성화 하기 위한 TCheckBox
컨트롤.
 수정된 데이터베이스 데이터를 업데이트하고 저장 프로시저를 호출하기 위한 TButtons 2개.
해당 TButton의 Text 속성을 "업데이트 적용하기" 와 "프로젝트 가져오기"로 지정합니다. 각
연관된 TButton의 Name 속성을 “ApplyUpdatesButton” 와 “GetProjectButton”으로 지정합니다.
 Employee 번호를 입력하기 위한 TEdit 컨트롤.
 프로젝트 ID를 표시하기 위한 TLabel 컨트롤.
컴포넌트를 배치 한 후, 필요에 따라 이동하고 크기를 조절합니다. DataSnap 클라이언트 폼은 다음과
같은 모습입니다:
35
12 단계- 클라이언트 측 데이터베이스 컴포넌트 추가하기
이 단계에서 DataSnap 서버의 데이터베이스 작업에 DataSnap 클라이언트 프로그램을 연결하는
데이터베이스 컴포넌트 및 코드를 추가합니다. DataSnap 서버가 실행되고 있는지 확인하십시오.
IDE 인사이트 또는 툴 팔레트를 사용하여 폼에 TSQLServerMethod 컴포넌트를 내려 놓습니다.
오브젝트 인스펙터에서 SQLConnection 속성을 "SQLConnection1"으로 설정합니다.
TSQLServerMethod의 ServerMethodName 속성을 설정합니다. DataSnap 서버가 실행되고 있을 경우,
속성의 드롭-다운 메뉴를 사용하여 DataSnap 서버에서 사용 가능한 서버 메소드들 모두를 볼 수
있습니다. 이 리스트는 DataSnap 관리, 메타데이터 및 서버 모듈 메소드들을 포함합니다. InterBase
Employee 데이터베이스의 “Get_EMP _PROJ” 저장 프로시저를 호출하는 앞에서 DataSnap 서버에 작성해
놓은 함수인 "TDSServerModule1.callStoredProcedure"를 선택합니다.
36
TSQLServerMethods의 Active 속성은 true로 설정하지 않습니다. 만일 설정하면,“Get_EMP_PROJ” 저장
프로시저는 데이터 셋을 반환하지 않고 프로젝트 이름 문자 값만을 반환하기 때문에 오류 메시지가
표시될 것입니다. 메소드를 호출하고 TLabel의 Text 속성에 반환 되는 문자 값을 넣는 코드를
사용합니다.
폼에 TDSProviderConnection 컴포넌트를 추가합니다. 이 프로바이더 컴포넌트는 DataSnap 서버와
데이터베이스를 자유롭게 탐색하고 업데이트를 해결 할 수 있는 능력을 제공합니다. SQLConnection
속성을 "SQLConnection1"로 지정합니다. ServerClassName 속성을 DataSnap 서버의 서버 모듈 클래스
이름으로 지정합니다. 우리 예제에서는 "TDSServerModule1"입니다.
폼에 TClientDataSet 컴포넌트를 추가합니다. ProviderName 속성을 드롭-다운 메뉴에서
"DataSetProvider1"로 설정합니다. RemoteServer 속성을 드롭-다운 메뉴에서 "DSProviderConnection1"로
설정합니다. ProviderName 속성을 "ServerDataSetProvider1"로 지정합니다.
“ TDataSource” 컴포넌트를 폼에 추가하고 “DataSet” 속성을 “ClientDataSet1”으로 설정합니다.
폼의 TStringGrid 에서 오른쪽 마우스 버튼을 클릭하여 컨텍스트 팝업 메뉴에서 “Link to DB
DataSource”를 선택합니다. “select a data source” 리스트에서 DataSource1를 선택하고 OK 버튼을
클릭합니다.
37
클라이언트 폼 위에 2개의 컴포넌트가 추가 되어 나타납니다:
 BindScopeDB - 라이브바인딩을 사용하여 액세스 하고 싶은 모든 컴포넌트에 지정된
데이터소스에 의해 포함된 데이터를 확인하기 위한 방법을 제공하는 비-시각적 컴포넌트.
 BindingsList – 메소드 및 출력 컨버터등 라이브바인딩 표현을 모두 포함하는 비 시각적
컴포넌트.
폼의 BindDBNavigator 컴포넌트를 선택하고 오브젝트 인스펙터에서 드롭-다운 메뉴에서 BindScope
속성을 “BindScopeDB1”로 지정합니다.
ClientDataSet의 Active 속성을 True로 설정합니다. TStringGrid 에서 라이브 employee 데이터를 보실 수
있습니다. InterBase 데이터베이스에서 데이터와 메타 데이터를 구해오는 DataSnap 서버에 DataSnap
연결을 통해 데이터와 메타 데이터를 가져오고 있습니다.
ClientDataSet의 Active 속성을 False로 설정합니다. 클라이언트 프로그램은 다음 단계에서 추가하는
체크박스의 OnChange 이벤트 핸들러를 사용하여 ClientDataSet의 Active 속성을 토글링 합니다.
클라이언트 측에 DataSnap 액세스 및 ClientDataSet 컴포넌트를 추가하고 DataSnap 클라이언트의
속성들을 설정 한 후, 폼은 다음과 같아야 합니다:
38
13 단계 – 체크박스에 대한 이벤트 핸들러를 추가하고 업데이트 버튼 적용하기
먼저 서버 연결에 대한 확인 체크박스의 OnChange 이벤트 핸들러를 추가합니다. 체크 박스를 선택하고
오브젝트 인스펙터의 이벤트 탭을 선택하고 기본 골격 코드를 생성하기 위해 OnChange 이벤트를 더블
클릭합니다. DataSnap 서버 연결을 열기/닫기 하고 ClientDataSet을 활성화/비활성화하는 다음 코드를
추가합니다:
// Delphi
procedure TForm1.CheckBox1Change(Sender: TObject);
begin
// if Connect to Server is checked then
//open the DataSnap server connection
//activate the ClientDataSet
if CheckBox1.IsChecked then begin
SQLConnection1.Connected := True;
ClientDataSet1.Active := True
end
// if Connect to Server is not checked then
//deactivate the ClientDataSet
//close the DataSnap server connection
else begin
ClientDataSet1.Active := False;
SQLConnection1.Connected := False
end;
end;
39
// C++
void __fastcall TForm1::CheckBox1Change(TObject *Sender)
{
// if Connect to Server is checked then
//open the DataSnap server connection
//activate the ClientDataSet
if (CheckBox1->IsChecked) {
SQLConnection1->Connected = True;
ClientDataSet1->Active = True;
}
// if Connect to Server is not checked then
//deactivate the ClientDataSet
//close the DataSnap server connection
else {
ClientDataSet1->Active = False;
SQLConnection1->Connected = False;
}
}
"업데이트 적용하기" 버튼의 OnClick 이벤트 핸들러를 추가합니다. 위와 같이 이벤트 핸들러의 기본
골격을 생성하고 다음 코드를 추가합니다:
// Delphi
procedure TForm1.ApplyUpdatesButtonClick(Sender: TObject);
begin
ClientDataSet1.ApplyUpdates(0);
end;
// C++
void __fastcall TForm1:: ApplyUpdatesButtonClick(TObject *Sender)
{
ClientDataSet1->ApplyUpdates(0);
}
스트링그리드에서 데이터를 변경할 때 변경된 내용이 ClientDataSet의 Delta (Published 가 아님)속성에
저장되고 있습니다. 델타는 클라이언트를 통해 삽입된, 수정된, 삭제된 레코드에 대한 정보만
포함합니다. 클라이언트 데이터 셋이 프로바이더에 연결될 때, 델타는 ApplyUpdates와 Reconcile
메소드에 매개변수로 전달되고 데이터베이스를 업데이트하기 위해 변경 로그의 정보를 사용합니다.
업데이트를 성공적으로 하고 돌아온 후, 델타는 지워집니다.
ApplyUpdates는 업데이트 프로세스를 중단하기 전에 오류의 최대 수를 나타내는, MaxErrors, 하나의
매개 변수를 사용합니다. 프로바이더는 업데이트 프로세스를 중단하기 전에 허용 되야 합니다.
MaxErrors 가 0 이면, 업데이트 오류가 발생하자마자, 전체 업데이트 과정이 종료됩니다. 어떠한 변경
사항도 데이터베이스에 기록되지 않고 클라이언트 데이터 셋의 변경 로그는 그대로 유지됩니다.
MaxErrors 가 -1 이라면, 모든 오류는 묵인되고 변경 로그가 성공적으로 적용한지 못한 모든 기록이
포함되어 있습니다. MaxErrors는 양수 값이라면, MaxErrors에 의해 지정된 것보다 더 많은 오류가
발생하는 경우 모든 업데이트가 중단됩니다. MaxErrors에 의해 지정된 것보다 적은 오류가 발생하면
성공적으로 적용된 모든 레코드들은 자동으로 클라이언트 데이터셋의 변경 로그로부터 지워집니다.
ApplyUpdates는 MaxErrors 보다 항상 작거나 1 더한 수와 같은, 실제 발생하는 오류의 수를 반환합니다.
이 반환 값은 데이터베이스에 기록 할 수 없는 레코드의 수를 나타냅니다.
클라이언트 데이터셋의 ApplyUpdates 메소드는 다음을 수행합니다:
 그것은 간접적으로 프로바이더의 ApplyUpdates 메소드를 (이 경우 TCP / IP를 통해 DataSnap
서버에서 DataSnap 클라이언트로) 호출합니다. 프로바이더의 ApplyUpdates 메소드는
40
데이터베이스에 업데이트를 기록하고 발생하는 오류를 수정하려고 시도합니다.
 이 오류 조건 때문에 적용 할 수 없는 레코드들은 클라이언트 데이터셋으로 반송됩니다.
 클라이언트 데이터 셋의 ApplyUpdates 메소드는 Reconcile 메소드를 호출하여 문제 레코드를
조정하려고 시도합니다. Reconcile은 OnReconcileError 이벤트 핸들러를 호출하는 오류 처리
루틴입니다. 오류를 수정하기 위해 OnReconcileError 이벤트 핸들러를 코딩 해야 합니다.
 마지막으로, Reconcile은 새로 업데이트 된 레코드를 반영하기 위한 변경 로그 및 업데이트
데이터에서 성공적으로 적용된 변경 사항을 제거합니다. 조정이 완료될 때, ApplyUpdates는
발생한 오류의 수를 보고합니다.
DataSnap 서버 측과 DataSnap 클라이언트 측에서 업데이트 과정 동안 발생하는 오류를 처리하도록
하는 두 가지 이벤트가 있습니다:
 DataSnap 서버 측에서: 업데이트 프로세스를 수행하는 동안, 데이터셋 프로바이더는 처리 할
수 없는 업데이트가 발생할 때마다 OnUpdateError 이벤트를 생성합니다. OnUpdateError 이벤트
핸들러에서 문제를 올바르게 수정한다면, 오류는 ApplyUpdates 메소드에 전달된 오류의 최대
수에 포함되지 않습니다.
 DataSnap 클라이언트 측에서: 전체 업데이트 작업이 완료되면 클라이언트 데이터 셋
프로바이더는 데이터베이스 서버에 적용 할 수 없는 모든 레코드에 대한 OnReconcileError
이벤트를 생성합니다.
위의 이벤트 핸들러에서 오류 처리하지 않고 ApplyUpdates 매개 변수가 0으로 설정되어 있습니다.
심지어 적용할 수 없는 반환 레코드를 삭제하더라도 실제 애플리케이션에서는 항상 OnReconcileError
또는 UpdateError 이벤트 핸들러에서 항상 코드를 작성해야 합니다.
두 이벤트에 대한 이벤트 핸들러는 같은 방법으로 작업합니다. 다음과 같은 매개변수를 포합합니다:
 DataSet: 클라이언트 데이터셋은 적용하지 않지 못한 업데이트된 레코드들을 포함합니다.
문제를 해결하기 위해 문제 레코드에 대한 정보를 얻고 레코드를 편집하기 위해 데이터셋의
메소드를 사용할 수 있습니다. 특히 CurValue, OldValue및 업데이트 문제의 원인을 결정하기
위해 현재 레코드 안의 필드의 NewValue 속성을 사용하려는 것입니다. 그러나 이벤트
핸들러에서 현재 레코드를 변경하는 클라이언트 데이터셋의 메소드를 호출 할 수 없습니다.
 E: 발생된 문제를 나타내는 오브젝트. 오류 메시지를 추출하거나 업데이트 오류의 원인을
확인하려면 이 예외를 사용할 수 있습니다.
 UpdateKind: 생성된 오류 업데이트 유형. UpdateKind는 ukModify (수정된 기존의 레코드
업데이트 시 문제가 발생합니다), ukInsert (새로운 레코드를 입력할 때 문제가 발생합니다)
또는 ukDelete (기존의 레코드 삭제 시 문제가 발생합니다)가 될 수 있습니다.
 Action: 이벤트 핸들러가 종료할 때 어떤 조치를 취할 지 알려주는 매개변수. 이벤트
핸들러에서, 이 매개변수를 다음과 같이 지정합니다.
ο 변경 로그에 내용을 그대로 남겨 놓은 채 이 레코드를 건너뜁니다. (rrSkip 또는 raSkip)
ο 전체 조정 작업을 중단합니다. (rrAbort 또는 raAbort)
ο 서버에 해당 레코드에 실패한 수정을 병합합니다(rrMerge 또는 raMerge). 서버 레코드가
클라이언트 데이터셋에서 수정된 필드에 모든 수정을 포함하지 않는 경우에만 효과가
있습니다.
41
ο 아마도 수정 된 이벤트 핸들러에서 레코드의 값으로 변경 로그에서 현재 업데이트를
대체합니다. (rrApply 또는 raCorrect)
ο 완전히 오류를 무시합니다. (rrIgnore) 이 가능성은 OnUpdateError 이벤트 핸들러에만
존재하고, 이벤트 핸들러는 데이터베이스 서버로 다시 업데이트를 적용하는 경우를 위한
것입니다. 프로바이더가 업데이트를 적용 한 것처럼 업데이트 된 레코드는 변경
로그에서 제거되고 데이터에 통합됩니다.
ο 클라이언트 데이터셋에서 이 레코드에 대한 변경 사항을 백업하고 원래 제공된 값으로
되 돌립니다.
ο (raCancel) 이 가능성은 OnReconcileError 이벤트 핸들러에 만 있습니다.
ο 서버의 레코드와 일치하도록 현재 레코드가 값을 업데이트합니다. (raRefresh) 이 가능성은
ο OnReconcileError 이벤트 핸들러에서만 존재합니다.
ClientDataSet에 대한 더 많은 정보는, 캐리 젠슨의 훌륭한 책, “델파이 깊이보기: 클라이언트
데이터셋”을 확인해야 합니다 http://www.jensendatasystems.com/cdsbook/. 또한 ClientDataSet에 대한
블로그 게시물에서 캐리 젠슨의 시리즈를 보실 수 있습니다(또는 다운로드)
http://caryjensen.blogspot.com/search?q=clientdataset
14 단계 – 저장 프로시저 호출 버튼의 이벤트 핸들러 코드 추가하기
이 단계는 TButton TEdit 박스와 GetProject 버튼을 사용하여 직원의 번호를 가지고 인터베이스
데이터베이스의 GET_EMP_PROJ 저장 프로시저를 실행하고 프로젝트 ID를 반환하는 DataSnap 서버
메소드 호출하고 반환 값을 TLabel의 Text 속성에 표시하는 이벤트 핸들러를 작성하는 방법을
보여줍니다.
“프로젝트 가져 오기" 버튼의 OnClick 이벤트에 대한 이벤트 핸들러 기본 골격을 만듭니다. 저장
프로시저가 정수 값이 사용하기 때문에, TEdit의 사원 번호 텍스트를 정수로 변환해야 하고 결과적으로
프로젝트 ID 문자열을 반환하는 데이터베이스 저장 프로시저를 호출하는 서버 메소드를 호출합니다.
다음은 이벤트 핸들러 코드입니다:
// Delphi
procedure TForm1.GetProjectButtonClick(Sender: TObject);
var
mykey : Integer; //variable to hold text from edit box
myServer : TDSServerModule1Client; //server proxy we will call
projectIDString : string;// returned from stored proc
begin
// If DataSnap server is connected call the remote method
if SQLConnection1.Connected then begin
mykey := StrToInt(Edit1.Text); //conversion to integer
// Server creation using the SQLConnection for communication
myServer := TDSServerModule1Client.Create(
SQLConnection1.DBXConnection);
try
// Calling method that calls stored procedure with the key
// Save value returned from stored procedure
projectIDString := myServer.callStoredProcedure(mykey);
// if returned string is empty then display no projectID
if projectIDString = '' then
Label1.Text := '* NoProjID *'
else
Label1.Text := projectIDString
finally
myServer.Free //free up the server
end
42
end
end;
// C++
void __fastcall TForm1::GetProjectButtonClick(TObject *Sender)
{
// If DataSnap server is connected call the remote method
if (SQLConnection1->Connected) {
int mykey; //variable to hold text from edit box
String projectIDString;// returned from stored proc
TDSServerModule1Client *myServer; //server proxy we’ll call
mykey = StrToInt(Edit1->Text); //conversion to integer
// Server creation using the SQLConnection
myServer = new TDSServerModule1Client(
SQLConnection1->DBXConnection);
try {
// Calling method that calls the stored proc with the key.
// Save value returned from stored procedure.
projectIDString = myServer->callStoredProcedure(mykey);
// if returned string is empty then display “* noProjID *”
if (projectIDString == "")
Label1->Text = "* NoProjID *";
else
Label1->Text = projectIDString;
}
__finally {
delete myServer; //free up the server
}
}
}
앞의 코드는 저장 프로시저를 호출해서 반환 된 값 즉, 프로젝트 ID값을 TLabel의 Text 속성에
지정합니다. 저장 프로시저가 사원(NULL 문자열)의 프로젝트 ID를 찾을 수 없다면, TLabel의 Text 속성에
"* NoProjID *"텍스트를 표시합니다.
File > Save All을 선택하여 수정 된 모든 소스 파일들, 프로젝트 및 프로젝트 그룹을 저장합니다.
15 단계– 윈도우 DataSnap 클라이언트 애플리케이션 빌드와 실행하기
이제 프로젝트의 윈도우 클라이언트 측을 빌드하고 실행 할 준비가 되었습니다. 프로젝트 매니저에서
DelphiDBDataSnapClient 또는 CppDBDataSnapClient에서 오른쪽 마우스 버튼을 클릭하여 클라이언트
프로젝트를 빌드하고 발견되는 모든 오류를 수정합니다.
"서버에 연결” 체크박스를 사용하여 클라이언트 애플리케이션을 실행합니다.
 체크되었다면, DataSnap 서버에 연결하고 ClientDataSet을 활성화합니다.
 체크되어 있지 않다면 ClientDataSet을 비활성화 하고 DataSnap 서버 연결을 끊습니다.
TStringGrid은 직원 테이블로부터 가져온 항목으로 채워집니다. TBindNavigator 컨트롤 또한 테이블
항목을 탐색할 수 있도록 활성화합니다.
TStringGrid에서 셀을 선택하고 값을 변경할 수 있습니다. "업데이트 적용하기" 버튼을 클릭하면
데이터베이스 테이블은 이 변경 사항으로 업데이트됩니다.
마지막으로, 저장 프로시저를 테스트합니다. TEdit 컨트롤에서 유효한 직원 번호 중 하나를 입력하고
"프로젝트 가져 오기”버튼을 클릭합니다. 라벨의 텍스트에 EMPLOYEE_PROJEC T 테이블로부터, 하나가
존재하는 경우, 반환되는 해당 프로젝트 ID로 변경해야 합니다 그렇지 않으면 "* 없음 ProjectID의 *"를
43
표시합니다:
체크박스가 선택되어 있으며 저장 프로시저를 테스트를 완료한 경우 클라이언트 프로그램 폼은 다음과
같이 표시됩니다:
16 단계 – 맥 DataSnap 클라이언트 애플리케이션 빌드 및 실행하기
전에 언급했듯이, DataSnap 클라이언트 애플리케이션 맥 버전을 만들 수 있습니다.
프로젝트 매니저에서 DataSnap 클라이언트의 타깃 플랫폼 노드에서 오른쪽 마우스 버튼으로 클릭하고
대상으로 "OS X"를 추가합니다. 또한 타깃 플랫폼에 대한 원격 프로파일을 설정해야 합니다.
또한 PAServer이 맥에서 실행되고 있는지 확인해야 합니다(IDE는 맥에 내장 된 애플리케이션을 배포 할
수 있도록 PAServer 실행이 필요합니다). 또한 DataSnap 클라이언트를 빌드하고 원격 윈도우 타깃에
배포하려면 다음과 같은 단계를 실행합니다.
또한 클라이언트의 SQLConnection 컴포넌트에 대한 “HostName” 매개 변수를 로컬 호스트에서 DataSnap
서버가 실행중인 컴퓨터 네트워크 이름 또는 TCP / IP 주소로 변경해야 합니다.
오브젝트 인스펙터를 사용하여 SQLConnection1 컴포넌트의 Params 속성을 두 번 클릭 하여 값(Value)
44
리스트 에디터를 표시합니다. 이미 DataSnap 서버를 가리키는 DataSnap의 dbExpress 커넥션을 사용하는
새로운 DataSnap 연결을 변경 또는 생성하는 경우 이 단계를 건너 뛸 수 있습니다. 이 경우, 디폴트
DataSnap 연결 이름을 사용하였고 디폴트 HostName은 “localhost”입니다. HostName 값을 설치를 위한
컴퓨터 이름 또는 TCP/IP 주소로 지정합니다.
DataSnap 클라이언트 애플리케이션을 빌드하고 맥에 배포하기 전에 마지막으로 설정해야 하는 것은
클라이언트가 ClientDataSet을 사용하기 때문에 클라이언트 프로젝트의 배포 옵션에 Midas 라이브러리
기능 파일을 추가 합니다. Project > Deployment를 사용하여 기능 파일 아이콘을 클릭하여 MIDAS
라이브러리를 선택합니다 (프로젝트 배포는 3장 개발환경에서 다루었습니다). 맥 버전을 테스트 할 수
있도록 맥 DataSnap 클라이언트 실행파일과 함께 MIDAS.dylib를 배포합니다.
Run without Debugging (Shift-Control-F9) 또는 Run (F9)을 선택하여 DataSnap 클라이언트 애플리케이션을
컴파일하고 맥에 배포합니다. 윈도우에서 실행되고 있는 DataSnap 서버와 작업할 수 있는지 확인하기
위해 맥에서 클라이언트를 테스트합니다. 맥 DataSnap 클라이언트 애플리케이션은 윈도우
클라이언트처럼 작동합니다.
45
윈도우 및 맥 용 첫 멀티 클라이언트, 멀티 플랫폼, 멀티-티어 DataSnap 데이터베이스 애플리케이션을
작성했습니다!
DataSnap 멀티-티어 애플리케이션 개발에 더 배울 것이 있습니다. 예를 들어, 변경 사항이 있고 서버
연결 체크박스가 선택되어 있지 않다면 적용되어야 하는 모든 업데이트가 데이터셋에 있는지 보기
위해 체크하지 않았습니다. 클라이언트 데이터셋을 비활성화하고 DataSnap 서버 연결을 끊기 전에
항상 ApplyUpdates를 호출 할 수 있습니다. 적용 할 업데이트가 없을 때 ApplyUpdates을 호출하면
서버에 아무 것도 보내자 않으며 런타임 오류가 발생합니다.
또한 델파이 및 C + + DataSnap 서버 애플리케이션 및 / 또는 DataSnap 클라이언트 애플리케이션을 모두
구축할 수 있습니다. 같은 기능을 가지고 있기 때문에, 하나의 서버와 다른 클라이언트를 사용하여
혼합하고 매치 시킬 수 있습니다.
자세한 내용을 배우려면, RadPHP를 사용하여 DataSnap 클라이언트 애플리케이션을 작성 할 수
있습니다 – 그리고 DataSnap 모바일 커넥터 기술을 사용하여 모바일 클라이언트 애플리케이션을
작성할 수 있습니다
http://docwiki.embarcadero.com/RADStudio/en/DataSnap_Connectors_for_Mobile_Devices .
DataSnap 애플리케이션을 구축하는 방법에 대한 자세한 동영상 및 기사가 있습니다:
 델파이 연습: DataSnap XE – 멀티-티어 데이터베이스 애플리케이션 -
http://edn.embarcadero.com/article/41189
 DataSnap XE2 – 새로운 기능과 개선 사항 - http://cc.embarcadero.com/Item/28542
 REST 및 모바일 DataSnap 클라이언트 개발 - http://cc.embarcadero.com/Item/28543
 DataSnap을 사용한 순수 REST 서버 작성 - http://cc.embarcadero.com/Item/28561
REST, 웹브로커 및 서비스 기반 DataSnap 서버 애플리케이션 작성
46
파이어몽키 HD, VCL 폼, 콘솔 또는 서비스 기반 DataSnap 애플리케이션 서버를 구축하는 대신에
DataSnap의 REST 서버 애플리케이션 및 DataSnap의 웹브로커 서버 애플리케이션을 작성할 수 있습니다.
이런 DataSnap 서버 애플리케이션 타입들도 또한 쉽게 작성할 수 있습니다. 하지만 “파이어몽키
시작하기” 코스 범위밖에 있습니다.
엠바카데로 DocWiki에서 DataSnap 이러한 서버의 유형을 작성하는 방법의 자세한 내용을 확인할 수
있습니다.
 DataSnap REST 애플리케이션 마법사 -
http://docwiki.embarcadero.com/RADStudio/en/DataSnap_REST_Application_Wizard
 DataSnap 웹브로커 애플리케이션 마법사 -
http://docwiki.embarcadero.com/RADStudio/en/DataSnap_WebBroker_Application_Wizard
 DataSnap 서버 마법사 -
http://docwiki.embarcadero.com/RADStudio/en/DataSnap_Server_Wizard
DataSnap 바이트 스트림 필터링
DataSnap 클라이언트와 DataSnap 서버 사이의 통신은 필터들에 의해 가로채기 될 수 있습니다.
각 필터는 암호화 및/또는 압축과 같은 바이트 스트림으로 변환을 수행 할 수 있습니다; 바이트
스트림은 하나 이상의 필터에 의해 가로채기 되고 하나의 출력은 다음 필터의 입력이 됩니다. 필터는,
DSTCPServerTransport.TDSTCPServerTransport 와 같은 DataSnap 서버 전송 컴포넌트의 Filters 속성을
설정하여, 설계 시점(또는 코드)에서 바이트 스트림에 연결됩니다.
47
필터들이 RAD Studio에 등록 된 패키지에 있다면 디자인 타임에 사용할 수 있습니다. 이 필터는
패키지에 내장되어 있어야 하며 패키지는 델파이에 설치해야 합니다. 서버 측 설계 시간 지원은 필터
목록 편집기에 필터를 표시할 수 있습니다. 클라이언트 측 설계 시간 지원은 TSQLConnection을
사용하여 디자인 타임 연결을 할 수 있습니다.
클라이언트와 서버 사이의 핸드 셰이크 프로토콜을 기반으로 자동으로 인스턴스화 되는 것처럼
클라이언트 측에서 필터를 연결할 필요가 없습니다. 따라서 클라이언트 코드가 필터링 서버에
연결하기 전에 Uses 절에 유니트 이름을 추가하여 또는 초기화 시간 등 초기 단계에 필터를 등록하는
것이 중요합니다.
48
또한 DataSnap 서버와 클라이언트를 위한 자신의 필터를 만들 수 있습니다. 해야 할일 세 가지가
있습니다: 필터를 정의하고, 필터 코드를 구현하고, 필터를 등록합니다.
필터 정의
모든 필터는 TTransportFilter 클래스에서 확장해야 하며 구현은 최소한 두 개의 메소드 ProcessInput,
ProcessOutput와 식별하는 고유한 ID를 제공해야 합니다.
public
function ProcessInput(const Data: TBytes): TBytes; override;
function ProcessOutput(const Data: TBytes): TBytes; override;
function Id: UnicodeString; override;
처리 매소드는 서로 반대입니다: 한 메소드의 결과값이 초기 입력을 생산하는 다른 메소드의 입력으로
전달됩니다.
각 연결은 필터를 인스턴스 하기 때문에 처리 함수가 스레드 안전이 필요하지 않습니다;
지역 변수는 인스턴스 변수로 사용할 수 있지만 인스턴스 전체 상태를 가정하지 않습니다.
기본으로 매개 변수가 없는 생성자는 필터 인스턴스를 인스턴스화 하는데 사용됩니다. 추가 매개
변수는 서버 인스턴스와 호환되는 클라이언트 인스턴스가 필요할 수 있습니다. 매개 변수 값은 서버
측 필터 및 클라이언트 측 필터간에 교환 할 수 있습니다. 예를 들어, 암호화 키의 위치와 함께
전달되는 경우 대칭 암호화 필터를 구현하기 위해 하나가 선택되어야 한다면 매개변수가 필요합니다.
모든 매개 변수는 쌍으로(이름, 문자열) 노출됩니다. 그들의 이름은 GetParameters 메소드를 통해 반환
할 수 있으며, 그 값은 질의되거나 GetParameterValue 및 SetParameterValue를 사용하여 변경할 수
있습니다.
protected
function GetParameters: TDBXStringArray; override;
public
function GetParameterValue(const ParamName: UnicodeString):
UnicodeString; override;
function SetParameterValue(const ParamName: UnicodeString;
const ParamValue: UnicodeString): Boolean; override;
어떤 경우에는 모든 매개 변수 또는 그 매개 변수의 일부는 디자인 타임에 변경해야 합니다, 매개변수
이름은 GetUserParameters 메소드를 통해 구합니다.
protected
function GetUserParameters: TDBXStringArray; override;
이 메소드에 의해 반환되지 않는 매개 변수 이름은 디자인 타임에 표시하거나 편집 할 수 없습니다
있습니다.
필터 코드 구현
위의 정의 된 함수를 구현하는 데 필요한 코드를 작성합니다. 예를 보실 수 있습니다.
TTransportFilter 클래스는 Data.DBXTransportFilter.pas 소스 파일에 정의되고 구현되어 있습니다.
49
세 전송 필터는 다음과 같은 소스 파일에 구현되어 있습니다:
 RSA - Data.DBXRSAFilter.pas
 Zlib Compression - Data.DbxCompressionFilter.pas
필터 등록
필터는 TTransportFilterFactory 싱글로 등록됩니다. 필터를 등록 하는 권장 방법은 유니트의 initialization
및 finalization 섹션을 통해 할 수 있지만 사용자의 애플리케이션에서 initialization절을 통해 코딩 할 수
있습니다.
아래는 사용 가능한 압축 필터를 등록하는 코드 입니다:
Initialization
TTransportFilterFactory.RegisterFilter(
TTransportCompressionFilter);
finalization
TTransportFilterFactory.UnregisterFilter(
TTransportCompressionFilter);
암호화 필터
암호화 필터는 DataSnap 바이트 스트림을 암호화하는 데 사용됩니다. 암호화 필터는 서버 측에서뿐만
아니라 클라이언트 측에서 작동합니다. 다음 줄에서 암호화 필터의 동작이 설명되어 있습니다.
서버 측:
 DSTCPServerTransport.TDSTCP ServerTransport 와 DSHTTP.TDSHTTPService 컴포넌트 모두 Filters
속성이 있습니다. 필터 속성을 선택하면 제공되는 대화 상자에 새 필터를 추가 할 수
있습니다. FilterId 속성에서 PC1 또는 RSA를 선택할 수 있습니다.
 PC1 암호화 필터를 사용하는 경우, Properties 속성은 암호화에 사용할 키 값을 가지고
있습니다.
 RSA 필터를 사용하는 경우, Properties 속성은 세 가지 속성 UseGlobalKey, KeyLength, 그리고
KeyExponent 목록을 보유하고 있습니다.
클라이언트 측:
 TSQLConnection의 Driver 속성은 Filters 속성을 가지고 있습니다.
이러한 방법으로, 실제로 클라이언트/서버를 실행할 때, 그 둘 간의 통신이 암호화 됩니다. DataSnap
클라이언트/서버 애플리케이션의 암호화 필터를 사용하는 동안 고려해야 할 몇 가지가 있습니다:
 데이터 암호화는 씬 클라이언트와 함께 사용할 수 없습니다.
 서버가 암호화 필터를 가지고 있다면 클라이언트는 없습니다. 클라이언트가 자동으로 필터를
추가합니다.
 클라이언트가 암호화 필터를 가지고 있지만 서버가 가지고 있지 않다면, 클라이언트의
필터를 버리고 사용하지 않습니다.
50
압축 필터
압축 필터는 ZLib을 기반으로 DataSnap 바이트 스트림에 대한 압축 기능을 제공합니다. 압축 필터는
서버 측과 클라이언트 측 모두에서 작동합니다.
DSTCPServerTransport.TDSTCPServerTransport 와 DSHTTP.TD SHTTPService 컴포넌트는Filters 속성을 자지고
있습니다. 새 필터를 추가하는 곳으로 FilterId 속성에 ZLibCompression을 설정합니다. 또한 Properties
속성을 설정하여 압축 필터의 속성을 지정할 수 있습니다.
델파이 연구: DataSnap 시리즈 - 에피소드 6: "DataSnap 전송 필터" 백서에서 델파이 DataSnap
애플리케이션에서 필터를 사용하는 방법을 보여줍니다. http://edn.embarcadero.com/article/41293
51
윈도우와 맥 애플리케이션에서 웹 서비스 사용하기
웹 서비스 애플리케이션은 클라이언트가 특정 플랫폼이나 프로그래밍 언어를 사용 할 필요가 없는
서버 구현입니다. 이러한 애플리케이션은 언어 중립적인 문서에 인터페이스를 정의하고 여러 통신
메커니즘을 허용합니다.
웹 서비스는 먼저 단순 개체 액세스 프로토콜(SOAP)을 사용하여 작동하도록 설계되었습니다 -
http://en.wikipedia.org/wiki/SOAP SOAP은 분산 환경에서 정보를 교환하기 위한 표준 경량
프로토콜입니다.
SOAP은 원격 프로시저 호출을 인코딩 하기 위해 XML을 사용하고 일반적으로 통신 프로토콜로 HTTP를
사용합니다.
SOAP 웹 서비스 애플리케이션은 웹 서비스 정의 언어 (WSDL)를 사용합니다, http://www.w3.org/TR/wsdl
사용할 수 있는 인터페이스와 호출하는 방법에 대한 정보를 게시하는 문서입니다. 서버 측면에서
애플리케이션은 웹 서비스를 설명하는 WSDL 문서를 게시 할 수 있습니다. 클라이언트 측에서, 마법사
또는 커맨드-라인 유틸리티는 인터페이스 정의와 필요한 연결 정보를 제공하는 WSDL 문서를 가져올
수 있습니다. 이미 구현하려는 웹 서비스를 설명하는 WSDL 문서가 있다면 WSDL 문서를 가져올 때,
서버 측 코드를 생성 할 수 있습니다.
또 다른 웹 서비스 소프트웨어 아키텍처, REST 기반 웹 서비스는 월드 와이드 웹 표준이 최근 몇 년
동안 등장했습니다. REST는 representational State Transfer의 약자로 HTTP v1.1 함께 작동하도록
만들어졌습니다. REST는 캘리포니아 대학 로이 박사의 논문, "네트워크 기반 소프트웨어 아키텍처의
디자인 및 스타일“에서 시작 되었습니다.
다음에서 로이 박사의 논문을 보실 수 있습니다http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
(Fielding, Roy Thomas. 네트워크 기반 소프트웨어 아키텍처의 디자인 및 스타일. 박사 학위 논문,
캘리포니아 대학 어바인, 2000). 논문의 제 5 장은 REST를 소개합니다 -
http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm .
Rest 제약 조건에 부합하는 것을 RESTful로 지칭합니다. RESTful 웹 서비스는 HTTP (하이퍼텍스트 전송
프로토콜)와 REST의 원칙을 사용하여 구현됩니다. REST 서버가 네 가지 종류의 요청에 대한 서비스를
제공 할 수 있다고 가정해 보겠습니다: GET, POST, PUT, 및 DELETE. 이러한 작업들은 검색, 업데이트,
삽입 및 데이터 작업 삭제를 나타냅니다. 이러한 작업들은 매핑 프로토콜을 통해 서버 메소드로
동화되어 있습니다. REST는 각 서버 메소드가 URI (동일한 리소스 식별자) 경로, 메소드 이름 및
매개변수 사이의 매핑을 취하는 디스패치 메커니즘을 통해 위의 작업 중 하나로 호출될 수 있다고
가정합니다.
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포
멀티티어 애플리케이션 개발과 배포

More Related Content

What's hot

[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder
[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder
[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++BuilderDevgear
 
델파이 upgrade를 검토할 이유
델파이 upgrade를 검토할 이유델파이 upgrade를 검토할 이유
델파이 upgrade를 검토할 이유Devgear
 
OCE - Cno 2014 private sector oriented open paas oce
OCE - Cno 2014 private sector oriented open paas   oceOCE - Cno 2014 private sector oriented open paas   oce
OCE - Cno 2014 private sector oriented open paas oceuEngine Solutions
 
[오픈소스컨설팅]오픈소스 클라우드 개발플랫폼_및_Docker의_이해_v1
[오픈소스컨설팅]오픈소스 클라우드 개발플랫폼_및_Docker의_이해_v1[오픈소스컨설팅]오픈소스 클라우드 개발플랫폼_및_Docker의_이해_v1
[오픈소스컨설팅]오픈소스 클라우드 개발플랫폼_및_Docker의_이해_v1Ji-Woong Choi
 
RAD Studio 10.2 도쿄
RAD Studio 10.2 도쿄RAD Studio 10.2 도쿄
RAD Studio 10.2 도쿄Devgear
 
20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio
20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio
20170623 최신OS와 멀티플랫폼 개발 전략 with RAD StudioDevgear
 
Paas 발표 ksug_20131013
Paas 발표 ksug_20131013Paas 발표 ksug_20131013
Paas 발표 ksug_20131013Byung Hyun Ahn
 
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석Tommy Lee
 
Cloud life seminar open shift,이준영(배포용)
Cloud life seminar   open shift,이준영(배포용)Cloud life seminar   open shift,이준영(배포용)
Cloud life seminar open shift,이준영(배포용)Software in Life
 
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기Nanha Park
 
오픈소스 기반의 레드햇 클라우드 플랫폼 RhCI & Docker with PaaS
오픈소스 기반의 레드햇 클라우드 플랫폼   RhCI & Docker with PaaS오픈소스 기반의 레드햇 클라우드 플랫폼   RhCI & Docker with PaaS
오픈소스 기반의 레드햇 클라우드 플랫폼 RhCI & Docker with PaaSHojoong Kim
 

What's hot (11)

[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder
[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder
[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder
 
델파이 upgrade를 검토할 이유
델파이 upgrade를 검토할 이유델파이 upgrade를 검토할 이유
델파이 upgrade를 검토할 이유
 
OCE - Cno 2014 private sector oriented open paas oce
OCE - Cno 2014 private sector oriented open paas   oceOCE - Cno 2014 private sector oriented open paas   oce
OCE - Cno 2014 private sector oriented open paas oce
 
[오픈소스컨설팅]오픈소스 클라우드 개발플랫폼_및_Docker의_이해_v1
[오픈소스컨설팅]오픈소스 클라우드 개발플랫폼_및_Docker의_이해_v1[오픈소스컨설팅]오픈소스 클라우드 개발플랫폼_및_Docker의_이해_v1
[오픈소스컨설팅]오픈소스 클라우드 개발플랫폼_및_Docker의_이해_v1
 
RAD Studio 10.2 도쿄
RAD Studio 10.2 도쿄RAD Studio 10.2 도쿄
RAD Studio 10.2 도쿄
 
20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio
20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio
20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio
 
Paas 발표 ksug_20131013
Paas 발표 ksug_20131013Paas 발표 ksug_20131013
Paas 발표 ksug_20131013
 
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
 
Cloud life seminar open shift,이준영(배포용)
Cloud life seminar   open shift,이준영(배포용)Cloud life seminar   open shift,이준영(배포용)
Cloud life seminar open shift,이준영(배포용)
 
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
 
오픈소스 기반의 레드햇 클라우드 플랫폼 RhCI & Docker with PaaS
오픈소스 기반의 레드햇 클라우드 플랫폼   RhCI & Docker with PaaS오픈소스 기반의 레드햇 클라우드 플랫폼   RhCI & Docker with PaaS
오픈소스 기반의 레드햇 클라우드 플랫폼 RhCI & Docker with PaaS
 

Similar to 멀티티어 애플리케이션 개발과 배포

손쉬운 데이터 연결 방법(라이브바인딩 활용)
손쉬운 데이터 연결 방법(라이브바인딩 활용)손쉬운 데이터 연결 방법(라이브바인딩 활용)
손쉬운 데이터 연결 방법(라이브바인딩 활용)Devgear
 
Androidpn guide-0.5.0-ko
Androidpn guide-0.5.0-koAndroidpn guide-0.5.0-ko
Androidpn guide-0.5.0-kosandeepreddyp42
 
Microsoft azure service 소개자료
Microsoft azure service 소개자료Microsoft azure service 소개자료
Microsoft azure service 소개자료Alvin You
 
Infra as Code with Packer, Ansible and Terraform
Infra as Code with Packer, Ansible and TerraformInfra as Code with Packer, Ansible and Terraform
Infra as Code with Packer, Ansible and TerraformInho Kang
 
마이크로소프트웨어2014년1월 s dx_ian
마이크로소프트웨어2014년1월 s dx_ian마이크로소프트웨어2014년1월 s dx_ian
마이크로소프트웨어2014년1월 s dx_ianIan Choi
 
Cloud Computing v1.0
Cloud Computing v1.0Cloud Computing v1.0
Cloud Computing v1.0Steve Min
 
윈도우 파일서버기반 문서중앙화 솔루션
윈도우 파일서버기반 문서중앙화 솔루션윈도우 파일서버기반 문서중앙화 솔루션
윈도우 파일서버기반 문서중앙화 솔루션시온시큐리티
 
Intro to hpe helion stackato_paa_s
Intro to hpe helion stackato_paa_sIntro to hpe helion stackato_paa_s
Intro to hpe helion stackato_paa_sSeong-Bok Lee
 
Introduction of Mesosphere DCOS
Introduction of Mesosphere DCOSIntroduction of Mesosphere DCOS
Introduction of Mesosphere DCOSDeughyeon Chang
 
Meetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsMeetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsminseok kim
 
웹 2.0 기술 소개 (2006)
웹 2.0 기술 소개 (2006)웹 2.0 기술 소개 (2006)
웹 2.0 기술 소개 (2006)Channy Yun
 
Richslide for enterprise
Richslide for enterpriseRichslide for enterprise
Richslide for enterpriseJun Gyun Bae
 
The Future of .NET and C#
The Future of .NET and C#The Future of .NET and C#
The Future of .NET and C#명신 김
 
Ko.xenapp xendesktop-75.cds-75-about-whats-new[1]
Ko.xenapp xendesktop-75.cds-75-about-whats-new[1]Ko.xenapp xendesktop-75.cds-75-about-whats-new[1]
Ko.xenapp xendesktop-75.cds-75-about-whats-new[1]정호 최
 
Tus Kan Professional Server
Tus Kan Professional ServerTus Kan Professional Server
Tus Kan Professional Server춘성 이
 
사물인터넷서비스와 클라우드
사물인터넷서비스와 클라우드사물인터넷서비스와 클라우드
사물인터넷서비스와 클라우드봉조 김
 
JMI Techtalk : Backend.AI
JMI Techtalk : Backend.AIJMI Techtalk : Backend.AI
JMI Techtalk : Backend.AILablup Inc.
 

Similar to 멀티티어 애플리케이션 개발과 배포 (20)

손쉬운 데이터 연결 방법(라이브바인딩 활용)
손쉬운 데이터 연결 방법(라이브바인딩 활용)손쉬운 데이터 연결 방법(라이브바인딩 활용)
손쉬운 데이터 연결 방법(라이브바인딩 활용)
 
Androidpn guide-0.5.0-ko
Androidpn guide-0.5.0-koAndroidpn guide-0.5.0-ko
Androidpn guide-0.5.0-ko
 
멀티·하이브리드 클라우드 구축 전략 - 네이버비즈니스플랫폼 박기은 CTO
멀티·하이브리드 클라우드 구축 전략 - 네이버비즈니스플랫폼 박기은 CTO멀티·하이브리드 클라우드 구축 전략 - 네이버비즈니스플랫폼 박기은 CTO
멀티·하이브리드 클라우드 구축 전략 - 네이버비즈니스플랫폼 박기은 CTO
 
병렬처리
병렬처리병렬처리
병렬처리
 
Microsoft azure service 소개자료
Microsoft azure service 소개자료Microsoft azure service 소개자료
Microsoft azure service 소개자료
 
Infra as Code with Packer, Ansible and Terraform
Infra as Code with Packer, Ansible and TerraformInfra as Code with Packer, Ansible and Terraform
Infra as Code with Packer, Ansible and Terraform
 
마이크로소프트웨어2014년1월 s dx_ian
마이크로소프트웨어2014년1월 s dx_ian마이크로소프트웨어2014년1월 s dx_ian
마이크로소프트웨어2014년1월 s dx_ian
 
Cloud Computing v1.0
Cloud Computing v1.0Cloud Computing v1.0
Cloud Computing v1.0
 
윈도우 파일서버기반 문서중앙화 솔루션
윈도우 파일서버기반 문서중앙화 솔루션윈도우 파일서버기반 문서중앙화 솔루션
윈도우 파일서버기반 문서중앙화 솔루션
 
Intro to hpe helion stackato_paa_s
Intro to hpe helion stackato_paa_sIntro to hpe helion stackato_paa_s
Intro to hpe helion stackato_paa_s
 
Introduction of Mesosphere DCOS
Introduction of Mesosphere DCOSIntroduction of Mesosphere DCOS
Introduction of Mesosphere DCOS
 
Meetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsMeetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vs
 
웹 2.0 기술 소개 (2006)
웹 2.0 기술 소개 (2006)웹 2.0 기술 소개 (2006)
웹 2.0 기술 소개 (2006)
 
개발자를 위한 네이버 클라우드 플랫폼ㅣNAVER CLOUD PLATFORM for Developers
개발자를 위한 네이버 클라우드 플랫폼ㅣNAVER CLOUD PLATFORM for Developers 개발자를 위한 네이버 클라우드 플랫폼ㅣNAVER CLOUD PLATFORM for Developers
개발자를 위한 네이버 클라우드 플랫폼ㅣNAVER CLOUD PLATFORM for Developers
 
Richslide for enterprise
Richslide for enterpriseRichslide for enterprise
Richslide for enterprise
 
The Future of .NET and C#
The Future of .NET and C#The Future of .NET and C#
The Future of .NET and C#
 
Ko.xenapp xendesktop-75.cds-75-about-whats-new[1]
Ko.xenapp xendesktop-75.cds-75-about-whats-new[1]Ko.xenapp xendesktop-75.cds-75-about-whats-new[1]
Ko.xenapp xendesktop-75.cds-75-about-whats-new[1]
 
Tus Kan Professional Server
Tus Kan Professional ServerTus Kan Professional Server
Tus Kan Professional Server
 
사물인터넷서비스와 클라우드
사물인터넷서비스와 클라우드사물인터넷서비스와 클라우드
사물인터넷서비스와 클라우드
 
JMI Techtalk : Backend.AI
JMI Techtalk : Backend.AIJMI Techtalk : Backend.AI
JMI Techtalk : Backend.AI
 

More from Devgear

[델파이 Begin...End] 0장. 책 소개/저자 소개/목차
[델파이 Begin...End] 0장. 책 소개/저자 소개/목차[델파이 Begin...End] 0장. 책 소개/저자 소개/목차
[델파이 Begin...End] 0장. 책 소개/저자 소개/목차Devgear
 
RAD스튜디오를 활용한 장비 연동 시스템 구축방안
RAD스튜디오를 활용한 장비 연동 시스템 구축방안 RAD스튜디오를 활용한 장비 연동 시스템 구축방안
RAD스튜디오를 활용한 장비 연동 시스템 구축방안 Devgear
 
RAD스튜디오를 활용한 헬스 케어 시스템 구축방안
RAD스튜디오를 활용한 헬스 케어 시스템 구축방안 RAD스튜디오를 활용한 헬스 케어 시스템 구축방안
RAD스튜디오를 활용한 헬스 케어 시스템 구축방안 Devgear
 
RAD스튜디오 100% 활용하기
RAD스튜디오 100% 활용하기 RAD스튜디오 100% 활용하기
RAD스튜디오 100% 활용하기 Devgear
 
RAD스튜디오 100% 활용하기 - 최신 기술 적용과 확장
RAD스튜디오 100% 활용하기 - 최신 기술 적용과 확장RAD스튜디오 100% 활용하기 - 최신 기술 적용과 확장
RAD스튜디오 100% 활용하기 - 최신 기술 적용과 확장Devgear
 
델파이 @22
델파이 @22델파이 @22
델파이 @22Devgear
 
델파이 DB프로그래밍(멀티티어) - 체크리스트
델파이 DB프로그래밍(멀티티어) - 체크리스트델파이 DB프로그래밍(멀티티어) - 체크리스트
델파이 DB프로그래밍(멀티티어) - 체크리스트Devgear
 
델파이 DB프로그래밍(2티어) - 체크리스트
델파이 DB프로그래밍(2티어) - 체크리스트델파이 DB프로그래밍(2티어) - 체크리스트
델파이 DB프로그래밍(2티어) - 체크리스트Devgear
 
델파이 기초 - 체크리스트
델파이 기초 - 체크리스트델파이 기초 - 체크리스트
델파이 기초 - 체크리스트Devgear
 
델파이 윈도우 애플리케이션 개발 - 체크리스트
델파이 윈도우 애플리케이션 개발 - 체크리스트델파이 윈도우 애플리케이션 개발 - 체크리스트
델파이 윈도우 애플리케이션 개발 - 체크리스트Devgear
 
델파이로 한 번에 개발하는 안드로이드&iOS - 체크리스트
델파이로 한 번에 개발하는 안드로이드&iOS - 체크리스트델파이로 한 번에 개발하는 안드로이드&iOS - 체크리스트
델파이로 한 번에 개발하는 안드로이드&iOS - 체크리스트Devgear
 
ELC(Embarcadero License Center) 서버 설치가이드
ELC(Embarcadero License Center) 서버 설치가이드ELC(Embarcadero License Center) 서버 설치가이드
ELC(Embarcadero License Center) 서버 설치가이드Devgear
 
델파이로 개발한 iOS 앱 앱스토어 배포 방법(Apple App Store)
델파이로 개발한 iOS 앱 앱스토어 배포 방법(Apple App Store)델파이로 개발한 iOS 앱 앱스토어 배포 방법(Apple App Store)
델파이로 개발한 iOS 앱 앱스토어 배포 방법(Apple App Store)Devgear
 
델파이로 개발한 안드로이드 앱 앱스토어 배포 방법(google play)
델파이로 개발한 안드로이드 앱 앱스토어 배포 방법(google play)델파이로 개발한 안드로이드 앱 앱스토어 배포 방법(google play)
델파이로 개발한 안드로이드 앱 앱스토어 배포 방법(google play)Devgear
 
델파이 무료 평가판 설치
델파이 무료 평가판 설치델파이 무료 평가판 설치
델파이 무료 평가판 설치Devgear
 
델파이 iOS앱 개발 환경 설정
델파이 iOS앱 개발 환경 설정델파이 iOS앱 개발 환경 설정
델파이 iOS앱 개발 환경 설정Devgear
 
델파이 안드로이드앱 개발 환경 설정
델파이 안드로이드앱 개발 환경 설정델파이 안드로이드앱 개발 환경 설정
델파이 안드로이드앱 개발 환경 설정Devgear
 
델파이,C++빌더: 물류 시스템 개발 전문가를 위한 시장현황과 전략
델파이,C++빌더: 물류 시스템 개발 전문가를 위한 시장현황과 전략델파이,C++빌더: 물류 시스템 개발 전문가를 위한 시장현황과 전략
델파이,C++빌더: 물류 시스템 개발 전문가를 위한 시장현황과 전략Devgear
 
델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략
델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략
델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략Devgear
 
전사 데이터 관리 반드시 피해야 할 7가지 실수
전사 데이터 관리 반드시 피해야 할 7가지 실수전사 데이터 관리 반드시 피해야 할 7가지 실수
전사 데이터 관리 반드시 피해야 할 7가지 실수Devgear
 

More from Devgear (20)

[델파이 Begin...End] 0장. 책 소개/저자 소개/목차
[델파이 Begin...End] 0장. 책 소개/저자 소개/목차[델파이 Begin...End] 0장. 책 소개/저자 소개/목차
[델파이 Begin...End] 0장. 책 소개/저자 소개/목차
 
RAD스튜디오를 활용한 장비 연동 시스템 구축방안
RAD스튜디오를 활용한 장비 연동 시스템 구축방안 RAD스튜디오를 활용한 장비 연동 시스템 구축방안
RAD스튜디오를 활용한 장비 연동 시스템 구축방안
 
RAD스튜디오를 활용한 헬스 케어 시스템 구축방안
RAD스튜디오를 활용한 헬스 케어 시스템 구축방안 RAD스튜디오를 활용한 헬스 케어 시스템 구축방안
RAD스튜디오를 활용한 헬스 케어 시스템 구축방안
 
RAD스튜디오 100% 활용하기
RAD스튜디오 100% 활용하기 RAD스튜디오 100% 활용하기
RAD스튜디오 100% 활용하기
 
RAD스튜디오 100% 활용하기 - 최신 기술 적용과 확장
RAD스튜디오 100% 활용하기 - 최신 기술 적용과 확장RAD스튜디오 100% 활용하기 - 최신 기술 적용과 확장
RAD스튜디오 100% 활용하기 - 최신 기술 적용과 확장
 
델파이 @22
델파이 @22델파이 @22
델파이 @22
 
델파이 DB프로그래밍(멀티티어) - 체크리스트
델파이 DB프로그래밍(멀티티어) - 체크리스트델파이 DB프로그래밍(멀티티어) - 체크리스트
델파이 DB프로그래밍(멀티티어) - 체크리스트
 
델파이 DB프로그래밍(2티어) - 체크리스트
델파이 DB프로그래밍(2티어) - 체크리스트델파이 DB프로그래밍(2티어) - 체크리스트
델파이 DB프로그래밍(2티어) - 체크리스트
 
델파이 기초 - 체크리스트
델파이 기초 - 체크리스트델파이 기초 - 체크리스트
델파이 기초 - 체크리스트
 
델파이 윈도우 애플리케이션 개발 - 체크리스트
델파이 윈도우 애플리케이션 개발 - 체크리스트델파이 윈도우 애플리케이션 개발 - 체크리스트
델파이 윈도우 애플리케이션 개발 - 체크리스트
 
델파이로 한 번에 개발하는 안드로이드&iOS - 체크리스트
델파이로 한 번에 개발하는 안드로이드&iOS - 체크리스트델파이로 한 번에 개발하는 안드로이드&iOS - 체크리스트
델파이로 한 번에 개발하는 안드로이드&iOS - 체크리스트
 
ELC(Embarcadero License Center) 서버 설치가이드
ELC(Embarcadero License Center) 서버 설치가이드ELC(Embarcadero License Center) 서버 설치가이드
ELC(Embarcadero License Center) 서버 설치가이드
 
델파이로 개발한 iOS 앱 앱스토어 배포 방법(Apple App Store)
델파이로 개발한 iOS 앱 앱스토어 배포 방법(Apple App Store)델파이로 개발한 iOS 앱 앱스토어 배포 방법(Apple App Store)
델파이로 개발한 iOS 앱 앱스토어 배포 방법(Apple App Store)
 
델파이로 개발한 안드로이드 앱 앱스토어 배포 방법(google play)
델파이로 개발한 안드로이드 앱 앱스토어 배포 방법(google play)델파이로 개발한 안드로이드 앱 앱스토어 배포 방법(google play)
델파이로 개발한 안드로이드 앱 앱스토어 배포 방법(google play)
 
델파이 무료 평가판 설치
델파이 무료 평가판 설치델파이 무료 평가판 설치
델파이 무료 평가판 설치
 
델파이 iOS앱 개발 환경 설정
델파이 iOS앱 개발 환경 설정델파이 iOS앱 개발 환경 설정
델파이 iOS앱 개발 환경 설정
 
델파이 안드로이드앱 개발 환경 설정
델파이 안드로이드앱 개발 환경 설정델파이 안드로이드앱 개발 환경 설정
델파이 안드로이드앱 개발 환경 설정
 
델파이,C++빌더: 물류 시스템 개발 전문가를 위한 시장현황과 전략
델파이,C++빌더: 물류 시스템 개발 전문가를 위한 시장현황과 전략델파이,C++빌더: 물류 시스템 개발 전문가를 위한 시장현황과 전략
델파이,C++빌더: 물류 시스템 개발 전문가를 위한 시장현황과 전략
 
델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략
델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략
델파이,C++빌더: 의료 시스템 개발 전문가를 위한 시장현황과 전략
 
전사 데이터 관리 반드시 피해야 할 7가지 실수
전사 데이터 관리 반드시 피해야 할 7가지 실수전사 데이터 관리 반드시 피해야 할 7가지 실수
전사 데이터 관리 반드시 피해야 할 7가지 실수
 

멀티티어 애플리케이션 개발과 배포

  • 1. 1 9장 –멀티-클라이언트/멀티-플랫폼/ 멀티-티어 애플리케이션 구축 멀티-티어 애플리케이션 작성 ................................................................................................................................3 DataSnap 애플리케이션 배포................................................................................................................................8 윈도우와 맥 멀티-티어 데이터베이스 애플리케이션 작성 REST, 웹브로커 및 서비스 기반 DataSnap 서버 애플리케이션 작성 DataSnap 바이트 스트림 필터링 윈도우와 맥 애플리케이션에서 웹 서비스 사용하기 ........................................................................................51 웹 서비스 애플리케이션과 서비스를 사용하는 윈도우 및 맥 클라이언트 애플리케이션 작성 윈도우 및 맥 애플리케이션에서 클라우드 스토리지와 서비스 사용하기 ......................................................67 RAD Studio 클라우드 서비스 애저 클라우드 서비스 아마존 클라우드 서비스 첫 번째 클라우드 기반 윈도우 및 맥 애플리케이션을 구축 애플리케이션을 클라우드에 배포 요약, 전망, 해야 할 일, 참고자료 .......................................................................................................................70
  • 2. 2 소개 모든 애플리케이션이 단 하나의 플랫폼에서만 실행되는 독립 실행 형 데스크톱 애플리케이션은 아닙니다. 종종 소프트웨어 시스템은 원격 데이터베이스와 원격 비즈니스 오브젝트를 사용하는 클라이언트 애플리케이션들을 포합합니다. 윈도우 및 맥 용 멀티 클라이언트, 멀티 플랫폼, 멀티- 티어 애플리케이션을 구축해야 할 때가 있을 것입니다. 이전 장에서 보았듯이 HD 및 3D 사용자 인터페이스로 데이터베이스에 연결하는 윈도우, 맥 용 멀티 플랫폼 애플리케이션을 작성할 수 있습니다. 원격 비즈니스 오브젝트 및 서비스를 작성하거나 연결하려면 어떻게 해야 합니까? RAD Studio는 멀티 클라이언트, 멀티 플랫폼 및 멀티-티어 애플리케이션 작성을 지원합니다. RAD Studio는 멀티 클라이언트, 멀티 플랫폼 및 멀티-티어 애플리케이션의 작성을 지원하는 다음과 같은 기술 및 컴포넌트를 포함합니다:  파이어몽키 HD 및 3D 클라이언트 애플리케이션 – 윈도우32, 윈도우64 , 맥 OSX  델파이와 C++ 클라이언트 애플리케이션  VCL 클라이언트 애플리케이션 - 윈도우32, 윈도우64  콘솔 클라이언트 애플리케이션 – 윈도우32, 윈도우64 , 맥 OSX  웹 서비스 클라이언트 액세스 – 윈도우32, 윈도우64 , 맥 OSX  클라우드 저장 클라이언트 애플리케이션 액세스 – 아마존 S3 와 마이크로 소프트 윈도우 애저 DataSnap 클라이언트 애플리케이션 액세스 – 윈도우32, 윈도우64 , 맥 OSX  DataSnap 애플리케이션 서버 – VCL, 파이어몽키, 콘솔 애플리케이션, 서비스 애플리케이션- 윈도우32, 윈도우64  웹 애플리케이션 서버 – 윈도우32 , 윈도우64  윈도우64  웹 서비스 - 윈도우32 및 윈도우64 9 장에서는 파이어몽키, DataSnap, 웹 서비스 및 클라우드 스토리지를 사용하는 멀티 클라이언트, 멀티 플랫폼, 멀티-티어 애플리케이션 구축에 주력합니다.
  • 3. 3 멀티-티어 애플리케이션 작성 멀티-티어 애플리케이션은 별도의 컴퓨터에서 실행하는, 티어 라고 불리는 논리적 단위로 분리됩니다. 로컬 영역 네트워크를 통해 또는 인터넷을 통해 멀티-티어 애플리케이션들은 서로 데이터를 공유하고 통신합니다. 중앙 집중화 된 비즈니스 로직과 가벼운 클라이언트 애플리케이션등과 같은 멀티-티어 데이터베이스 모델의 많은 장점을 제공합니다. 때때로 "3-티어 모델"라고 부르는 멀티-티어 애플리케이션은 가장 간단한 형태로 세 부분으로 나뉘어집니다.  클라이언트 애플리케이션: 사용자 컴퓨터에 사용자 인터페이스를 제공합니다.  애플리케이션 서버: 모든 클라이언트에서 액세스 할 수 있도록 중앙 네트워크 위치에 상주하고 있으며 일반적인 데이터 서비스를 제공합니다.  원격 데이터베이스 서버: 관계 형 데이터베이스 관리 시스템 제공합니다(RDBMS). 3-티어 모델에서는 애플리케이션 서버는 클라이언트와 원격 데이터베이스 서버 사이에서 데이터의 흐름을 관리하므로 종종 "데이터 브로커"라고 부릅니다. 보통은 애플리케이션 서버 및 클라이언트만을 생성하지만 필요하다면, 데이터베이스 백 엔드를 만들 수 있습니다. 더 복잡한 멀티-티어 애플리케이션이라면 추가 서비스가 클라이언트와 원격 데이터베이스 서버 사이에 있을 수 있습니다. 예를 들어, 인터넷 트랜잭션 보안을 처리하기 위한 보안 서비스 브로커 또는 다른 플랫폼에서 데이터베이스와의 데이터 공유를 처리하는 브릿지 서비스가 있을 수 있습니다. 멀티-티어 애플리케이션 개발은 클라이언트 데이터 셋이 전송 가능한 데이터 패킷으로 프로바이더 컴포넌트와 통신하는 방식의 확장 기능을 사용합니다. 3-티어 애플리케이션을 작성하고 관리하는 방법을 이해한다면, 프로그램을 작성한 다음 필요에 따라 추가 서비스를 추가 할 수 있습니다. 멀티-티어 모델의 장점은 다음과 같습니다:  중간 계층에 캡슐화된 비즈니스 로직 공유 - 다른 클라이언트 프로그램 모두가 같은 중간 계층을 액세스하여 각 개별 클라이언트 프로그램에 필요한 비즈니스 로직의 중복(및 유지 보수 비용)을 피할 수 있습니다.  가벼운 클라이언트 애플리케이션 - 중간 계층에 더 많은 처리를 하게함으로써 클라이언트 프로그램은 가볍게 작성할 수 있습니다. 클라이언트 프로그램이 작아지는 것뿐만 아니라, 데이터베이스 연결을 위한 소프트웨어의 설치, 구성 및 관리에 대해 걱정할 필요가 없기 때문에 배포가 더 용이합니다(데이터베이스 서버의 클라이언트 측 소프트웨어와 같이). 가벼운 클라이언트 애플리케이션은 추가적인 유연성을 위해 인터넷을 통해 배포 할 수 있습니다.  분산 데이터 프로세스 - 여러 대의 컴퓨터에 애플리케이션을 배포하여 로드 밸런싱 성능을 향상시키고 서버가 다운 될 때 다른 컴퓨터에서 중복 시스템을 대신 할 수 있습니다.  향상된 보안 - 다른 액세스 권한을 갖는 계층에 기능을 분리 할 수 있습니다. 이렇게 하면 비즈니스 로직을 유연하게 구성할 수 있습니다. 서버에 있는 서비스 중에서 민감한 자료에 대해서는 특정 권한을 갖는 사용자만 접근할 수 있도록 제한 할 수 있습니다. HTTPS를 사용한다면, 지원하는 보안 모델을 이용할 수 있습니다.
  • 4. 4 멀티-티어 애플리케이션은 툴 팔레트의 DataSnap 페이지, 데이터 액세스 페이지 및 웹 서비스 페이지에 있는 컴포넌트뿐만 아니라 New Item 대화상자의 Multitier 또는 웹 서비스 페이지 마법사에서 생성한 리모트 데이터 모듈을 사용합니다. 컴포넌트들은 전송 할 수 있는 데이터를 패킷으로 패킹하고 델타 패킷으로 받은 업데이트를 처리하는 프로바이더 컴포넌트의 기능을 기반으로 합니다. 멀티-티어 애플리케이션에 필요한 컴포넌트는 다음과 같습니다:  리모트 데이터 모듈 및 서버 데이터 모듈 - COM 자동화 서버, DataSnap 데이터 모듈, RESTful 웹 서버의 역할을 하거나 모든 공급자에게 클라이언트 프로그램을 액세스 권한을 부여 할 수 있는 웹 서비스를 구현할 수 있습니다. 애플리케이션 서버에서 사용됩니다.  프로바이더 컴포넌트 - 데이터 패킷을 생성하여 클라이언트 측에 데이터를 제공하고 클라이언트에서 요청한 업데이트를 처리하는 데이터 브로커. 애플리케이션 서버에 사용됩니다.  클라이언트 데이터셋 컴포넌트 - 데이터를 관리하기 위해 사용된 특수화된 데이터셋은 데이터 패킷으로 저장됩니다. 클라이언트 데이터셋은 클라이언트 애플리케이션에서 사용됩니다. 로컬에서 발생한 업데이트를 캐시에 저장하고, 서버 애플리케이션 측에 델타 패킷으로 보냅니다.  커넥션 컴포넌트들 – 서버에 위치하는 연결 컴포넌트들로 클라이언트 데이터셋에 사용할 수 있는 IAppServer인터페이스로 구성됩니다. 각 연결 컴포넌트는 특정 통신 프로토콜을 사용하도록 특화되어 있습니다. 프로바이더 및 클라이언트 데이터셋 컴포넌트를 사용하려면 데이터 패킷으로 저장된 데이터셋을 관리하는 midas.dll 또는 midaslib.dcu가 필요합니다. 프로바이더와 클라이언트 데이터셋을 서버 프로그램과 클라이언트에서 사용되기 때문에, midas.dll를 서버 프로그램 및 클라이언트 프로그램 모두에 배포해야 합니다. 배포에 대한 추가 중요한 정보는 설치 디렉터리에 있는 deploy.htm 파일을 참조하십시오.
  • 5. 5 RAD Studio 배포 대상 플랫폼 RAD Studio는 다음과 같은 배포 대상 플랫폼 및 관련 프레임 워크를 지원합니다:  맥 OS X 는 파이어몽키 개발만을 지원합니다.  32-bit 윈도우는 파이어몽키 및 VCL 개발을 지원합니다.  64-bit 윈도우는 파이어몽키 및 VCL 개발을 지원합니다 프로젝트 매니저의 타깃 노드를 선택하여 애플리케이션의 타깃 플랫폼을 지정합니다. 다른 멀티 플랫폼 개발 지원이 포함되어 있습니다.  iOS 디바이스를 위한 파이어몽키 애플리케이션 개발은 아이폰, 아이 패드, 아이팟을 지원됩니다. 그러나, FMX iOS는 기술적으로 IDE에서 선택할 수 있는 타깃 플랫폼은 아닙니다.  DataSnap는 제공하는 특별한 DataSnap 커넥터를 사용하여 모바일 장치를 위한 네이티브-언어 개발을 지원합니다(이 과정의 뒤에 나오는 모바일 커넥터를 사용합니다 - 모바일 장치를 지원해야 할 경우 이 강의의 끝 부분에 있는 기사와 동영상 링크를 참조하십시오): o 오브젝트- C iOS DataSnap 프록시를 사용하는 iOS 디바이스 o 프리 파스칼 DataSnap 프록시를 사용하는 iOS 디바이스 o C # 실버라이트 DataSnap 프록시를 사용하는 윈도우 7 폰 o 자바 안드로이드 DataSnap 프록시를 사용하는 안드로이드 o 자바 블랙베리 DataSnap 프록시를 사용하는 블랙베리 엠바카데로 DocWiki에 작성 할 수 있는 멀티 플랫폼 애플리케이션 타입이 요약 되어 있습니다. http://docwiki.embarcadero.com/RADStudio/en/Types_of_Cross-Platform_Applications_You _Can_Create WebSnap을 사용한 웹 애플리케이션 구축에 대한 자세한 내용은 엠바카데로 DocWiki의 문서를 참조하십시오. http://docwiki.embarcadero.com/RADStudio/en/Developing_Web _Applications_with_WebSnap. 멀티 클라이언트, 멀티 플랫폼, 멀티-티어 애플리케이션 디버깅 통합 RAD Studio 디버그는 지원되는 타깃 플랫폼 중 하나를 대상으로 하는 애플리케이션을 디버깅 할 수 있습니다. 통합 디버그는 델파이와 C + + 애플리케이션 모두에서 사용할 수 있습니다.  엠바카데로 윈도우64 디버그(64 –비트 윈도우 OS가 실행하고 있는 컴퓨터에서)  엠바카데로 OS X 디버그 (OS X 버전이 실행하고 있는 맥에서) 배포 대상 플랫폼에 플랫폼 어시스턴트를 설치하면 크로스 플랫폼 디버그 또한 설치됩니다. 시스템에 등록 된 디버그는 Tools > Options >Debugger Options에 표시됩니다.
  • 6. 6 플랫폼 어시스턴트 및 원격 프로파일은 크로스 플랫폼 대상 시스템에서 실행중인 애플리케이션에 대한 디버그 세션을 구축합니다. 플랫폼 어시스턴트를 필요로 하지 않는 유일한 크로스 플랫폼 구성은 윈도우32 개발 시스템입니다. 크로스 플랫폼 디버그와 프로세스는 배포 대상 플랫폼에서 실행 파일을 디버깅 할 수 있습니다. 크로스 플랫폼 디버그는 상태를 보고하고 RAD 스튜디오 IDE에서 개발 PC와 함께 상호 작용합니다. 크로스 플랫폼 디버그 중 하나를 사용하는 것은 윈도우32 애플리케이션을 위해 통합 디버그를 사용하는 것과 매우 유사합니다. 크로스 플랫폼 디버깅을 하기 위해:  애플리케이션은 활성화된 타깃 플랫폼이 있어야 합니다(윈도우64, OS X, 또는 원격 윈도우32).  타깃 플랫폼에 따라: o 맥 OS X:  플랫폼 어시스턴트는 맥에서 실행되고 있어야 합니다.  애플리케이션에 할당 된 원격 프로필이 있어야 합니다.  개발 시스템은 맥에 라이브로 연결되어 있어야 합니다(즉, 원격 프로파일 창에 테스트 연결이 성공해야 합니다). 이것은 통합 디버그 및 배포 관리자를 모두 사용할 수 있습니다. o 64-비트 윈도우:  원격 64 비트 PC에 연결하는 경우:  플랫폼 어시스턴트 및 원격 프로파일을 사용합니다.  개발 시스템은 원격 64 비트 PC에 라이브로 연결되어 있어야 합니다 (즉, 원격 프로파일 창에 테스트 연결이 성공해야 합니다). 이것은 통합 디버그 및 배포 관리자를 모두 사용할 수 있습니다.  개발 시스템이 64 비트 윈도우 운영 체제를 실행하는 PC 인 경우:
  • 7. 7  귀하의 디버그 환경은 기계에 포함되어 있기 때문에 플랫폼 어시스턴스를 사용할 필요가 없습니다. 그리고 통합 디버그가 자동으로 실행됩니다.  그러나, 옵션으로 플랫폼 어시스턴스 및 64 비트 윈도우 타깃 시스템에 대한 것처럼 배포 대상 플랫폼에 대한 원격 프로필을 사용하도록 선택할 수 있습니다. 이렇게 하면 배포 관리자를 사용 할 수 있습니다. OS X에서 디버깅 하는 것은 권한 작업이며 적절한 액세스 권한을 갖는 프로세스만 디버그 할 수 있습니다. 맥에서 디버깅에 대한 지원을 받기 위해, 관리자 또는 루트 사용자 암호를 사용하여 개발자 도구 액세스 대화 상자에서 로그인 해야 합니다. 세션에서 플랫폼 어시스턴스를 처음으로 시작할 때(또는 맥에서 디버깅 세션을 시작할 때), 맥 개발자 도구 액세스 로그인 대화 상자를 표시합니다. 맥에서 루트 사용자 암호를 제공해야 합니다. 패스워드는 세션 당 한 번만 필요합니다.
  • 8. 8 DataSnap 애플리케이션 배포 DataSnap 기술은 분산 컴퓨팅 증가에 대한 요구로 발전을 계속하고 있습니다. DataSnap의 숨은 기술은 TCP / IP를 기반으로 보다 개방 된 커뮤니케이션 방식에 마이크로 소프트 COM / DCOM을 통해 원격 데이터에 접근합니다. 완벽한 미들웨어 기술을 포함하기 위해 DataSnap 기술 기능을 확장할 수 있습니다. 기술의 주요 기능 중 하나는 속도가 빠르다는 것입니다: 제품에서 작성이 빠르고, 배포가 빠르고, 실행이 빠릅니다. 이제 DataSnap 기술은 거의 모든 표준 기반의 인프라 내에서 작동 할 수 있도록 기능이 확장되었습니다. 최신 DataSnap은 여전히 COM / DCOM 접근방식과 하위 호환이 가능한 반면, TCP / IP를 통한 기본적인 통신 또는 HTTP 또는 HTTPS중 하나를 통해 통신할 수 있습니다. 동시에 DataSnap 서버에 있는 비즈니스 로직은 RESTful(표시 상태 전송) 웹 서비스로 전송 할 수 있습니다. DataSnap은 TCP / IP 또는 HTTP를 통해 JSON(자바 스크립트 객체 표기법) 데이터 콘텐트의 보안 전송을 사용하여 클라이언트가 안전하게 서버와 통신 할 수 있는 방법을 제공합니다. 통신 채널의 양쪽 끝에서 필터를 정의 할 수 있는 기능은 암호화 및 압축을 위해, 보안을 향상시킵니다. DataSnap 기술의 또 다른 혜택은 서버의 변경 사항에 대해 모든 클라이언트 애플리케이션을 비동기적으로 통보 할 수 있는 가능성을 제공하여 클라이언트가 적절한 조치를 취할 수 있도록 해주는 것입니다. 콜백은 클라이언트가 서버 메소드중 하나를 반드시 실행할 필요가 없습니다. RAD Studio XE2, 델파이 XE2 또는 C + + 빌더 XE2 엔터프라이즈 및 아키텍트 에디션을 구입한 경우 DataSnap 기술을 사용하거나 배포 하기 위한 추가 비용은 없습니다. Start |Programs | Embarcadero RAD Studio XE2 | Samples에서 DataSnap 샘플 애플리케이션을 (RAD 스튜디오와 함께 설치됩니다) 찾을 수 있습니다. 관심 폴더는 DataSnap XE 멀티플랫폼 데모를 포함하는 DataSnapXE와 여러 DataSnap 애플리케이션을 포함하는 Delphi DataSnap 입니다. 이러한 DataSnap 샘플들은 폴더 이름으로 불려집니다:
  • 9. 9  기본 DataSnap 클라이언트와 서버 예제 - http://docwiki.embarcadero.com/CodeExamples/XE2/en/DataSnap.Basic_DataSnap_Client_and_Server_S ample  권한 인증 예제 - http://docwiki.embarcadero.com/CodeExamples/XE2/en/DataSnap.Role_Authorization_Sample  채팅룸 예제 - http://docwiki.embarcadero.com/CodeExamples/XE2/en/DataSnap.ChatRoom_Sample  장애발생시 조치 - DataSnap HTTP 터널링 예제 - http://docwiki.embarcadero.com/CodeExamples/XE2/en/DataSnap.Failover_DataSnap_HTTP _Tunneling_Sample  JSON 보기 예제 - http://docwiki.embarcadero.com/CodeExamples/XE2/en/DataSnap.JSON_Viewer_Sample  프록시 생성 예제 - http://docwiki.embarcadero.com/CodeExamples/XE2/en/DataSnap.Proxy_Gener ator_Sample 첫번째 윈도우 및 맥 DataSnap 애플리케이션 배포 DataSnap 기술은 인터넷, 로컬 네트워크 또는 로컬 호스트를 통해 통신하는 클라이언트 - 서버 애플리케이션을 만들 수 있는 능력을 제공합니다. 다음 단계는 간단한 서버 및 클라이언트 애플리케이션을 구축하기 위해 DataSnap를 생성하고 사용하는 방법을 보여줍니다. 서버를 작성한 후 클라이언트와 DataSnap 서버 사이의 연결을 활성화하면 클라이언트는 DataSnap 서버에 정의되고 구현된 메소드를 호출 할 수 있습니다. 다음 섹션에서 DataSnap 애플리케이션에서 데이터베이스를 사용하는 방법을 배우겠습니다. 델파이 또는 C+ +을 사용하여 서버를 구현할 수 있는데 예제에서는 델파이와 C++ 모두 보여줍니다. 클라이언트는 서버와 동일한 언어로 구현 될 필요는 없습니다. DataSnap은 델파이 서버와 C + + 클라이언트로 또는 그 반대로도 할 수 있습니다. 주요 DataSnap 서버 컴포넌트는  TDSServer - TDSServer 구성 요소는 DataSnap 서버 애플리케이션의 논리적 중심입니다. 서버를 시작하고 중지하기 위한 Start 과 Stop 메소드를 포함합니다. 또한 AutoStart 속성을 포함합니다. 기본값으로, AutoStart 값이 True로 설정 되어 있어서 애플리케이션이 실행될 때 서버가 자동으로 시작합니다. 서버 애플리케이션마다 하나의 TDSServer 컴포넌트가 필요합니다.  TDSServerClass - TDSServerClass 컴포넌트는 서버 클래스를 나타냅니다. DataSnap 서버는 서버 클래스의 인스턴스를 자동으로 생성하고 파괴합니다. 서버 클래스의 인스턴스는 TDSServerClass 컴포넌트의 LifeCycle 속성으로 제어됩니다. LifeCycle 속성은 세 가지 값을 사용할 수 있습니다: Server, Session, 및 Invocation.  LifeCycle을 Server로 설정하는 것은 DataSnap 서버가 서버 애플리케이션에 연결된 모든
  • 10. 10 클라이언트에 의해 사용되는 서버 클래스의 하나의 인스턴스를 생성한다는 의미입니다. 이것은 '싱글톤' 패턴을 나타냅니다. 서버 클래스 구현은 스레드로부터 안전해야 하기 때문, 서버 라이프 사이클을 사용할 때 주의하십시오: 여러 스레드에서 동시에 액세스 할 수 있도록 이 서버 클래스를 설계해야 합니다.  LifeCycle의 기본 값은 Session입니다. 이것은 DataSnap 서버가 모든 연결 클라이언트에 대한 서버 클래스의 인스턴스 하나를 생성 있다는 것을 의미합니다.  LifeCycle 속성의 가능한 세 번째 값은 Invocation입니다. 이 경우는, 클라이언트에서 호출하는 각 메소드마다 서버 클래스 인스턴스가 생성되고 파괴됩니다, 그리고 서버 클래스의 상태가 메소드 호출 사이에 보존되지 않습니다. TDSTCP ServerTransport 컴포넌트는 클라이언트와 서버 간의 통신을 제공하기 위해 필요 합니다. TDSTCP ServerTransport 컴포넌트는 여러 스레드에서 들어오는 클라이언트 연결을 위한 수신 멀티 스레드 TCP 서버를 구현합니다. 이 컴포넌트는 어떠한 이벤트도 없습니다. Port 속성은 사용하는 TCP 포트를 가리키는데, 기본값으로 211로 지정되어 있습니다. 클라이언트와 서버 간에 또한 HTTP 통신을 사용할 수도 있습니다. 1 단계: DataSnap 서버 애플리케이션 작성 델파이와 C + +의 DataSnap 프로젝트를 시작하기 위해 세 개의 마법사가 있습니다:  DataSnap 서버 – DataSnap 서버 마법사는 DataSnap 기술을 사용하여 서버를 쉽게 구현하는 방법을 제공합니다.  DataSnap 웹브로커 애플리케이션 – DataSnap 웹브로커 애플리케이션 마법사는 웹브로커와 DataSnap 두 기술을 사용하여 서버 애플리케이션을 쉽게 구현하는 방법을 제공합니다.  DataSnap REST 애플리케이션 –REST 통신의 지원과 자바스크립트와 JSON을 사용하여 서버 메소드를 실행하는 웹 페이지를 사용하여 DataSnap 서버를 작성합니다.
  • 11. 11 또한 콘솔 애플리케이션 또는 파이어몽키 애플리케이션을 작성하고 DataSnap 서버 컴포넌트를 별도로 추가 할 수 있습니다. 이 장에서는, DataSnap 서버 마법사를 사용하겠습니다. File > New> Other… 사용하여 마법사를 시작하고 Delphi Projects > DataSnap Server category 또는 C++Builder Projects > DataSnap Server category에서 DataSnap 서버 마법사를 선택합니다. 마법사를 선택하면 DataSnap 서버 애플리케이션을 작성하도록 도와주는 4개의 마법사 대화 상자가 표시됩니다. DataSnap 서버 마법사는 DataSnap 기술을 사용하여 서버 애플리케이션을 쉽게 구현하는 방법을 제공합니다. 사용자가 선택한 옵션에 관계없이, TDSServer 컴포넌트를 포함하는 ServerContainerUnit을 만듭니다. 추가적인 모든 컴포넌트들은 Server 속성에 TDSServer 컴포넌트의 이름을 지정하여 TDSServer에 연결됩니다. 선택한 프로토콜이 TCP / IP이면, 서버는 또한 TDSTCPServerTransport를 포함합니다. HTTP는 통신 프로토콜로 선택하면, 서버는 TDSHTTP 서비스 컴포넌트가 포함되어 있습니다. HTTPS를 선택하면, 서버는 HTTPS 운영을 위한 구성된 TDSHTTP 서비스 컴포넌트를 포함합니다. 첫 번째 단계(4 단계 중 1 단계) 마법사는 DataSnap 서버에서 원하는 애플리케이션 유형을 선택합니다. 선택할 수 있는 유형은 다음과 같습니다: VCL 애플리케이션, 콘솔 애플리케이션 및 서비스 애플리케이션. 앞에서 언급 한 바와 같이, 유저 인터페이스를 갖는 DataSnap 서버 애플리케이션을 작성하려면, 파이어몽키 애플리케이션을 만들고 DataSnap 서버 컴포넌트를 추가할 수도 있습니다. 간단하게 작성 하기 위해, DataSnap 서버용 VCL Forms 애플리케이션을 작성합니다. 이를 선택하면 DataSnap 서버에 얼마나 많은 DataSnap 클라이언트가 서버에 연결되어 있는지 표시 하기 위한 추가 컨트롤을 배치 할 수 있는 간단한 유저 인터페이스를 제공합니다.
  • 12. 12 다음 마법사는(4 단계 중 2 단계) DataSnap 서버 애플리케이션에 포함하고 싶은 서버 기능을 묻습니다. 체크 리스트의 모든 기능은 자체 설명이 있습니다: 하나를 선택하면 힌트는 마법사 상단에 표시됩니다. 사용 가능한 통신 프로토콜은 다음과 같습니다:  TCP/IP  HTTP  HTTPS 원하는 프로토콜을 선택할 수 있지만 TCP / IP는 항상 선택되어 있습니다. 이 목록에서 통신 프로토콜을 선택하면 DataSnap 서버 마법사의 다음 단계에서, 선택된 프로토콜을 위한 통신 포트의 선택이 가능합니다. 통신 프로토콜로 HTTPS를 선택하면 DataSnap 서버 마법사는 인증서 파일에 대한 정보를 요청하는 추가 페이지를 표시합니다. 인증 옵션을 선택하면 TDSHTTPServiceAuthenticationManager 컴포넌트가 서버 폼에 배치됩니다. TDSHTTPService 컴포넌트는 DataSnap 서버에 대한 HTTP 사용자 인증을 구현하기 위해 인증관리자로 TDSHTTPServiceAuthenticationManager를 사용합니다. 인증 이벤트가 구현부분에 기본 구성되어 있습니다. 인증을 선택하면 클라이언트는 SQL 연결 속성으로 DataSnap 사용자 이름과 암호를 제공해야 합니다. 서버 메소드 클래스 옵션을 선택하면, 클라이언트 프로그램 측에 서버 메소드를 알려주는 TDSServerClass 컴포넌트가 서버에 추가됩니다. 샘플 메소드 옵션을 선택하면, ServerMethodsUnit는 매개변수로 주어진 값을 그대로 반환하는 EchoString 및 반대로 반환하는 ReverseString라는 두 가지 간단한 메소드들의 코드를 포함합니다. 필터 카테고리는 DataSnap 서버가 사용하는 필터를 지정합니다. 암호화 필터, 압축 필터, 또는 둘 모두를 포함하여 선택할 수 있습니다:  암호화 필터는 선택한 통신 프로토콜에 대한 PC1과 RSA 필터를 추가합니다. RSA 필터는 서버와 이 서버에 연결하는 모든 클라이언트에 있어야 하는 OpenSSL 라이브러리가
  • 13. 13 필요하다는 것에 주목하십시오.  압축 필터는 선택한 통신 프로토콜에 대한 ZLib 압축 필터를 추가합니다.  자바 스크립트 파일은 자바 스크립트 프레임 워크 및 프록시 생성기로 프로젝트를 시작합니다. 모바일 커넥터를 선택하면 프로젝트는 안드로이드, 윈도우폰, 아이폰과 같은 모바일 장치에 애플리케이션을 디스패치 하는 프록시를 지원합니다. 더 자세한 내용은 엠바카데로 DocWiki에서 모바일 장치를 위한 DataSnap 커넥터를 참조하십시오 http://docwiki.embarcadero.com/RADStudio/en/Getting_Started_with_DataSnap_Mobile_Connectors 간단하게 TCP / IP 만을 사용하여 마법사가 클라이언트가 사용하는 샘플 메소드를 생성합니다. 세 번째 마법사(4 단계 중 3 단계)에서 DataSnap 마법사는 TCP / IP 기반 DataSnap 서버의 포트 번호를 요구합니다. 원하는 모든 포트를 선택할 수 있습니다(또는 방화벽에서 개방되는 포트). 포트를 실제로 사용할 수 있는지 확인하는 "테스트 포트" 버튼이 있고 열려있는 포트를 찾는데 사용하는 두 번째 버튼이 있습니다. 이전 단계에서 HTTPS 기능을 선택했다면, 또한 HTTPS 통신 포트를 지정해야 합니다. 사용 가능한 TCP / IP 통신 포트용으로 동일한 버튼을 사용할 수 있습니다: 포트 테스트 및 열린 포트 검색. 포트 211의 기본값을 그대로 두고 이 포트를 사용할 수 있는지 확인하려면 "테스트 포트" 버튼을 클릭합니다. 대화 상자에서 "테스트 포트 성공"이 표시되면, 계속 진행하셔도 됩니다.
  • 14. 14 마지막 마법사 단계 (4 단계 중 4 단계)는 서버 메소드 클래스에 대한 조상 타입을 선택합니다. 서버에 있는 데이터셋과 클라이언트 애플리케이션에서 연결하기 위해 TDSServerModule을 선택합니다. 서버 클래스에서 비 시각적 컴포넌트를 사용하려면 TDataModule을 선택합니다. 코드만 있는 서버 클래스를 구현하려면 TComponent를 선택합니다. 첫 번째 DataSnap 서버에 대해서는 디폴트 선택인 TComponent 그대로 둡니다.
  • 15. 15 DataSnap 마법사에서 추가 기능을 선택한 경우, 추가 마법사 단계를 볼 수 있습니다. “Finish” 버튼을 클릭하면 ServerContainerUnit, ServerMethodsUnit 및 서버 유니트로 DataSnap 서버 애플리케이션 프로젝트가 생성되는 것을 볼 수 있습니다. 프로젝트 이름을 "DelphiDataSnapServer" 또는 "CppDataSnapServer"로 서버 유니트 이름을 ServerUnit를 사용하여 폴더에 프로젝트를 저장합니다. ServerMethodsUnit는 마법사에 의해 생성된 샘플 DataSnap 서버 메소드에 대한 소스 코드를 포함합니다(그 옵션을 선택한 경우): // Delphi – ServerMethodsUnit1.pas unit ServerMethodsUnit1; interface uses System.SysUtils, System.Classes, Datasnap.DSServer, Datasnap.DSAuth; type {$METHODINFO ON}
  • 16. 16 TServerMethods1 = class(TComponent) private { Private declarations } public { Public declarations } function EchoString(Value: string): string; function ReverseString(Value: string): string; end; {$METHODINFO OFF} implementation uses System.StrUtils; function TServerMethods1.EchoString( Value: string): string; begin Result := Value; end; function TServerMethods1.ReverseString( Value: string): string; begin Result := System.StrUtils.ReverseString(Value); end; end. // C++ - ServerMethodsUnit1.cpp //-------------------------------------------------------- #include <SysUtils.hpp> #pragma hdrstop #include "ServerMethodsUnit1.h" //-------------------------------------------------------- #pragma package(smart_init) //-------------------------------------------------------- System::UnicodeString TServerMethods1::EchoString( System::UnicodeString value) { return value; } //-------------------------------------------------------- System::UnicodeString TServerMethods1::ReverseString( System::UnicodeString value) { return ::ReverseString(value); } //-------------------------------------------------------- #ifndef ServerMethodsUnit1H #define ServerMethodsUnit1H
  • 17. 17 //-------------------------------------------------------- #include <Classes.hpp> #include <DSServer.hpp> //-------------------------------------------------------- class DECLSPEC_DRTTI TServerMethods1 : public TComponent { private: // User declarations public:// User declarations System::UnicodeString EchoString( System::UnicodeString value); System::UnicodeString ReverseString( System::UnicodeString value); }; #endif DataSnap 서버 애플리케이션은 윈도우에서 컴파일 및 실행합니다. 프로젝트 매니저에서 타깃 플랫폼 노드를 윈도우32 또는 윈도우64로 지정합니다. DataSnap 서버 애플리케이션을 시작하려면 DataSnap 서버 애플리케이션에서 오른쪽 마우스 버튼을 클릭하고 팝업 메뉴에서 Run without Debugging을 선택합니다. DaSnap 서버 애플리케이션을 시작했을 때 서버 메인 창을 볼 수 있고 윈도우 방화벽이 설정되어있는 경우 윈도우 보안 경고 창이 표시됩니다. DataSnap 서버가 포트 211를 사용하려고 할 때 경고가 발생합니다.
  • 18. 18 보안 경고 창에서 "액세스 허용” 버튼을 클릭합니다. DataSnap 서버 애플리케이션은 이제 메소드들을 호출하기 위해 클라이언트 애플리케이션에 대한 포트 211에서 수신 대기합니다. DataSnap 서버 콘솔 애플리케이션을 중지하려면 ALT-F4를 누르거나 프로그램 닫기 버튼을 클릭합니다. 2 단계: 윈도우 및 맥 DataSnap 클라이언트 애플리케이션 방금 만든 서버 애플리케이션의 동일한 프로젝트 그룹에 클라이언트 애플리케이션을 추가하려면, 프로젝트 매니저의 프로젝트 그룹 이름에서 오른쪽 마우스 버튼을 클릭하고 팝업 메뉴에서 Add New Project를 선택합니다. 새 아이템 대화 상자가 표시됩니다. 델파이 프로젝트 카테고리에서, FireMonkey HD Application를 선택하고 OK를 클릭합니다. C++빌더 프로젝트 카테고리에서, FireMonkey HD Application를 선택하고 OK를 클릭합니다. 폼의 Caption 및 Name 속성을 Delphi DataSnap Client 와 DelphiDataSnapClientForm으로 또는 C++ DataSnap Client 와 CppDataSnapClientForm으로 지정합니다. 메인 메뉴의 File > Save All를 클릭합니다. 유니트 파일 이름을 DelphiClientUnit 또는 CppClientUnit로 저장하고 프로젝트 이름을 DelphiDataSnapClient 또는CppDataSnapClient로 저장합니다. 프로젝트 그룹 이름은 DelphiDataSnapprojectGroup 또는 CppDataSnapProjectGroup으로 저장합니다. 윈도우 및 맥 애플리케이션 유저 인터페이스를 만듭니다. 클라이언트 애플리케이션에 TEdit, TLabel과 TButton(s) 2개를 추가합니다. 정렬하고 크기를 조정하여 아래 화면과 같이 보이도록 합니다: Button1의 Text 와 Name 속성을 “Echo String” 과 “ EchoStringButton”으로 지정합니다. Button2의 Text 와 Name 속성을 “Reverse String” 과 “ReverseStringButton”으로 지정합니다. 툴 팔레트에서 dbExpress 카테고리의 TSQLConnection 컴포넌트를 추가합니다. 오브젝트 인스펙터를 사용하여 TSQLConnection 컴포넌트에 대한 다음 속성들을 설정합니다:  Driver: Datasnap (고객의 관점에서, 데이터베이스에 연결하는 것처럼 보이지만 사실은 DataSnap 서버에 연결을 제공합니다.)  LoginPrompt: False (클라이언트가 서버에 연결할 때마다 사용자 이름과 암호 대화 상자를 표시하지 않기 위한 선택사항입니다).  마법사에서 포트 211과 다른 포트 번호를 선택한 경우, 오브젝트 인스펙터를 이용해서 Params 속성을 더블클릭하고 Port 매개변수를 변경합니다. 다른 윈도우 컴퓨터에서 DataSnap 서버를 실행하고 있다면 Params 속성을 더블 클릭하여 Host Name 매개변수를 수정해야 합니다.
  • 19. 19 DataSnap 클라이언트 애플리케이션 화면은 다음과 같아야 합니다:
  • 20. 20 DataSnap 클라이언트 애플리케이션을 만드는 가장 중요한 단계는 DataSnap 서버에 구현된 모든 함수의 프로토(proto)타입을 포함하는 인터페이스를 생성하는 것입니다. 다음과 같이 작업을 수행합니다:  프로젝트 매니저에서 서버 프로젝트의 이름을 두 번 클릭하여 DataSnap 서버 프로젝트를 활성화합니다.  메인 메뉴의 Run > Run Without Debugging을 클릭하여 DataSnap 서버를 실행합니다(이미 실행되고 있지 않는 한).  서버가 실행되는 동안 프로젝트 매니저에서 해당 DataSnap 클라이언트 프로젝트 이름을 더블 클릭하여 활성화합니다.  디자인 탭에서, TSQLConnection 컴포넌트의 Connected 속성을 True로 설정합니다. 작동한다면, 설계 시점에서 DataSnap 클라이언트는 이제 DataSnap 서버에 연결되었습니다.  클라이언트 폼에서 TSQLConnection 컴포넌트를 오른쪽 마우스 클릭하여 팝업 메뉴에서 “Generate DataSnap client classes”를 선택합니다. 서버에 구현된 클래스와 이 클래스에 포함 된 모든 메소드에 대한 정보를 포함하는 새로운 유니트가 클라이언트 프로젝트에 추가됩니다.
  • 21. 21 O 델파이의 경우, 새로운 유니트를 DataSnapClientClasses.pas로 저장합니다. 클라이언트 클래스 유니트 이름을(DataSnapClientClasses) DataSnapClient.pas 파일의 구현 부분에 추가하기 위해 DelphiClientUnit 폼을 선택하고 File > Use Unit 메뉴를 선택하여 유니트를 선택하고 OK 버튼을 클릭합니다. O C ++ 경우는, 새로운 유니트를 DataSnapClientClasses.cpp로 저장합니다. CppDataSnapClient.cpp 파일의 처음에 아래 라인을 추가합니다: #include "DataSnapClientClasses.h" TEdit 상자에 입력 한 텍스트를 그대로 또는 반대로 보기 위한 DataSnap 서버 메소드를 호출하는 TButton (들)의 각각에 대해 이벤트 핸들러를 추가합니다. 다음은 각 버튼 이벤트 핸들러에 대한 코드입니다(델파이와 C++): // Delphi: procedure TDelphiDataSnapClientForm.EchoStringButtonClick( Sender: TObject); var Temp : TServerMethods1Client; Begin Temp := TServerMethods1Client.Create( SQLConnection1.DBXConnection); try Label1.Text := Temp.EchoString(Edit1.Text) finally Temp.Free(); end end; procedure TDelphiDataSnapClientForm.ReverseStringButtonClick( Sender: TObject); Var Temp : TServerMethods1Client;
  • 22. 22 begin Temp := TServerMethods1Client.Create( SQLConnection1.DBXConnection); try Label1.Text := Temp.ReverseString(Edit1.Text) finally Temp.Free() end end; // C++: //-------------------------------------------------------------- void __fastcall TCppDataSnapClientForm::EchoStringButtonClick( TObject *Sender) { TServerMethods1Client *Temp; Temp = new TServerMethods1Client( SQLConnection1->DBXConnection); try { Label1->Text = Temp->EchoString(Edit1->Text); } __finally { delete Temp; } } //-------------------------------------------------------------- void __fastcall TCppDataSnapClientForm::ReverseStringButtonClick( TObject *Sender) { TServerMethods1Client *Temp; Temp = new TServerMethods1Client( SQLConnection1->DBXConnection); try { Label1->Text = Temp->ReverseString(Edit1->Text); } __finally { delete Temp; } } //-------------------------------------------------------------- 마지막으로, 클라이언트 애플리케이션을 작성하고 실행합니다.
  • 23. 23 런타임에 다음과 같은 오류 메시지가 나타나면, SQLConnection 컴포넌트의 Connected 속성이 True로 설정되어 있지 않은 경우 이런 오류가 발생할 수 있습니다. DataSnap 클라이언트 애플리케이션을 실행하기 전에 SQLConnection의 Connected 속성이 True로 설정되어 있는지 확인하십시오. 클라이언트 프로그램에 대한 실시는 SQLConnection의 Connected 속성을 ON/OFF 하기 위해 세 번째 버튼을 추가하는 것입니다. 또 다른 방법은 FormCreate에서 Connected 속성이 참인지 확인하고 거짓인 경우, Connected 속성을 True로 설정하고 FormDestroy에서 Connected 속성을 False로 설정하는 것입니다. DataSnap 서버 프로그램이 실행되어 있지 않은 상태에서 SQLConnection의 Conneted 속성은 True로 설정되어 있고 DataSnap 클라이언트 프로젝트가 활성화 되어있는 프로젝트 그룹을 로드 할 때 실행 오류가 발생 수 있습니다: 오류가 발생하여도 걱정할 필요는 없습니다. 폼 디자이너가 설계 시점에 DataSnap 서버와 통신하려고 하고 포트 211에서 실행되는 서버를 찾을 수 없습니다. OK를 클릭하여 DataSnap 서버 애플리케이션을 시작하고 DataSnap 클라이언트 애플리케이션을 다시 활성화하십시오. DataSnap 서버를 실행하려고 할 때 마지막으로 "주소 및 포트는 이미 사용 중 입니다” 라는 오류를 볼 수 있습니다. DataSnap 서버가 동일한 포트 번호를 사용하려고 하는 경우 이 오류가 런타임 또는 프로젝트 설계 시에 발생할 수 있습니다. 문제를 해결하려면 DataSnap 서버를 종료하거나 모두를 실행해야 한다면 다른 포트를 사용하고 있는지 모두 확인하십시오. DataSnap 클라이언트 프로그램이 성공적으로 DataSnap 서버에 연결하는 경우, 클라이언트 폼이 표시됩니다. 에디터 박스에 무언가의 텍스트를 입력하고 Echo String 과 Reverse String 버튼을
  • 24. 24 클릭합니다. 이벤트 핸들러는 DataSnap 서버 메소드를 호출하여 반환되는 문자열을 TLabel의 Text 속성에 할당합니다. 맥 OS X에서 DataSnap 클라이언트를 실행하려면 다음과 같은 절차가 필요합니다.  OS X의 타깃 플랫폼 노드를 추가하고 활성화 시킵니다.  SQLConnection의 Params 속성에서 HostName 값을 DataSnap 서버를 실행하고 있는 컴퓨터 이름 또는 IP 주소로 설정합니다 (기본 HostName 값은 “localhost”입니다, 맥 IP 주소 192.168.xx.xxx에 대한 VM웨어 퓨전 아래에 윈도우 7 게스트 OS에서)  RAD Studio IDE에서 서버와 클라이언트 애플리케이션을 제어하려는 경우, 서버가 맥에서 실행되고 있는지 확인하십시오. DataSnap 클라이언트 애플리케이션을 실행합니다. IDE는 원격 프로파일 설정을 사용하여 DataSnap 클라이언트 애플리케이션을 맥에 배포합니다. DataSnap 서버 메소드를 호출하기 위해. 맥에서 에디터 박스에 텍스트를 입력하고 버튼을 클릭합니다. 델파이와 C+ +을 사용하여 DataSnap 클라이언트와 서버를 혼합하고 매치할 수 있습니다. VCL 애플리케이션뿐만 아니라 콘솔 애플리케이션, 파이어몽키 애플리케이션 등을 사용할 수 있습니다. 서버 애플리케이션을 종료하기 전에 모든 SQL 연결을 종료해야 합니다. 이 예제에서, 클라이언트에서 TSQLConnection 컴포넌트의 Connected 속성을 False로 지정합니다. DataSnap은 서버를 종료하는 경우에도, 현재 연결되어 있는 클라이언트가 있는지 경고하지 않습니다.
  • 25. 25 델파이 IDE는 자동으로 서버에 연결하고 노출 된 클래스와 메소드를 검색하기 때문에 모든 클라이언트 프로그램을 종료하는 것이 이 문제를 해결하지 못합니다. 엠바카데로 DocWiki에서 다른 간단한 DataSnap 서버와 클라이언트 자습서를 찾을 수 있습니다 http://docwiki.embarcadero.com/RADStudio/en/Tutorial:_Using_a_DataSnap_S erver_with_an_Application. 이 튜토리얼은 숫자 두 개를 합산하는 DataSnap 서버 메소드 및 DataSnap 클라이언트 프로그램을 작성하는 방법을 보여줍니다. Pawel Glowacki는, 자신의 델파이 랩, DataSnap 에피소드 1에서 델파이를 사용하여 간단한 DataSnap 계산기 서버와 클라이언트를 작성하는 방법을 보여줍니다. http://edn.embarcadero.com/article/41176에서 기사를 보실 수 있습니다. 다음에서 소스 코드를 다운 로드 받을 수 있습니다 http://cc.embarcadero.com/item/28184. 윈도우와 맥 멀티-티어 데이터베이스 애플리케이션 작성 DataSnap 기반의 멀티 클라이언트, 멀티 플랫폼, 멀티-티어 데이터베이스 애플리케이션을 생성합니다. 다음과 같은 애플리케이션을 포함합니다:  인터베이스 데이터베이스를 사용하는 파이어몽키 기반의 DataSnap 서버  데이터베이스 작업을 위한 사용자 인터페이스를 제공하며, 윈도우 및 맥에서 실행할 수 있는 파이어몽키 DataSnap 클라이언트. DataSnap 클라이언트는 데이터베이스에 액세스하는 DataSnap 연결만 필요한 가벼운 클라이언트가 됩니다. DataSnap 서버는 로컬 또는 원격 데이터베이스와 작업 할 수 있는 데이터베이스 드라이버와 비즈니스 로직을 갖추고 있습니다. DataSnap 서버 애플리케이션은 델파이 또는 C + +중 하나를 사용하여 윈도우에서 실행합니다. 델파이와 C + +을 사용하여 윈도우와 맥에서 실행하는 DataSnap 클라이언트 애플리케이션을 구축 할 수 있습니다. 또한 RAD Studio를 사용하여, RadPHP, 자바 스크립트의 DataSnap 클라이언트 애플리케이션을 구축 할 수 있고 iOS (오브젝트-C와 델파이), 안드로이드(자바), 블랙 베리(자바), 및 윈도우 폰(C #)를 지원하는 DataSnap 모바일 커넥터를 사용할 수 있습니다 DataSnap 클라이언트 프로그램은 DataSnap 서버와 동일한 언어로 구현 할 필요가 없습니다. DataSnap 서버와 클라이언트를 작성하려면 다음 단계를 실행하십시오. 각 단계의 끝에서 File > Save All (shift-control-s) 하는 것을 기억하십시오. 1 단계: 새로운 파이어몽키 DataSnap 서버 프로젝트 생성. 델파이의 경우, File > New > FireMonkey HD Application – Delphi를 선택하여 새로운 델파이 프로젝트를 생성합니다. C ++의 경우에는, File > New > FireMonkey HD Application - C ++Builder를 선택하여 새로운 C ++빌더 프로젝트를 생성합니다. 폼의 Caption 속성을 "Delphi DB DataSnap Server Application" 또는 “C ++ DB DataSnap Server Application”로 지정합니다. File > Save All를 클릭하여 프로젝트를 저장합니다.
  • 26. 26 델파이에서는 DelphiDBServerUnit.pas로 유니트 파일을 저장하고 DelphiDBDataSnapServer.dproj로 프로젝트 파일을 저장합니다. C ++에서는, CppDBServerUnit.cpp로 파일을 저장하고 CppDBDataSnapServer.cbproj로 프로젝트 파일을 저장합니다. 2 단계: DataSnap 서버 컴포넌트 추가하기 툴 팔레트의 Datasnap 서버 카테고리에 아래 컴포넌트를 폼 위에 드래그&드롭 합니다:  TDSServer  TDSServerClass  TDSTCPServerTransport File > Save All 클릭하여 프로젝트를 저장합니다. 서버 폼이 다음과 같이 보일 것 입니다: 3 단계 – 서버 컴포넌트들 서로 연결하기 3 개의 DataSnap 서버 컴포넌트를 서로 연결하기 위해 오브젝트 인스펙터를 사용하여 다음과 같이 합니다: 폼 위의 TDSServerClass 컴포넌트를 선택하여 드롭-다운 메뉴에서, Server 속성을 TDSServer 컴포넌트 이름인 DSServer1으로 설정합니다. 폼 위의 TDSTCPServerTransport 컴포넌트를 선택하여, Server 속성을 TDSServer 컴포넌트 이름인 DSServer1로 설정합니다. File > Save All 클릭하여 프로젝트를 저장합니다. 4 단계– 프로젝트에 ServerModule 추가하기 File > New > Other…를 사용하여 “New Items” 오브젝트 갤러리를 불러옵니다. 또한 툴 바에 있는 “New Items” 스피드 버튼을 클릭할 수 있습니다(녹색 + 기호가 있는 페이지 아이콘). 델파이 DataSnap 서버인 경우, Delphi Projects > DataSnap Server 탭을 클릭하여 서버 모듈이라 불리는 새로운 델파이 파일을 추가합니다.
  • 27. 27 서버 모듈을 선택하고 OK를 클릭합니다. OK를 클릭한 후 다음과 같은 경고 대화상자가 표시될 것입니다: 서버 모듈은 VCL, 파이어몽키 및 일반 컴포넌트와 같이 사용할 수 있기 때문에, IDE는 파이어몽키와 공통 컴포넌트로 사용을 제한하는 신호로 이 경고 메시지를 표시합니다. 계속 진행하기 위해 Yes 버튼을 클릭합니다. 오브젝트 인스펙터에서 ClassGroup 속성을 FMX.Types.TControl로 설정합니다. 서버 모듈 마법사는 서버 모듈 폼과 서버 모듈 클래스 선언을 생성합니다. 다음 단계에서 서버 클래스 폼에 데이터베이스 액세스 컴포넌트 추가하고 서버 클래스 안에 추가적인 public 메소드를 추가할 것입니다. 생성 된 델파이 서버 모듈 클래스 선언은 다음과 같습니다: TDSServerModule1 = class(TDSServerModule) private { Private declarations } public { Public declarations } end; 모듈을 DelphiServerModule.pas로 저장합니다. C ++ DataSnap 서버의 경우에는, C ++Builder Projects > DataSnap Server 탭을 클릭하여 서버 모듈이라 불리는 새로운 C ++ 파일을 추가합니다.
  • 28. 28 Server Module을 선택하고 OK를 클릭합니다. OK를 클릭한 후 다음과 같은 경고 대화상자가 표시될 것입니다: 서버 모듈은 VCL, 파이어몽키 및 일반 컴포넌트와 같이 사용할 수 있기 때문에, IDE는 파이어몽키와 공통 컴포넌트로 사용을 제한하는 신호로 이 경고 메시지를 표시합니다. 계속 진행하기 위해 Yes 버튼을 클릭합니다. 오브젝트 인스펙터에서 ClassGroup 속성을 FMX.Types.TControl로 설정합니다. 서버 모듈 마법사는 서버 모듈 폼과 서버 모듈 클래스 선언을 생성합니다. 다음 단계에서 서버 클래스 폼에 데이터베이스 액세스 컴포넌트 추가하고 서버 클래스 안에 추가적인 public 메소드를 추가할 것입니다. 생성 된 C++ 서버 모듈 클래스 선언은 다음과 같습니다: __published:// IDE-managed Components private:// User declarations public:// User declarations __fastcall TDSServerModule1(TComponent* Owner); }; 모듈을 CppServerModuleUnit.cpp로 저장합니다. 델파이와 C + + DataSnap 서버 모두에서, TDSServerModule 클래스는 TDSServerModuleBase에서 상속받고 TDSServerModuleBase클래스는 TProviderDataModule에서 상속받고 TProviderDataModule 클래스는 TDataModule에서 상속받습니다. 서버 모듈에 다양한 데이터베이스 컨트롤을 추가할 수 있습니다. 또한 코드 에디터를 사용하여 서버 모듈에 public 메소드를 추가합니다. 데이터 모듈은 초기 중립 프레임 워크입니다. 프레임워크 별 라이브러리 요소를 사용하려면, ClassGroup 슈도-속성에 대한 프레임워크-특정 값을 선택하여 플랫폼 선호도를 설정해야 합니다:
  • 29. 29  System.Classes.TPersistent, 디폴트 설정, 프레임 워크 중립을 나타내며 특정 프레임워크가 아닌 RTL 요소만 포함합니다.  Vcl.Controls.TControl - VCL 프레임워크로 설정합니다 특정 프레임워크가 아닌 RTL 요소만 포함합니다.  FMX.Types.TControl - FMX 프레임워크로 설정합니다 특정 프레임워크가 아닌 RTL 요소만 포함합니다.  FMX _Types.TControl - FMX iOS 프레임워크로 설정합니다 특정 프레임워크가 아닌 RTL 요소만 포함합니다. File > Save All를 클릭하여 프로젝트를 저장합니다. 5 단계 – DataSnap 서버 프로젝트에 데이터베이스 컴포넌트 추가하기 데이터 탐색기에서 아이템을 드래그하여 프로젝트에 컴포넌트를 추가 할 수 있습니다. 프로젝트 매니저에서 데이터 탐색기(Data Explorer) 탭을 클릭합니다. 트리 보기에서 INTERBASE 항목이 확장되어 있지 않으면 확장 하기 위한 (+) 기호를 클릭 합니다. INTERBASE 아래의 EMPLOYEE 항목을 연 다음 테이블 항목을 확장합니다. DelphiServerModuleUnit 폼이나 CppServerModuleUnit 폼에 EMPLOYEE 테이블을 드래그하면 두 개의 새로운 dbExpress 컴포넌트가 폼 위에 추가됩니다:  오브젝트 인스펙터에서 TSQLConnection 컴포넌트의 Name 속성을 "EMPLOYEE_CONNECTI ON"로 지정합니다.  오브젝트 인스펙터에서 TSQLDataSet 컴포넌트의 Name 속성을 "EMPLOYEE_TABLE"로 지정합니다. 폼에 테이블을 드래그한 경우, 두 개의 컴포넌트가 자동으로 연결되어 있습니다. TSQLConnection 컴포넌트의 Name 속성을 설정하면, 당신은 EMPLOYEE_TABLE의 SQLConnection 속성이 EMPLOYEE_CONNECTION로 변경된 것을 알 수 있습니다. DelphiServerModuleUnit 폼이나 CppServer ModuleUnit 폼 위에 2 개의 컴포넌트를 추가합니다:  TDataSetProvider를 추가합니다. 오브젝트 인스펙터에서, DataSet 속성을 드롭-다운 메뉴에서 EMPL OYEE_TABLE로 설정합니다. 뒤에 추가되는 다른 TDataSetProvider와 구별하기 위해 name 속성을 ServerDataSetProvider1로 설정합니다. TSQLStoredProc 컴포넌트를 추가합니다. 드롭-다운 메뉴를 사용하여 SQLConnection 속성을 "EMPLOYEE_CONNECTION" 도 설정합니다. 드롭-다운 메뉴를 사용하여 StoredProcName 속성을 "GET_EMP _PROJ"로 설정합니다. "GET_EMP_P ROJ" 는 Employee 데이터베이스에 있는 저장 프로시저 중 하나입니다. 이 저장 프로시저는 직원 번호와 연관된 프로젝트 ID를 얻습니다. File > Save All 메뉴를 클릭하여 프로젝트를 저장합니다. 델파이 또는 C + + 프로젝트에 대한 서버 모듈은 아래 그림과 같이 표시됩니다.
  • 30. 30 6 단계- 서버 모듈에 함수 추가하기 서버 모듈의 public 부분에 함수를 추가합니다. 서버 모듈의 public 섹션에 있는 모든 서버 메소드는 연결되어있는 DataSnap 클라이언트 프로그램에 의해 호출 될 수 있습니다. 델파이: DelphiServerModuleUnit를 선택하고 코드 탭을 클릭합니다. ServerModule의 타입 부분의 Public 섹션 아래에 이 함수 선언을 추가합니다: function callStoredProcedure (mylocalkey : Integer) : String; 구현 섹션에서 이 함수에 대한 기본 구조를 생성하기 위해 CTRL-SHIFT-C를 눌러 클래스 완성을 사용합니다: C ++: CppServerModuleUnit를 선택하여, 헤더 파일을 보기 위해 CppServerModuleUnit.h 탭을 클릭합니다. public 아래 부분에 다음 함수를 추가합니다: String _fastcall callStoredProcedure (int mylocalkey); 데이터베이스 컴포넌트와 public 메소드를 추가한 후 델파이와 C는 + + 서버 모듈 클래스는 다음과 같이 선언됩니다. // Delphi TDSServerModule1 = class(TDSServerModule) EMPLOYEE_CONNECTION: TSQLConnection; EMPLOYEE_TABLE: TSQLDataSet; ServerDataSetProvider1: TDataSetProvider; SQLStoredProc1: TSQLStoredProc;
  • 31. 31 private { Private declarations } public { Public declarations } function callStoredProcedure (mylocalkey : Integer) : String; end; // C++ class TDSServerModule1 : public TDSServerModule { __published:// IDE-managed Components TSQLConnection *EMPLOYEE_CONNECTION; TSQLDataSet *EMPLOYEE_TABLE; TDataSetProvider *ServerDataSetProvider1; TSQLStoredProc *SQLStoredProc1; private:// User declarations public:// User declarations String _fastcall callStoredProcedure (int mylocalkey); __fastcall TDSServerModule1(TComponent* Owner); }; File > Save All를 클릭하여 프로젝트를 저장합니다. 7 단계 - 방금 추가된 함수에 대한 서버 측 코드 작성하기 callStoredProcedure 함수는 정수형 매개 변수 직원 번호 (EMP_NO)를 가지고 저장 프로시저를 호출합니다. 이 함수는 문자 프로젝트 ID (PROJ_ID)를 얻습니다. 이 함수는 입력 매개 변수를 지정하고 프로시저를 실행 한 후 출력 매개 변수를 검색합니다. TSQLStoredProc 컴포넌트의 StoredProcName 속성의 값을 이미 저장 프로시저 이름 "GET_EMP_PROJ"로 설정했습니다. 델파이에서, DelphiServerModuleUnit.pas에 다음 함수를 추가합니다: 델파이의 경우, DelphiServerModuleUnit.pas에 다음의 함수를 추가합니다: function TDSServerModule1.callStoredProcedure( mylocalkey: Integer): String; var myString :String; begin SQLStoredProc1.ParamByName('EMP_NO').AsInteger := mylocalkey; SQLStoredProc1.ExecProc; myString := SQLStoredProc1.ParamByName('PROJ_ID').AsString; result := myString; end; C ++의 경우, CppServerModuleUnit.cpp 안에 다른 멤버 함수 뒤에 다음 함수를 추가합니다: String _fastcall TDSServerModule1::callStoredProcedure ( int mylocalkey) { String myString; SQLStoredProc1->ParamByName("EMP_NO")->AsInteger = mylocalkey; SQLStoredProc1->ExecProc(); myString = SQLStoredProc1->ParamByName("PROJ_ID")->AsString;
  • 32. 32 return myString; } 실제 저장 프로시저 매개 변수 이름으로 EMP_NO 및 PROJ_ID가 사용되므로, ParamByName으로 값을 얻을 수 있습니다. 8 단계 – DataSnap 서버 클래스의 OnGetClass 이벤트 핸들러 추가 DelphiDBServerUnit 폼이나 CppDBServerUnit 폼으로 다시 돌아 갑니다. 오브젝트 인스펙터에서 TDSServerClass 컴포넌트를 선택합니다. 오브젝트 인스펙터에서, 이벤트 탭을 클릭하여 OnGetClass 이벤트를 더블 클릭합니다. 이 이벤트 핸들러 코드는 DataSnap 서버가 사용하는 서버의 클래스를 결정합니다: // Delphi procedure TForm1.DSServerClass1GetClass( DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass); begin PersistentClass := TDSServerModule1; end; // C++ void __fastcall TForm1::DSServerClass1GetClass( TDSServerClass *DSServerClass, TPersistentClass &PersistentClass) { PersistentClass = __classid(TDSServerModule1); } 변수 PersistentClass가 오브젝트 참조가 아니라 클래스 참조에 할당되어 있는 것을 주목하십시오. 서버 모듈에 ServerForm에 필요한 연결을 제공합니다. 델파이에서, ServerForm 유니트의 Uses 절로 가서 DelphiServerModuleUnit를 추가하여 TDSServerModule1이 인식됩니다. (또한 File > Use Unit을 사용할 수도 있습니다). C ++의 경우는, CppDBServerUnit.cpp 안에 다른 includes 뒤에 다음 라인을 추가합니다: #include "CppServerModuleUnit.h" 유니트를 저장합니다. 서버 프로젝트를 빌드 하고(Project > Build 또는 Shift-F9) 오류를 수정하지만, 지금 서버를 실행하지 않습니다. RAD Studio에서 프로젝트 매니저 보기에서 클릭합니다. 프로젝트 그룹을 오른쪽 마우스 버튼 클릭하여 프로젝트 그룹을 저장합니다. 프로젝트 그룹 이름을 DataSnapDBApplication.groupproj로 저장합니다. 다음 섹션에서 이 프로젝트 그룹에 다른 프로젝트를 추가할 것 입니다. 두 가지를 수행하는 서버를 완료합니다:  업데이트 할 수 있는 데이터베이스 데이터를 제공합니다.  저장 프로시저를 실행하고 값을 반환합니다 다음으로, 서버를 사용하는 DataSnap 클라이언트를 생성합니다. 클라이언트는 서버의 두 함수를 연습해봅니다:
  • 33. 33  저장 프로시저를 호출하고 값을 반환합니다.  데이터베이스 테이블의 데이터를 표시하고 업데이트합니다. File > Save All를 클릭하여 프로젝트와 프로젝트 그룹을 저장합니다. 9 단계 – 클라이언트 애플리케이션 프로젝트 작성하기 서버 프로그램과 같은 프로젝트 그룹에 클라이언트 프로그램을 작성하려면 프로젝트 매니저의 프로젝트 그룹 이름에서 오른쪽 마우스 버튼을 클릭하여 Add New Project를 선택하거나 메뉴의 Project > Add New Project를 선택합니다. 새 항목 대화상자가 나타날 것입니다. 델파이에서, 델파이 프로젝트 카테고리에서 FireMonkey HD Application를 선택합니다. C ++빌더에서는, C++빌더 프로젝트 카테고리에서 FireMonkey HD Application를 선택합니다. OK를 클릭합니다. 새 폼을 선택하고 오브젝트 인스펙터에서 폼의 Caption 속성을 “Delphi DB DataSnap Client Application” 또는 “C++ DB DataSnap Client Application”로 지정합니다. File > Save All을 선택하여 파일들을 저장합니다: 델파이의 경우, 유니트를 DelphiDBClientUnit.pas로 저장합니다. 프로젝트를 DelphiDBDataSnapClient.dproj로 저장합니다. C ++의 경우, 유니트를 CppDBClientUnit.cpp로 저장합니다. 프로젝트를 CppDBDataSnapClient.cbproj로 저장합니다. 프로젝트 매니저에서 CppDBDataSnapServer.cbproj.exe를 더블 클릭합니다(프로젝트를 활성화하기 위해). Run > Run Without Debugging (또는 Shift -Control-F9를 눌러)을 선택하여 DataSnap 서버 애플리케이션을 실행합니다. 나타나는 서버 프로그램 화면을 최소화합니다. 참고: 다음 단계에서 서버에 연결하고 DataSnap 클라이언트 클래스를 생성 할 수 있도록 서버가 실행되고 있어야 합니다. File > Save All를 클릭하여 프로젝트와 프로젝트 그룹을 저장합니다. 10 단계 – DataSnap 서버에 DataSnap 클라이언트 연결하기 새 폼 위에 TSQLConnection 컴포넌트를 내려 놓고 오브젝트 인스펙터에서 다음의 속성들을 설정합니다:  Driver 속성을 "DataSnap"으로 지정합니다. 오브젝트 인스펙터에서, Driver 속성의 왼쪽에 있는 + 기호를 클릭하여 드라이버 하위 속성들을 표시합니다(설정할 수 있습니다): o Port 속성을 "211" (기본값)로 지정합니다. o HostName 속성을 "localhost" (기본값)로 지정합니다. 같은 컴퓨터에서 DataSnap 서버와 클라이언트 테스트를 위한 localhost를 사용합니다. DataSnap 서버가 다른 컴퓨터에 있다면, 클라이언트의 TSQLConnection컴포넌트의 HostName 속성에 DataSnap 서버가 실행하고 있는 컴퓨터 이름이나 TCP /IP 주소를 지정해야 합니다. o 이러한 속성들(및 다른 속성들)은 Params 속성을 변경하므로 서 설정될 수도 있습니다. Params 속성에서 엘립시스(...) 버튼을 클릭하여 값 리스트 에디터를(Value List Editor)표시합니다. 대화상자에서 속성 값을 입력하고 값을 설정하기 위해 OK 를 클릭합니다.
  • 34. 34  LoginPrompt 속성을 false로 설정하여 클라이언트가 서버에 연결할 때마다 사용자 이름과 암호 대화상자가 표시되는 것을 피합니다.  Connected 속성을 true로 설정합니다. DataSnap 서버가 실행하고 있는 동안, TSQLConnection에서 오른쪽 마우스 버튼을 클릭하여 컨텍스트 메뉴에서 “Generate DataSnap client classes”를 선택합니다. 이 작업은 작성한 DataSnap 서버의 함수 연결과 사용을 지원하는 코드로 새로운 유니트를 생성합니다. 델파이에서는 생성된 유니트를 DelphiDBClientClasses.pas로 저장합니다. C ++에서는, 생성된 유니트를 CppDBClientClasses.cpp로 저장합니다. 델파이 또는 C + + 클라이언트 클래스 유니트에 DataSnap DB 클라이언트 유니트에 연결합니다. 델파이에서는, DelphiDBClientUnit 탭을 클릭하고, 코드 탭을 클릭하여 DelphiDBClientUnit의 uses 절에 DelphiDBClientClasses를 추가합니다(또는 File > Use Unit 사용하여). C ++에서는, 코드 에디터의 상단에 CppDBClientUnit.cpp 탭을 클릭하고, 코드 에디터의 밑에 코드 탭을 클릭합니다. CppDBClientUnit.cpp 안에 다른 includes 뒤에 다음 include문을 추가합니다: #include "CppDBClientClasses.h" File > Save All를 클릭하여 프로젝트와 프로젝트 그룹을 저장합니다. 11 단계 – DataSnap 클라이언트 애플리케이션 사용자 인터페이스 작성 시작 다음으로 DataSnap 클라이언트 애플리케이션의 사용자 인터페이스 작성을 시작하겠습니다. DelphiDBClientUnit 폼에서, 디자인 탭을 클릭하고 툴 팔레트로부터 컴포넌트를 폼 위에 드래그합니다:  데이터베이스를 이동하기 위한 TBindNavigator 컨트롤.  데이터베이스 테이블을 보기 위한 TStringGrid 컨트롤.  DataSnap 서버 연결을 열기/닫기 하고 ClientDataSet을 활성화/비활성화 하기 위한 TCheckBox 컨트롤.  수정된 데이터베이스 데이터를 업데이트하고 저장 프로시저를 호출하기 위한 TButtons 2개. 해당 TButton의 Text 속성을 "업데이트 적용하기" 와 "프로젝트 가져오기"로 지정합니다. 각 연관된 TButton의 Name 속성을 “ApplyUpdatesButton” 와 “GetProjectButton”으로 지정합니다.  Employee 번호를 입력하기 위한 TEdit 컨트롤.  프로젝트 ID를 표시하기 위한 TLabel 컨트롤. 컴포넌트를 배치 한 후, 필요에 따라 이동하고 크기를 조절합니다. DataSnap 클라이언트 폼은 다음과 같은 모습입니다:
  • 35. 35 12 단계- 클라이언트 측 데이터베이스 컴포넌트 추가하기 이 단계에서 DataSnap 서버의 데이터베이스 작업에 DataSnap 클라이언트 프로그램을 연결하는 데이터베이스 컴포넌트 및 코드를 추가합니다. DataSnap 서버가 실행되고 있는지 확인하십시오. IDE 인사이트 또는 툴 팔레트를 사용하여 폼에 TSQLServerMethod 컴포넌트를 내려 놓습니다. 오브젝트 인스펙터에서 SQLConnection 속성을 "SQLConnection1"으로 설정합니다. TSQLServerMethod의 ServerMethodName 속성을 설정합니다. DataSnap 서버가 실행되고 있을 경우, 속성의 드롭-다운 메뉴를 사용하여 DataSnap 서버에서 사용 가능한 서버 메소드들 모두를 볼 수 있습니다. 이 리스트는 DataSnap 관리, 메타데이터 및 서버 모듈 메소드들을 포함합니다. InterBase Employee 데이터베이스의 “Get_EMP _PROJ” 저장 프로시저를 호출하는 앞에서 DataSnap 서버에 작성해 놓은 함수인 "TDSServerModule1.callStoredProcedure"를 선택합니다.
  • 36. 36 TSQLServerMethods의 Active 속성은 true로 설정하지 않습니다. 만일 설정하면,“Get_EMP_PROJ” 저장 프로시저는 데이터 셋을 반환하지 않고 프로젝트 이름 문자 값만을 반환하기 때문에 오류 메시지가 표시될 것입니다. 메소드를 호출하고 TLabel의 Text 속성에 반환 되는 문자 값을 넣는 코드를 사용합니다. 폼에 TDSProviderConnection 컴포넌트를 추가합니다. 이 프로바이더 컴포넌트는 DataSnap 서버와 데이터베이스를 자유롭게 탐색하고 업데이트를 해결 할 수 있는 능력을 제공합니다. SQLConnection 속성을 "SQLConnection1"로 지정합니다. ServerClassName 속성을 DataSnap 서버의 서버 모듈 클래스 이름으로 지정합니다. 우리 예제에서는 "TDSServerModule1"입니다. 폼에 TClientDataSet 컴포넌트를 추가합니다. ProviderName 속성을 드롭-다운 메뉴에서 "DataSetProvider1"로 설정합니다. RemoteServer 속성을 드롭-다운 메뉴에서 "DSProviderConnection1"로 설정합니다. ProviderName 속성을 "ServerDataSetProvider1"로 지정합니다. “ TDataSource” 컴포넌트를 폼에 추가하고 “DataSet” 속성을 “ClientDataSet1”으로 설정합니다. 폼의 TStringGrid 에서 오른쪽 마우스 버튼을 클릭하여 컨텍스트 팝업 메뉴에서 “Link to DB DataSource”를 선택합니다. “select a data source” 리스트에서 DataSource1를 선택하고 OK 버튼을 클릭합니다.
  • 37. 37 클라이언트 폼 위에 2개의 컴포넌트가 추가 되어 나타납니다:  BindScopeDB - 라이브바인딩을 사용하여 액세스 하고 싶은 모든 컴포넌트에 지정된 데이터소스에 의해 포함된 데이터를 확인하기 위한 방법을 제공하는 비-시각적 컴포넌트.  BindingsList – 메소드 및 출력 컨버터등 라이브바인딩 표현을 모두 포함하는 비 시각적 컴포넌트. 폼의 BindDBNavigator 컴포넌트를 선택하고 오브젝트 인스펙터에서 드롭-다운 메뉴에서 BindScope 속성을 “BindScopeDB1”로 지정합니다. ClientDataSet의 Active 속성을 True로 설정합니다. TStringGrid 에서 라이브 employee 데이터를 보실 수 있습니다. InterBase 데이터베이스에서 데이터와 메타 데이터를 구해오는 DataSnap 서버에 DataSnap 연결을 통해 데이터와 메타 데이터를 가져오고 있습니다. ClientDataSet의 Active 속성을 False로 설정합니다. 클라이언트 프로그램은 다음 단계에서 추가하는 체크박스의 OnChange 이벤트 핸들러를 사용하여 ClientDataSet의 Active 속성을 토글링 합니다. 클라이언트 측에 DataSnap 액세스 및 ClientDataSet 컴포넌트를 추가하고 DataSnap 클라이언트의 속성들을 설정 한 후, 폼은 다음과 같아야 합니다:
  • 38. 38 13 단계 – 체크박스에 대한 이벤트 핸들러를 추가하고 업데이트 버튼 적용하기 먼저 서버 연결에 대한 확인 체크박스의 OnChange 이벤트 핸들러를 추가합니다. 체크 박스를 선택하고 오브젝트 인스펙터의 이벤트 탭을 선택하고 기본 골격 코드를 생성하기 위해 OnChange 이벤트를 더블 클릭합니다. DataSnap 서버 연결을 열기/닫기 하고 ClientDataSet을 활성화/비활성화하는 다음 코드를 추가합니다: // Delphi procedure TForm1.CheckBox1Change(Sender: TObject); begin // if Connect to Server is checked then //open the DataSnap server connection //activate the ClientDataSet if CheckBox1.IsChecked then begin SQLConnection1.Connected := True; ClientDataSet1.Active := True end // if Connect to Server is not checked then //deactivate the ClientDataSet //close the DataSnap server connection else begin ClientDataSet1.Active := False; SQLConnection1.Connected := False end; end;
  • 39. 39 // C++ void __fastcall TForm1::CheckBox1Change(TObject *Sender) { // if Connect to Server is checked then //open the DataSnap server connection //activate the ClientDataSet if (CheckBox1->IsChecked) { SQLConnection1->Connected = True; ClientDataSet1->Active = True; } // if Connect to Server is not checked then //deactivate the ClientDataSet //close the DataSnap server connection else { ClientDataSet1->Active = False; SQLConnection1->Connected = False; } } "업데이트 적용하기" 버튼의 OnClick 이벤트 핸들러를 추가합니다. 위와 같이 이벤트 핸들러의 기본 골격을 생성하고 다음 코드를 추가합니다: // Delphi procedure TForm1.ApplyUpdatesButtonClick(Sender: TObject); begin ClientDataSet1.ApplyUpdates(0); end; // C++ void __fastcall TForm1:: ApplyUpdatesButtonClick(TObject *Sender) { ClientDataSet1->ApplyUpdates(0); } 스트링그리드에서 데이터를 변경할 때 변경된 내용이 ClientDataSet의 Delta (Published 가 아님)속성에 저장되고 있습니다. 델타는 클라이언트를 통해 삽입된, 수정된, 삭제된 레코드에 대한 정보만 포함합니다. 클라이언트 데이터 셋이 프로바이더에 연결될 때, 델타는 ApplyUpdates와 Reconcile 메소드에 매개변수로 전달되고 데이터베이스를 업데이트하기 위해 변경 로그의 정보를 사용합니다. 업데이트를 성공적으로 하고 돌아온 후, 델타는 지워집니다. ApplyUpdates는 업데이트 프로세스를 중단하기 전에 오류의 최대 수를 나타내는, MaxErrors, 하나의 매개 변수를 사용합니다. 프로바이더는 업데이트 프로세스를 중단하기 전에 허용 되야 합니다. MaxErrors 가 0 이면, 업데이트 오류가 발생하자마자, 전체 업데이트 과정이 종료됩니다. 어떠한 변경 사항도 데이터베이스에 기록되지 않고 클라이언트 데이터 셋의 변경 로그는 그대로 유지됩니다. MaxErrors 가 -1 이라면, 모든 오류는 묵인되고 변경 로그가 성공적으로 적용한지 못한 모든 기록이 포함되어 있습니다. MaxErrors는 양수 값이라면, MaxErrors에 의해 지정된 것보다 더 많은 오류가 발생하는 경우 모든 업데이트가 중단됩니다. MaxErrors에 의해 지정된 것보다 적은 오류가 발생하면 성공적으로 적용된 모든 레코드들은 자동으로 클라이언트 데이터셋의 변경 로그로부터 지워집니다. ApplyUpdates는 MaxErrors 보다 항상 작거나 1 더한 수와 같은, 실제 발생하는 오류의 수를 반환합니다. 이 반환 값은 데이터베이스에 기록 할 수 없는 레코드의 수를 나타냅니다. 클라이언트 데이터셋의 ApplyUpdates 메소드는 다음을 수행합니다:  그것은 간접적으로 프로바이더의 ApplyUpdates 메소드를 (이 경우 TCP / IP를 통해 DataSnap 서버에서 DataSnap 클라이언트로) 호출합니다. 프로바이더의 ApplyUpdates 메소드는
  • 40. 40 데이터베이스에 업데이트를 기록하고 발생하는 오류를 수정하려고 시도합니다.  이 오류 조건 때문에 적용 할 수 없는 레코드들은 클라이언트 데이터셋으로 반송됩니다.  클라이언트 데이터 셋의 ApplyUpdates 메소드는 Reconcile 메소드를 호출하여 문제 레코드를 조정하려고 시도합니다. Reconcile은 OnReconcileError 이벤트 핸들러를 호출하는 오류 처리 루틴입니다. 오류를 수정하기 위해 OnReconcileError 이벤트 핸들러를 코딩 해야 합니다.  마지막으로, Reconcile은 새로 업데이트 된 레코드를 반영하기 위한 변경 로그 및 업데이트 데이터에서 성공적으로 적용된 변경 사항을 제거합니다. 조정이 완료될 때, ApplyUpdates는 발생한 오류의 수를 보고합니다. DataSnap 서버 측과 DataSnap 클라이언트 측에서 업데이트 과정 동안 발생하는 오류를 처리하도록 하는 두 가지 이벤트가 있습니다:  DataSnap 서버 측에서: 업데이트 프로세스를 수행하는 동안, 데이터셋 프로바이더는 처리 할 수 없는 업데이트가 발생할 때마다 OnUpdateError 이벤트를 생성합니다. OnUpdateError 이벤트 핸들러에서 문제를 올바르게 수정한다면, 오류는 ApplyUpdates 메소드에 전달된 오류의 최대 수에 포함되지 않습니다.  DataSnap 클라이언트 측에서: 전체 업데이트 작업이 완료되면 클라이언트 데이터 셋 프로바이더는 데이터베이스 서버에 적용 할 수 없는 모든 레코드에 대한 OnReconcileError 이벤트를 생성합니다. 위의 이벤트 핸들러에서 오류 처리하지 않고 ApplyUpdates 매개 변수가 0으로 설정되어 있습니다. 심지어 적용할 수 없는 반환 레코드를 삭제하더라도 실제 애플리케이션에서는 항상 OnReconcileError 또는 UpdateError 이벤트 핸들러에서 항상 코드를 작성해야 합니다. 두 이벤트에 대한 이벤트 핸들러는 같은 방법으로 작업합니다. 다음과 같은 매개변수를 포합합니다:  DataSet: 클라이언트 데이터셋은 적용하지 않지 못한 업데이트된 레코드들을 포함합니다. 문제를 해결하기 위해 문제 레코드에 대한 정보를 얻고 레코드를 편집하기 위해 데이터셋의 메소드를 사용할 수 있습니다. 특히 CurValue, OldValue및 업데이트 문제의 원인을 결정하기 위해 현재 레코드 안의 필드의 NewValue 속성을 사용하려는 것입니다. 그러나 이벤트 핸들러에서 현재 레코드를 변경하는 클라이언트 데이터셋의 메소드를 호출 할 수 없습니다.  E: 발생된 문제를 나타내는 오브젝트. 오류 메시지를 추출하거나 업데이트 오류의 원인을 확인하려면 이 예외를 사용할 수 있습니다.  UpdateKind: 생성된 오류 업데이트 유형. UpdateKind는 ukModify (수정된 기존의 레코드 업데이트 시 문제가 발생합니다), ukInsert (새로운 레코드를 입력할 때 문제가 발생합니다) 또는 ukDelete (기존의 레코드 삭제 시 문제가 발생합니다)가 될 수 있습니다.  Action: 이벤트 핸들러가 종료할 때 어떤 조치를 취할 지 알려주는 매개변수. 이벤트 핸들러에서, 이 매개변수를 다음과 같이 지정합니다. ο 변경 로그에 내용을 그대로 남겨 놓은 채 이 레코드를 건너뜁니다. (rrSkip 또는 raSkip) ο 전체 조정 작업을 중단합니다. (rrAbort 또는 raAbort) ο 서버에 해당 레코드에 실패한 수정을 병합합니다(rrMerge 또는 raMerge). 서버 레코드가 클라이언트 데이터셋에서 수정된 필드에 모든 수정을 포함하지 않는 경우에만 효과가 있습니다.
  • 41. 41 ο 아마도 수정 된 이벤트 핸들러에서 레코드의 값으로 변경 로그에서 현재 업데이트를 대체합니다. (rrApply 또는 raCorrect) ο 완전히 오류를 무시합니다. (rrIgnore) 이 가능성은 OnUpdateError 이벤트 핸들러에만 존재하고, 이벤트 핸들러는 데이터베이스 서버로 다시 업데이트를 적용하는 경우를 위한 것입니다. 프로바이더가 업데이트를 적용 한 것처럼 업데이트 된 레코드는 변경 로그에서 제거되고 데이터에 통합됩니다. ο 클라이언트 데이터셋에서 이 레코드에 대한 변경 사항을 백업하고 원래 제공된 값으로 되 돌립니다. ο (raCancel) 이 가능성은 OnReconcileError 이벤트 핸들러에 만 있습니다. ο 서버의 레코드와 일치하도록 현재 레코드가 값을 업데이트합니다. (raRefresh) 이 가능성은 ο OnReconcileError 이벤트 핸들러에서만 존재합니다. ClientDataSet에 대한 더 많은 정보는, 캐리 젠슨의 훌륭한 책, “델파이 깊이보기: 클라이언트 데이터셋”을 확인해야 합니다 http://www.jensendatasystems.com/cdsbook/. 또한 ClientDataSet에 대한 블로그 게시물에서 캐리 젠슨의 시리즈를 보실 수 있습니다(또는 다운로드) http://caryjensen.blogspot.com/search?q=clientdataset 14 단계 – 저장 프로시저 호출 버튼의 이벤트 핸들러 코드 추가하기 이 단계는 TButton TEdit 박스와 GetProject 버튼을 사용하여 직원의 번호를 가지고 인터베이스 데이터베이스의 GET_EMP_PROJ 저장 프로시저를 실행하고 프로젝트 ID를 반환하는 DataSnap 서버 메소드 호출하고 반환 값을 TLabel의 Text 속성에 표시하는 이벤트 핸들러를 작성하는 방법을 보여줍니다. “프로젝트 가져 오기" 버튼의 OnClick 이벤트에 대한 이벤트 핸들러 기본 골격을 만듭니다. 저장 프로시저가 정수 값이 사용하기 때문에, TEdit의 사원 번호 텍스트를 정수로 변환해야 하고 결과적으로 프로젝트 ID 문자열을 반환하는 데이터베이스 저장 프로시저를 호출하는 서버 메소드를 호출합니다. 다음은 이벤트 핸들러 코드입니다: // Delphi procedure TForm1.GetProjectButtonClick(Sender: TObject); var mykey : Integer; //variable to hold text from edit box myServer : TDSServerModule1Client; //server proxy we will call projectIDString : string;// returned from stored proc begin // If DataSnap server is connected call the remote method if SQLConnection1.Connected then begin mykey := StrToInt(Edit1.Text); //conversion to integer // Server creation using the SQLConnection for communication myServer := TDSServerModule1Client.Create( SQLConnection1.DBXConnection); try // Calling method that calls stored procedure with the key // Save value returned from stored procedure projectIDString := myServer.callStoredProcedure(mykey); // if returned string is empty then display no projectID if projectIDString = '' then Label1.Text := '* NoProjID *' else Label1.Text := projectIDString finally myServer.Free //free up the server end
  • 42. 42 end end; // C++ void __fastcall TForm1::GetProjectButtonClick(TObject *Sender) { // If DataSnap server is connected call the remote method if (SQLConnection1->Connected) { int mykey; //variable to hold text from edit box String projectIDString;// returned from stored proc TDSServerModule1Client *myServer; //server proxy we’ll call mykey = StrToInt(Edit1->Text); //conversion to integer // Server creation using the SQLConnection myServer = new TDSServerModule1Client( SQLConnection1->DBXConnection); try { // Calling method that calls the stored proc with the key. // Save value returned from stored procedure. projectIDString = myServer->callStoredProcedure(mykey); // if returned string is empty then display “* noProjID *” if (projectIDString == "") Label1->Text = "* NoProjID *"; else Label1->Text = projectIDString; } __finally { delete myServer; //free up the server } } } 앞의 코드는 저장 프로시저를 호출해서 반환 된 값 즉, 프로젝트 ID값을 TLabel의 Text 속성에 지정합니다. 저장 프로시저가 사원(NULL 문자열)의 프로젝트 ID를 찾을 수 없다면, TLabel의 Text 속성에 "* NoProjID *"텍스트를 표시합니다. File > Save All을 선택하여 수정 된 모든 소스 파일들, 프로젝트 및 프로젝트 그룹을 저장합니다. 15 단계– 윈도우 DataSnap 클라이언트 애플리케이션 빌드와 실행하기 이제 프로젝트의 윈도우 클라이언트 측을 빌드하고 실행 할 준비가 되었습니다. 프로젝트 매니저에서 DelphiDBDataSnapClient 또는 CppDBDataSnapClient에서 오른쪽 마우스 버튼을 클릭하여 클라이언트 프로젝트를 빌드하고 발견되는 모든 오류를 수정합니다. "서버에 연결” 체크박스를 사용하여 클라이언트 애플리케이션을 실행합니다.  체크되었다면, DataSnap 서버에 연결하고 ClientDataSet을 활성화합니다.  체크되어 있지 않다면 ClientDataSet을 비활성화 하고 DataSnap 서버 연결을 끊습니다. TStringGrid은 직원 테이블로부터 가져온 항목으로 채워집니다. TBindNavigator 컨트롤 또한 테이블 항목을 탐색할 수 있도록 활성화합니다. TStringGrid에서 셀을 선택하고 값을 변경할 수 있습니다. "업데이트 적용하기" 버튼을 클릭하면 데이터베이스 테이블은 이 변경 사항으로 업데이트됩니다. 마지막으로, 저장 프로시저를 테스트합니다. TEdit 컨트롤에서 유효한 직원 번호 중 하나를 입력하고 "프로젝트 가져 오기”버튼을 클릭합니다. 라벨의 텍스트에 EMPLOYEE_PROJEC T 테이블로부터, 하나가 존재하는 경우, 반환되는 해당 프로젝트 ID로 변경해야 합니다 그렇지 않으면 "* 없음 ProjectID의 *"를
  • 43. 43 표시합니다: 체크박스가 선택되어 있으며 저장 프로시저를 테스트를 완료한 경우 클라이언트 프로그램 폼은 다음과 같이 표시됩니다: 16 단계 – 맥 DataSnap 클라이언트 애플리케이션 빌드 및 실행하기 전에 언급했듯이, DataSnap 클라이언트 애플리케이션 맥 버전을 만들 수 있습니다. 프로젝트 매니저에서 DataSnap 클라이언트의 타깃 플랫폼 노드에서 오른쪽 마우스 버튼으로 클릭하고 대상으로 "OS X"를 추가합니다. 또한 타깃 플랫폼에 대한 원격 프로파일을 설정해야 합니다. 또한 PAServer이 맥에서 실행되고 있는지 확인해야 합니다(IDE는 맥에 내장 된 애플리케이션을 배포 할 수 있도록 PAServer 실행이 필요합니다). 또한 DataSnap 클라이언트를 빌드하고 원격 윈도우 타깃에 배포하려면 다음과 같은 단계를 실행합니다. 또한 클라이언트의 SQLConnection 컴포넌트에 대한 “HostName” 매개 변수를 로컬 호스트에서 DataSnap 서버가 실행중인 컴퓨터 네트워크 이름 또는 TCP / IP 주소로 변경해야 합니다. 오브젝트 인스펙터를 사용하여 SQLConnection1 컴포넌트의 Params 속성을 두 번 클릭 하여 값(Value)
  • 44. 44 리스트 에디터를 표시합니다. 이미 DataSnap 서버를 가리키는 DataSnap의 dbExpress 커넥션을 사용하는 새로운 DataSnap 연결을 변경 또는 생성하는 경우 이 단계를 건너 뛸 수 있습니다. 이 경우, 디폴트 DataSnap 연결 이름을 사용하였고 디폴트 HostName은 “localhost”입니다. HostName 값을 설치를 위한 컴퓨터 이름 또는 TCP/IP 주소로 지정합니다. DataSnap 클라이언트 애플리케이션을 빌드하고 맥에 배포하기 전에 마지막으로 설정해야 하는 것은 클라이언트가 ClientDataSet을 사용하기 때문에 클라이언트 프로젝트의 배포 옵션에 Midas 라이브러리 기능 파일을 추가 합니다. Project > Deployment를 사용하여 기능 파일 아이콘을 클릭하여 MIDAS 라이브러리를 선택합니다 (프로젝트 배포는 3장 개발환경에서 다루었습니다). 맥 버전을 테스트 할 수 있도록 맥 DataSnap 클라이언트 실행파일과 함께 MIDAS.dylib를 배포합니다. Run without Debugging (Shift-Control-F9) 또는 Run (F9)을 선택하여 DataSnap 클라이언트 애플리케이션을 컴파일하고 맥에 배포합니다. 윈도우에서 실행되고 있는 DataSnap 서버와 작업할 수 있는지 확인하기 위해 맥에서 클라이언트를 테스트합니다. 맥 DataSnap 클라이언트 애플리케이션은 윈도우 클라이언트처럼 작동합니다.
  • 45. 45 윈도우 및 맥 용 첫 멀티 클라이언트, 멀티 플랫폼, 멀티-티어 DataSnap 데이터베이스 애플리케이션을 작성했습니다! DataSnap 멀티-티어 애플리케이션 개발에 더 배울 것이 있습니다. 예를 들어, 변경 사항이 있고 서버 연결 체크박스가 선택되어 있지 않다면 적용되어야 하는 모든 업데이트가 데이터셋에 있는지 보기 위해 체크하지 않았습니다. 클라이언트 데이터셋을 비활성화하고 DataSnap 서버 연결을 끊기 전에 항상 ApplyUpdates를 호출 할 수 있습니다. 적용 할 업데이트가 없을 때 ApplyUpdates을 호출하면 서버에 아무 것도 보내자 않으며 런타임 오류가 발생합니다. 또한 델파이 및 C + + DataSnap 서버 애플리케이션 및 / 또는 DataSnap 클라이언트 애플리케이션을 모두 구축할 수 있습니다. 같은 기능을 가지고 있기 때문에, 하나의 서버와 다른 클라이언트를 사용하여 혼합하고 매치 시킬 수 있습니다. 자세한 내용을 배우려면, RadPHP를 사용하여 DataSnap 클라이언트 애플리케이션을 작성 할 수 있습니다 – 그리고 DataSnap 모바일 커넥터 기술을 사용하여 모바일 클라이언트 애플리케이션을 작성할 수 있습니다 http://docwiki.embarcadero.com/RADStudio/en/DataSnap_Connectors_for_Mobile_Devices . DataSnap 애플리케이션을 구축하는 방법에 대한 자세한 동영상 및 기사가 있습니다:  델파이 연습: DataSnap XE – 멀티-티어 데이터베이스 애플리케이션 - http://edn.embarcadero.com/article/41189  DataSnap XE2 – 새로운 기능과 개선 사항 - http://cc.embarcadero.com/Item/28542  REST 및 모바일 DataSnap 클라이언트 개발 - http://cc.embarcadero.com/Item/28543  DataSnap을 사용한 순수 REST 서버 작성 - http://cc.embarcadero.com/Item/28561 REST, 웹브로커 및 서비스 기반 DataSnap 서버 애플리케이션 작성
  • 46. 46 파이어몽키 HD, VCL 폼, 콘솔 또는 서비스 기반 DataSnap 애플리케이션 서버를 구축하는 대신에 DataSnap의 REST 서버 애플리케이션 및 DataSnap의 웹브로커 서버 애플리케이션을 작성할 수 있습니다. 이런 DataSnap 서버 애플리케이션 타입들도 또한 쉽게 작성할 수 있습니다. 하지만 “파이어몽키 시작하기” 코스 범위밖에 있습니다. 엠바카데로 DocWiki에서 DataSnap 이러한 서버의 유형을 작성하는 방법의 자세한 내용을 확인할 수 있습니다.  DataSnap REST 애플리케이션 마법사 - http://docwiki.embarcadero.com/RADStudio/en/DataSnap_REST_Application_Wizard  DataSnap 웹브로커 애플리케이션 마법사 - http://docwiki.embarcadero.com/RADStudio/en/DataSnap_WebBroker_Application_Wizard  DataSnap 서버 마법사 - http://docwiki.embarcadero.com/RADStudio/en/DataSnap_Server_Wizard DataSnap 바이트 스트림 필터링 DataSnap 클라이언트와 DataSnap 서버 사이의 통신은 필터들에 의해 가로채기 될 수 있습니다. 각 필터는 암호화 및/또는 압축과 같은 바이트 스트림으로 변환을 수행 할 수 있습니다; 바이트 스트림은 하나 이상의 필터에 의해 가로채기 되고 하나의 출력은 다음 필터의 입력이 됩니다. 필터는, DSTCPServerTransport.TDSTCPServerTransport 와 같은 DataSnap 서버 전송 컴포넌트의 Filters 속성을 설정하여, 설계 시점(또는 코드)에서 바이트 스트림에 연결됩니다.
  • 47. 47 필터들이 RAD Studio에 등록 된 패키지에 있다면 디자인 타임에 사용할 수 있습니다. 이 필터는 패키지에 내장되어 있어야 하며 패키지는 델파이에 설치해야 합니다. 서버 측 설계 시간 지원은 필터 목록 편집기에 필터를 표시할 수 있습니다. 클라이언트 측 설계 시간 지원은 TSQLConnection을 사용하여 디자인 타임 연결을 할 수 있습니다. 클라이언트와 서버 사이의 핸드 셰이크 프로토콜을 기반으로 자동으로 인스턴스화 되는 것처럼 클라이언트 측에서 필터를 연결할 필요가 없습니다. 따라서 클라이언트 코드가 필터링 서버에 연결하기 전에 Uses 절에 유니트 이름을 추가하여 또는 초기화 시간 등 초기 단계에 필터를 등록하는 것이 중요합니다.
  • 48. 48 또한 DataSnap 서버와 클라이언트를 위한 자신의 필터를 만들 수 있습니다. 해야 할일 세 가지가 있습니다: 필터를 정의하고, 필터 코드를 구현하고, 필터를 등록합니다. 필터 정의 모든 필터는 TTransportFilter 클래스에서 확장해야 하며 구현은 최소한 두 개의 메소드 ProcessInput, ProcessOutput와 식별하는 고유한 ID를 제공해야 합니다. public function ProcessInput(const Data: TBytes): TBytes; override; function ProcessOutput(const Data: TBytes): TBytes; override; function Id: UnicodeString; override; 처리 매소드는 서로 반대입니다: 한 메소드의 결과값이 초기 입력을 생산하는 다른 메소드의 입력으로 전달됩니다. 각 연결은 필터를 인스턴스 하기 때문에 처리 함수가 스레드 안전이 필요하지 않습니다; 지역 변수는 인스턴스 변수로 사용할 수 있지만 인스턴스 전체 상태를 가정하지 않습니다. 기본으로 매개 변수가 없는 생성자는 필터 인스턴스를 인스턴스화 하는데 사용됩니다. 추가 매개 변수는 서버 인스턴스와 호환되는 클라이언트 인스턴스가 필요할 수 있습니다. 매개 변수 값은 서버 측 필터 및 클라이언트 측 필터간에 교환 할 수 있습니다. 예를 들어, 암호화 키의 위치와 함께 전달되는 경우 대칭 암호화 필터를 구현하기 위해 하나가 선택되어야 한다면 매개변수가 필요합니다. 모든 매개 변수는 쌍으로(이름, 문자열) 노출됩니다. 그들의 이름은 GetParameters 메소드를 통해 반환 할 수 있으며, 그 값은 질의되거나 GetParameterValue 및 SetParameterValue를 사용하여 변경할 수 있습니다. protected function GetParameters: TDBXStringArray; override; public function GetParameterValue(const ParamName: UnicodeString): UnicodeString; override; function SetParameterValue(const ParamName: UnicodeString; const ParamValue: UnicodeString): Boolean; override; 어떤 경우에는 모든 매개 변수 또는 그 매개 변수의 일부는 디자인 타임에 변경해야 합니다, 매개변수 이름은 GetUserParameters 메소드를 통해 구합니다. protected function GetUserParameters: TDBXStringArray; override; 이 메소드에 의해 반환되지 않는 매개 변수 이름은 디자인 타임에 표시하거나 편집 할 수 없습니다 있습니다. 필터 코드 구현 위의 정의 된 함수를 구현하는 데 필요한 코드를 작성합니다. 예를 보실 수 있습니다. TTransportFilter 클래스는 Data.DBXTransportFilter.pas 소스 파일에 정의되고 구현되어 있습니다.
  • 49. 49 세 전송 필터는 다음과 같은 소스 파일에 구현되어 있습니다:  RSA - Data.DBXRSAFilter.pas  Zlib Compression - Data.DbxCompressionFilter.pas 필터 등록 필터는 TTransportFilterFactory 싱글로 등록됩니다. 필터를 등록 하는 권장 방법은 유니트의 initialization 및 finalization 섹션을 통해 할 수 있지만 사용자의 애플리케이션에서 initialization절을 통해 코딩 할 수 있습니다. 아래는 사용 가능한 압축 필터를 등록하는 코드 입니다: Initialization TTransportFilterFactory.RegisterFilter( TTransportCompressionFilter); finalization TTransportFilterFactory.UnregisterFilter( TTransportCompressionFilter); 암호화 필터 암호화 필터는 DataSnap 바이트 스트림을 암호화하는 데 사용됩니다. 암호화 필터는 서버 측에서뿐만 아니라 클라이언트 측에서 작동합니다. 다음 줄에서 암호화 필터의 동작이 설명되어 있습니다. 서버 측:  DSTCPServerTransport.TDSTCP ServerTransport 와 DSHTTP.TDSHTTPService 컴포넌트 모두 Filters 속성이 있습니다. 필터 속성을 선택하면 제공되는 대화 상자에 새 필터를 추가 할 수 있습니다. FilterId 속성에서 PC1 또는 RSA를 선택할 수 있습니다.  PC1 암호화 필터를 사용하는 경우, Properties 속성은 암호화에 사용할 키 값을 가지고 있습니다.  RSA 필터를 사용하는 경우, Properties 속성은 세 가지 속성 UseGlobalKey, KeyLength, 그리고 KeyExponent 목록을 보유하고 있습니다. 클라이언트 측:  TSQLConnection의 Driver 속성은 Filters 속성을 가지고 있습니다. 이러한 방법으로, 실제로 클라이언트/서버를 실행할 때, 그 둘 간의 통신이 암호화 됩니다. DataSnap 클라이언트/서버 애플리케이션의 암호화 필터를 사용하는 동안 고려해야 할 몇 가지가 있습니다:  데이터 암호화는 씬 클라이언트와 함께 사용할 수 없습니다.  서버가 암호화 필터를 가지고 있다면 클라이언트는 없습니다. 클라이언트가 자동으로 필터를 추가합니다.  클라이언트가 암호화 필터를 가지고 있지만 서버가 가지고 있지 않다면, 클라이언트의 필터를 버리고 사용하지 않습니다.
  • 50. 50 압축 필터 압축 필터는 ZLib을 기반으로 DataSnap 바이트 스트림에 대한 압축 기능을 제공합니다. 압축 필터는 서버 측과 클라이언트 측 모두에서 작동합니다. DSTCPServerTransport.TDSTCPServerTransport 와 DSHTTP.TD SHTTPService 컴포넌트는Filters 속성을 자지고 있습니다. 새 필터를 추가하는 곳으로 FilterId 속성에 ZLibCompression을 설정합니다. 또한 Properties 속성을 설정하여 압축 필터의 속성을 지정할 수 있습니다. 델파이 연구: DataSnap 시리즈 - 에피소드 6: "DataSnap 전송 필터" 백서에서 델파이 DataSnap 애플리케이션에서 필터를 사용하는 방법을 보여줍니다. http://edn.embarcadero.com/article/41293
  • 51. 51 윈도우와 맥 애플리케이션에서 웹 서비스 사용하기 웹 서비스 애플리케이션은 클라이언트가 특정 플랫폼이나 프로그래밍 언어를 사용 할 필요가 없는 서버 구현입니다. 이러한 애플리케이션은 언어 중립적인 문서에 인터페이스를 정의하고 여러 통신 메커니즘을 허용합니다. 웹 서비스는 먼저 단순 개체 액세스 프로토콜(SOAP)을 사용하여 작동하도록 설계되었습니다 - http://en.wikipedia.org/wiki/SOAP SOAP은 분산 환경에서 정보를 교환하기 위한 표준 경량 프로토콜입니다. SOAP은 원격 프로시저 호출을 인코딩 하기 위해 XML을 사용하고 일반적으로 통신 프로토콜로 HTTP를 사용합니다. SOAP 웹 서비스 애플리케이션은 웹 서비스 정의 언어 (WSDL)를 사용합니다, http://www.w3.org/TR/wsdl 사용할 수 있는 인터페이스와 호출하는 방법에 대한 정보를 게시하는 문서입니다. 서버 측면에서 애플리케이션은 웹 서비스를 설명하는 WSDL 문서를 게시 할 수 있습니다. 클라이언트 측에서, 마법사 또는 커맨드-라인 유틸리티는 인터페이스 정의와 필요한 연결 정보를 제공하는 WSDL 문서를 가져올 수 있습니다. 이미 구현하려는 웹 서비스를 설명하는 WSDL 문서가 있다면 WSDL 문서를 가져올 때, 서버 측 코드를 생성 할 수 있습니다. 또 다른 웹 서비스 소프트웨어 아키텍처, REST 기반 웹 서비스는 월드 와이드 웹 표준이 최근 몇 년 동안 등장했습니다. REST는 representational State Transfer의 약자로 HTTP v1.1 함께 작동하도록 만들어졌습니다. REST는 캘리포니아 대학 로이 박사의 논문, "네트워크 기반 소프트웨어 아키텍처의 디자인 및 스타일“에서 시작 되었습니다. 다음에서 로이 박사의 논문을 보실 수 있습니다http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm (Fielding, Roy Thomas. 네트워크 기반 소프트웨어 아키텍처의 디자인 및 스타일. 박사 학위 논문, 캘리포니아 대학 어바인, 2000). 논문의 제 5 장은 REST를 소개합니다 - http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm . Rest 제약 조건에 부합하는 것을 RESTful로 지칭합니다. RESTful 웹 서비스는 HTTP (하이퍼텍스트 전송 프로토콜)와 REST의 원칙을 사용하여 구현됩니다. REST 서버가 네 가지 종류의 요청에 대한 서비스를 제공 할 수 있다고 가정해 보겠습니다: GET, POST, PUT, 및 DELETE. 이러한 작업들은 검색, 업데이트, 삽입 및 데이터 작업 삭제를 나타냅니다. 이러한 작업들은 매핑 프로토콜을 통해 서버 메소드로 동화되어 있습니다. REST는 각 서버 메소드가 URI (동일한 리소스 식별자) 경로, 메소드 이름 및 매개변수 사이의 매핑을 취하는 디스패치 메커니즘을 통해 위의 작업 중 하나로 호출될 수 있다고 가정합니다.