본문 바로가기
delphi

Delphi XE를 이용한 ISAPI DLL 프로젝트 생성 및 배포 방법

by 천지조율 2024. 8. 7.

개요

Delphi XE 버전을 사용하여 IIS/Apache와 같은 웹 서버에서 사용할 수 있는 ISAPI 방식의 DLL 프로젝트를 생성하고 배포하는 방법을 알아보겠습니다. RAD Studio XE는 이미 오래전부터 제공되던 DataSnap에 추가적인 특징을 더하였으며, 이를 통해 ISAPI 필터를 빌드하고 Windows 2008 서버의 IIS 웹서버에 배포하는 방법을 설명합니다.

ISAPI의 장점

ISAPI를 이용하는 주요 장점들은 다음과 같습니다:

  • 기존 웹서버의 웹 포트(http:80)를 공유하여 사용
  • IIS를 통해 애플리케이션의 구동을 관리
  • IIS에서 제공하는 SSL 인증을 이용

개발 및 디버깅

DataSnap / REST ISAPI 필터를 제작하는 방법은 Stand-Alone형으로 VCL-Form을 이용하여 애플리케이션을 개발하고 디버깅하여 배포 전에 테스트하는 것이 용이합니다.

DataSnap / REST VCL Form 생성하기

  1. Delphi XE > File > New > Other 선택
  2. "Delphi Projects" 선택
  3. "Data Snap Server" 노드 선택
  4. "Data Snap REST Application" 선택

"OK" 버튼을 클릭하여 애플리케이션 생성 마법사를 실행합니다.

  • "Stand-Alone VCL Application" 옵션은 DataSnap/REST 서버 애플리케이션을 생성/테스트하기 위한 가장 편리한 방법입니다. 디버깅을 쉽게 할 수 있으며, VCL 메인 폼에서 직접 기능을 테스트할 수 있습니다.
  • "Stand-Alone Console Application" 옵션은 자동화된 테스트를 위해 적합한 대안입니다.
  • 모든 테스트가 끝나고 IIS 웹서버로 배포할 준비가 되었을 때 "ISAPI Dynamic Link Library" 옵션을 사용하여 전환할 수 있습니다.

포트 설정

기본 사용 포트는 "8080" 포트이며, 원하는 웹서버 포트로 변경할 수 있습니다. 하지만 기존 웹서버와 충돌을 피하기 위해 VCL-Form을 이용하여 서버를 테스트할 때는 적절한 포트를 선택해야 합니다. 포트가 이용 가능한지는 "Test Port" 버튼을 클릭하여 확인할 수 있습니다.

샘플 메소드 생성

**"Server Methods Class"**를 모두 체크하여 기본적인 샘플 메소드를 생성합니다. 이는 DataSnap 서버의 동작 매커니즘을 이해하는데 큰 도움이 됩니다. 생성된 샘플 메소드를 통해 서버와 클라이언트 간의 테스트를 수행할 수 있습니다.

서버 애플리케이션 테스트

위 프로그램을 컴파일하고 **"32bit-Windows"**로 빌드 후 실행하면 Stand-Alone형 서버 프로그램이 로딩됩니다. 프로그램 시작과 동시에 자동으로 시작되며, 보안 프로그램에 의해 "8080" 포트에 대한 접속 허용 여부를 결정하는 창이 나타날 수 있습니다. **"엑세스 허용"**을 클릭해야 서버가 클라이언트의 요청에 올바르게 응답할 수 있습니다.

테스트 URL

서버 모듈은 독립적으로 웹서버 응답 모듈을 포함하고 있으므로 일반 웹서버 접근 방식으로 테스트할 수 있습니다. 다음과 같이 테스트를 위한 URL을 입력합니다:

http://localhost:8080

"ReverseString" 버튼을 클릭하면 입력값의 역문자열이 반환되는 것을 확인할 수 있습니다. 서버 단에서 다양한 기능을 API로 구현하여 이용할 수 있습니다.

접속 제한 처리

서버 모듈의 WebModule에서 접근되는 IP 또는 MacAddress를 이용하여 접근 제한을 설정할 수 있습니다. 다음 코드는 로컬호스트 접근만 허용하도록 제한하는 예제입니다:

