서버 애플리케이션에서 ABBYY FineReader Engine을 사용할 때는 몇 가지 특이 사항이 있습니다.
하나의 프로세스 내 여러 스레드에서 여러 독립적인 요청을 동시에 처리해야 합니다
엔진은 고성능 멀티 CPU 컴퓨터의 서버 운영 체제에서 실행됩니다
특수 계정(Network Service, Local Service, ASPNET)으로 사용됩니다
ABBYY FineReader Engine 12를 개발할 때는 위와 같은 특이 사항을 고려했으며, 서버 프로세스의 일부로 또는 별도의 프로세스에서 스레드로부터 안전한 FineReader Engine 객체를 가져올 수 있도록 하는 도구를 API에 포함했습니다. 여러 프로세스에서 FineReader Engine을 사용하면 동시에 작동하는 객체 풀을 만들고 서버 컴퓨터의 전체 CPU 성능을 활용할 수 있습니다. 이는 대부분의 서버 시나리오에서 가장 적합한 접근 방식입니다.
서버 애플리케이션에 엔진을 로드하는 가장 좋은 방법은 COM을 통해 별도의 프로세스에서 아웃오브프로세스 서버로 로드하는 것입니다. 이 방법을 사용하면 멀티스레딩과 관련된 모든 문제가 자동으로 해소됩니다. 모든 ABBYY FineReader Engine 객체에 대한 작업은 COM을 통해 직렬화되므로, 여러 프로세스에서 여러 엔진 인스턴스를 생성하고 서버 프로세스 내에서 이를 동시에 사용할 수 있습니다. 또한 이 방법은 사용하기도 쉽습니다. Engine 객체는 IEngineLoader 인터페이스를 구현하는 OutprocLoader 객체를 사용해 로드합니다.
C# 코드
IEngineLoader engineLoader = new FREngine.OutprocLoader();IEngine engine = engineLoader.InitializeEngine( customerProjectId, licensePath, licensePassword, "", "", false );// 별도의 프로세스에서 Engine을 가져왔습니다try { ...} finally { engineLoader.ExplicitlyUnload(); // 더 이상 필요하지 않으면 언로드할 수 있습니다}
하지만 이 방법에도 한 가지 중요한 단점이 있습니다. 특수 계정과 함께 이 방법을 사용할 경우, 해당 계정으로 OutprocLoader를 실행하기 위한 권한이 필요할 수 있습니다. 그러나 서버 제품에서는 이 점과 FREngine.dll을 등록해야 한다는 점이 그다지 큰 문제가 되지 않습니다. 서버 애플리케이션은 일반적으로 숙련된 관리자가 소수의 컴퓨터에 설치하기 때문입니다.
계정 권한은 DCOM Config 유틸리티를 사용해 설정할 수 있습니다(명령줄에 DCOMCNFG를 입력하거나 제어판 > 관리 도구 > 구성 요소 서비스를 선택). 콘솔 트리에서 Component Services > Computers > My Computer > DCOM Config 폴더를 찾은 다음, ABBYY FineReader Engine 12.5 Loader (Local Server)를 마우스 오른쪽 단추로 클릭하고 Properties를 클릭합니다. 그러면 대화 상자가 열립니다. Security 탭을 클릭합니다. Launch Permissions 아래에서 Customize를 클릭한 다음 Edit를 클릭하여 애플리케이션을 시작할 수 있는 계정을 지정합니다.
64비트 운영 체제에서는 등록된 DCOM 애플리케이션이 32비트 MMC 콘솔에 표시되며, 이 콘솔은 다음 명령줄을 사용하여 실행할 수 있습니다.
"mmc comexp.msc /32"
최종 사용자 컴퓨터에 애플리케이션을 설치할 때 FREngine.dll을 등록하려면 regsvr32 유틸리티를 사용하세요. 64비트 운영 체제를 사용 중인 경우 기본적으로 64비트 버전의 regsvr32가 실행됩니다. 다음 명령줄을 사용하세요:
regsvr32 /s /n /i:"<path to the Inc folder>" "<path to FREngine.dll>"
서버 애플리케이션을 디버깅할 때와 실행할 때 모두 Network 라이선스를 사용하는 것이 좋습니다.
또한 IHostProcessControl 인터페이스를 사용하면 호스트 프로세스의 우선순위를 관리하고 해당 프로세스의 활성 상태를 제어할 수 있습니다.ABBYY FineReader Engine을 로드하는 다른 방법도 있습니다. 하지만 이러한 방법에는 서버 애플리케이션에서의 사용을 크게 제한하는 몇 가지 특성이 있습니다.
ABBYY FineReader Engine은 현재 프로세스 내에서 인프로세스 서버로 COM을 통해 로드할 수 있습니다. 이 방법은 다중 스레딩과 관련된 모든 문제도 자동으로 해소해 줍니다(ABBYY FineReader Engine 객체에 대한 모든 작업은 COM을 통해 직렬화됨). 또한 사용하기도 쉽습니다. 하지만 이 방법으로는 여러 엔진 객체 인스턴스를 사용해 동시 처리를 구성할 수 없으므로 서버 성능이 여러 측면에서 제한됩니다. 이 방법의 또 다른 단점은 최종 사용자 컴퓨터에 애플리케이션을 설치할 때 FREngine.dll을 등록해야 한다는 점입니다.
FREngine.dll은 수동으로 로드할 수도 있습니다. 이것은 라이브러리를 로드하는 표준 방식입니다. 이 방법을 사용할 경우 엔진 객체에 대한 모든 작업은 엔진 객체가 초기화된 동일한 스레드 내에서 수행되어야 합니다. 또한 프로세스당 엔진 객체를 두 개 이상 초기화할 수 없습니다. 이 역시 서버 성능을 크게 제한합니다. 따라서 이 방법은 권장하지 않습니다. 이 방법의 한 가지 장점은 최종 사용자 컴퓨터에 애플리케이션을 설치할 때 FREngine.dll을 등록할 필요가 없다는 점입니다.
ABBYY FineReader Engine에서 사용할 수 있는 세 가지 로드 방법에 대한 자세한 설명은 엔진 객체를 로드하는 다양한 방법을 참조하세요.