function TWebModule2.AllowServerFunctionInvoker: Boolean;
begin
  Result := (Request.RemoteAddr = '127.0.0.1') or
    (Request.RemoteAddr = '0:0:0:0:0:0:0:1') or (Request.RemoteAddr = '::1');
end;

새로운 API 추가

다음은 새로운 API를 추가하는 예제입니다:

unit ServerMethodsUnit1;

interface

uses System.SysUtils, System.Classes, Datasnap.DSServer, Datasnap.DSAuth;

type
  TServerMethods1 = class(TDataModule)
  private
    { Private declarations }
  public
    { Public declarations }
    function EchoString(Value: string): string;
    function ReverseString(Value: string): string;
    function Add(x, y: Integer): Integer; // 새로운 비즈니스 로직
  end;

implementation

{$R *.dfm}

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;

function TServerMethods1.Add(x, y: Integer): Integer;
begin
  Result := x + y;
end;

end.

위와 같이 새로운 비즈니스 로직을 추가하여 서버 기능을 확장할 수 있습니다.

ISAPI 모듈에서 DBExpress 이용

ISAPI 모듈 내에서 DBExpress를 이용하려면 CreateConnection 함수를 사용하여 데이터베이스 연결을 설정해야 할 수 있습니다. 다음 코드는 DBXUtils.pas에 포함된 유틸리티 함수를 활용하는 예제입니다:

function CreateConnection(const AName: string; AIniFile: string = ''): TSQLConnection;
var
  error1: string;
begin
  try
    if FileExists(ModuleIniFile) then
      Result := CreateConnectionIni(AName)
    else
    begin
      Result := nil;
      error1 := Format(StrIniWasNotFound, [ModuleIniFile]);
    end;
  except
    on E: Exception do
    begin
      error1 := E.Message;
      Result := nil;
    end;
  end;
  if not Assigned(Result) then
    try
      Result := CreateConnectionName(AName);
    except
      on E: Exception do
      begin
        raise Exception.CreateFmt(StrCouldNotOpenConnection,
          [AName, error1, E.Message]);
      end;
    end;
end;

위 코드는 .ini 파일을 찾지 못하면 예외를 발생시키고 dbxconnections.ini 파일을 참조하여 기본 정의된 연결 정보를 사용하여 데이터베이스 연결을 시도합니다.

ISAPI DLL 모듈로 전환

Stand-Alone 유형으로 만든 DataSnap 서버가 원하는 대로 동작한다면, IIS와 같은 웹서버의 80 포트를 공유하여 사용할 수 있도록 ISAPI DLL 서버로 전환할 수 있습니다.

프로젝트 파일 복사 및 설정

새 프로젝트를 생성하여 ISAPI DLL 모델로 프로젝트를 설정합니다. 그런 다음, Stand-Alone VCL 프로젝트 파일을 ISAPI 프로젝트 파일로 복사하고 빌드합니다. 이렇게 하면 .dll 파일이 생성됩니다.

IIS에서 ISAPI 모듈 테스트

IIS에 ISAPI 활성화

  1. IIS의 메인 노드를 선택한 후 **"ISAPI 및 CGI 제한"**을 더블클릭합니다.
  2. **"기능 설정 편집"**을 클릭하고 **"지정하지 않은 ISAPI 모듈 허용"**을 체크합니다.

가상 경로 생성

  1. 테스트하려는 웹사이트를 선택한 후 가상 경로를 설정합니다.
  2. 가상 경로를 응용 프로그램으로 변환합니다.

어플리케이션 풀 설정

  1. DefaultAppPool을 선택하고 **"고급 설정"**을 선택합니다.
  2. "프로세스 모델" 섹션의 "ID" 노드에서 **"ApplicationPoolIdentity"**를 지정합니다.

사용자 권한 설정

DataSnap 프로젝트 폴더에 쓰기 권한을 부여합니다. 이렇게 하면 DataSnap 애플리케이션이 올바르게 동작하도록 설정할 수 있습니다.

결론

Delphi XE를 이용한 ISAPI DLL 프로젝트의 생성과 배포 과정을 자세히 설명하였습니다. 이 방법을 통해 IIS와 같은 웹서버에서 효율적으로 DataSnap 애플리케이션을 운영할 수 있습니다. 위의 단계들을 따라가며 프로젝트를 진행하면, 안정적이고 확장 가능한 서버 애플리케이션을 구축할 수 있을 것입니다.