Fox Biz Service 기본 사용법¶
Fox Biz Service 는 FoxBizService 클래스에 의해 제공되는 동적 비즈니스 로직 디스패치 서비스 입니다. 클라이언트는 호출할 비즈니스 로직의 클래스 ID 와 메서드 ID를 포함하는 FoxBizRequest 객체를 매개변수로 FoxBizService 클래스의 Execute 메서드를 호출하고 그 결과를 FoxBizResponse 객체를 통해 받을 수 있습니다.
Note
개발자가 직접 FoxBizService 클래스의 인스턴스를 생성하여 Fox Biz Service 기능을 사용하는 경우는 거의 없습니다. 일반적으로 Fox Web API 나 ASP.NET Web API, gRPC 와 같은 통신 서비스에 Fox Biz Service 를 사용하여 클라이언트의 비즈니스 로직 요청을 처리하는 방법이 가장 일반적입니다. Fox Biz Service 를 Fox Web API 를 통해 호출하는 방법은 별도의 문서에서 설명합니다.
이 문서에서 설명하는 Fox Biz Service 를 직접 호출하는 내용은 Fox Web API 를 통해서 Fox Biz Service 를 호출할 때에도 그대로 적용이 가능합니다. 개발자의 코드가 FoxBizService 객체를 직접 호출하느냐 아니면 Fox Web API 를 통해 호출하느냐의 차이만 있을 뿐입니다.
시작하기¶
Fox Biz Service 를 사용하기 위해서는 NeoDEEX.ServiceModel.Services 패키지를 참조해야 합니다. 이 패키지에는 Fox Biz Service 와 Fox Data Service 를 구현하는 클래스들이 포함되어 있습니다. FoxBizService 클래스는 NeoDEEX.ServiceModel.Services.Biz 네임스페이스에 포함되어 있습니다.
Information
Fox Biz Service 는 Fox Web API 를 통해서 호출하는 것이 대부분이므로 Fox Web API 를 구현하는 NeoDEEX.ServiceModel.WebApi 패키지를 참조하면 자동으로 NeoDEEX.ServiceModel.Services 패키지도 참조됩니다. 따라서 Fox Web API 를 구현하는 경우에는 별도로 NeoDEEX.ServiceModel.Services 패키지를 참조할 필요가 없습니다.
Fox Web API 를 통해 Fox Biz Service 를 호출하지 않고 직접 Fox Biz Service 를 사용하고자 하는 경우 FoxBizService 클래스의 인스턴스를 생성하고 Execute 메서드를 호출할 수 있습니다. 다음 코드는 ASP.NET Web API 를 통해 Fox Biz Service 를 호출하는 코드의 예를 보여줍니다.
앞서 언급했듯이 위와 같은 코드보다는 직접 BizLogic2 클래스의 GetProduct 메서드를 호출하는 것이 더 효율적일 것입니다. 하지만 위와 같은 Web API 를 수백 수천개 만들어야 한다면 이야기가 달라집니다. 원격 클라이언트가 백엔드의 비즈니스 로직을 호출할 수 있도록 Web API 와 같은 서비스 계층을 모두 개발자가 작성하고 유지 보수해야 한다면 개발 생산성과 비용은 높아질 수 밖에 없습니다.
Fox Web API 와 함께 Fox Biz Service 는 불필요한 서비스 계층을 작성하지 않아도 수백, 수천 개의 비즈니스 로직을 원격 클라이언트가 호출할 수 있도록 해 줍니다. 다음은 백엔드의 비즈니스 로직 호출을 위해 Fox Biz Service 가 노출하는 Fox Web API 의 예를 보여줍니다. 원격 클라이언트는 이 Web API 하나를 통해 매우 다양한 비즈 클래스, 비즈 메서드를 호출할 수 있습니다.
Fox Web API 와 Fox Biz Service 가 어떻게 생산성 향상에 기여하는지 상세한 내용은 Why Fox Web API? 문서를 참조 하십시요.
비즈니스 로직 ID¶
Fox Biz Service 를 통해 호출 가능한 비즈니스 로직은 FoxBizClassAttribute 특성이 명시된 클래스에 포함된 FoxBizMethodAttribute 특성이 명시된 메서드 입니다. FoxBizClassAttribute 특성이 명시된 클래스를 비즈 클래스라 부르며 비즈 클래스에서 FoxBizMethodAttribute 특성이 명시된 메서드를 비즈 메서드라고 부릅니다.
비즈 클래스는 중복되지 않는 고유의 ID 를 가져야 하며 비즈 클래스 ID 라고 합니다. 비즈 클래스 ID 는 FoxBizClassAttribute 특성을 통해 명시적으로 설정할 수 있습니다. 만약 생략된 경우에는 비즈 클래스의 네임스페이스를 포함하는 전체 이름이 비즈 클래스 ID 로 설정됩니다.
위 코드 조각에서 BizLogic1 클래스의 비즈 클래스 ID 는 MyNamepsace.BizLogic1 이며 BizLogic 클래스의 비즈 클래스 ID 는 MyBizLogic 이 됩니다.
비즈 클래스 내에서 비즈 메서드 역시 고유의 ID 를 가져야 하며 비즈 메서드 ID 라고 합니다. 비슷하게 비즈 메서드 ID 는 FoxBizMethodAttribute 특성을 통해 명시적으로 설정하거나 생략할 수 있습니다. 생략된 경우에는 메서드의 이름이 비즈 메서드 ID로 설정됩니다.
위 코드 조각에서 Method1 메서드의 비즈 메서드 ID 는 그대로 Method1 이지만 Method2 메서드의 비즈 메서드 ID 는 MyMethod 로 설정됩니다.
비즈 서비스 초기화¶
Fox Biz Service 를 사용하기 위해서는 반드시 초기화 과정이 필요합니다. 초기화 과정은 비즈니스 로직이 포함된 모듈(어셈블리, 즉 .dll)들을 로드하고 비즈 모듈에서 비즈 클래스와 비즈 메서드를 검색하고 인덱싱을 수행합니다. 이렇게 구성된 비즈니스 로직 정보는 추후 클라이언트의 비즈니스 로직 호출에 사용됩니다.
Fox Biz Service 초기화는 ConfigureBizService 확장 메서드를 호출하면 됩니다. 이 메서드 호출은 대부분 ASP.NET 앱의 Main 메서드에서 다음과 같이 호출하는 것이 일반적입니다.
Note
실질적인 Fox Biz Service 초기화는 FoxBizServiceConfig 정적 클래스의 Configure 메서드가 수행합니다. ConfigureBizService 확장 메서드는 내부적으로 Configure 메서드를 호출합니다.
ConfigureBizService 확장 메서드가 호출되면 Fox Biz Service 초기화 모듈이 구동되며 초기화 과정이 수행됩니다. 이러한 초기화 과정은 Fox Biz Service 로그를 통해 확인이 가능합니다.
Note
Fox Biz Service 초기화 모듈이 생성하는 로그는 항상 로그 ID 가 00001:00000000 로 고정됩니다.
서비스 객체 생성¶
FoxBizService 클래스는 매개변수가 없는 디폴트 생성자만을 제공하지만 대신 Fox Biz Service 의 작동 방식을 설정하는 다양한 public 속성들을 제공합니다. Fox Biz Service 가 ASP.NET Web API 나 WCF, gRPC 와 같은 다양한 통신 서비스에 의해 사용되며 개발자가 직접 FoxBizService 클래스의 인스턴스를 생성하는 경우가 많지 않기 때문입니다. 대신 구성 설정 파일(neodeex.config.json 파일)에서 이들 public 속성들의 기본값을 설정할 수 있습니다.
예를 들어, 다음 코드와 같이 FoxBizService 클래스의 인스턴스를 생성할 때 EnableDiagnostics 속성을 true로 설정하고 LoggerName 속성을 지정하면, 나머지 FoxBizService 속성들은 기본값이 적용되거나, neodeex.config.json 구성 설정의 "bizService" 섹션에서 설정된 값이 적용됩니다. Fox Biz Service 의 구성 설정에 대한 자세한 내용은 구성 설정 항목을 참조하십시요.
-
LoggerName속성FoxBizService클래스가 로그를 기록할 때 사용할 로거의 이름을 지정하는 속성입니다. 아무런 설정이 없는 경우 이 속성의 기본값은NeoDEEX.ServiceModel.Data.FoxBizService입니다.LoggerName속성이 지시하는 이름의 로거가 구성되지 않은 경우 로그는 기록되지 않습니다. -
EnableDiagnostics속성FoxBizService클래스가 제공하는 다양한 진단 기능들을 켜거나 끌 수 있는 속성입니다. 진단 기능에는 비즈니스 로직 수행 시간 측정, 로그 반환, 상세한 예외 정보, 로그 ID 등이 포함됩니다. 아무런 구성 설정이 없는 경우, 이 속성의 기본값은false입니다.Warning
이 속성은 서비스가 생성하는 서버 측 로그를 제어하지 않습니다. 서비스가 생성하는 서버 측 로그는
LoggerName속성이 지정하는 로거의 존재 유무 그리고 로그 필터링 수준에 의해서만 제어됩니다. -
EnablePerfLog속성FoxBizService클래스는 쿼리를 수행하는데 소요되는 시간을 측정하여 로그에 기록할 것인지 여부를 지정하는 속성입니다. 이 속성이true로 설정된 경우, 성능 로그가PerfLoggerName속성이 지정하는 로거에 기록합니다. 아무런 구성 설정이 없는 경우 이 속성의 기본값은false입니다. -
PerfLoggerName속성FoxBizService클래스가 성능 로그를 기록할 때 사용할 로거의 이름을 지정하는 속성입니다. 이 속성은EnablePerfLog속성이true로 설정된 경우에만 적용됩니다. 아무런 구성 설정이 없는 경우 이 속성의 기본값은NeoDEEX.ServiceModel.BIz.FoxBizService.Performance입니다.
구성 설정¶
Fox Biz Service 에 대한 구성 설정은 neodeex.config.json 파일의 최상위 "bizService" 섹션에서 다음과 같이 설정할 수 있습니다.
-
modules속성FoxBizServiceConfig.Configure 메서드가 호출되면 Fox Biz Service 초기화 모듈은 클라이언트가 호출 가능한 비즈니스 로직을 이 속성이 나열하는 모듈에서 검색합니다. 즉,
modules속성이 나열하는 비즈 모듈에서 비즈 클래스들과 비즈 메서드들을 검색합니다.modules속성 값으로 어셈블리 이름 혹은.dll파일 경로를 배열로 나열할 수 있습니다. 어셈블리 이름은Assembly.Load메서드를 통해 로드 가능한 닷넷 어셈블리 이름을 말합니다. 어셈블리 이름이 아닌 경우.dll파일 경로로 간주되어Assembly.LoadFrom메서드를 통해 로드 됩니다.Fox Biz Service 초기화 모듈은 로드된 비즈 모듈(닷넷 어셈블리)에서
FoxBizClassAttribue가 표시된 public 클래스들(비즈 클래스들)을 찾고 이 클래스 안에서 다시FoxBizMethodAttribute특성이 표시된 public 메서드들(비즈 메서드들)을 찾아 인덱싱해 두며 추후 클라이언트가 Fox Biz Service 를 호출하면 인덱싱 해 놓은 비즈 클래스/메서드를 호출하게 됩니다. -
useLoadContext속성비즈 모듈(
.dll)이Load혹은LoadFrom메서드에 의해 로드되면 해당 모듈은 운영체제에 의해 잠기게 됩니다(lock). 즉 해당.dll파일을 운영체제에 의해 잠기게 되어 파일 삭제 혹은 업데이트가 불가능하게 됩니다.클라우드 환경이나 컨테이너 환경에서는 확실한 배포 단계를 갖으므로 큰 문제가 되지 않을 수 있지만 개발 환경에서나 비즈니스 로직을 운영 중에 변경해야 환경에서는 문제가 발생할 수도 있습니다.
이러한 문제를 해결하기 위해
useLoadContext속성을true로 지정하면 Fox Biz Service 초기화 모듈은 어셈블리 로드 문맥(Assembly Load Context)을 생성하고modules속성에 나열된 비즈 모듈들을 생성한 어셈블리 로드 문맥에 로드 합니다. 이 과정에서 비즈 모듈이 잠기지 않도록.dll을 메모리에 로드하게 됩니다.Warning
어셈블리 로드 문맥을 사용하면
.dll잠금 문제나 이후에 설명할 어셈블리 언로드 등의 기능을 사용할 수 있지만 어셈블리 로드 문맥에서 발생할 수 있는 다양한 제약 사항을 모두 이해하고 사용해야 합니다. 상세한 내용은 AssemblyLoadContext 의 이해 문서를 참고 하십시요.이 속성의 기본값은
true입니다. -
isCollectible속성.net 에 새로이 도입된 어셈블리 로드 문맥(Assembly Load Context)은 로드된 어셈블리를 언로드하는 기능을 제공합니다.
isCollectible속성을true로 설정하면 Fox Biz Service 초기화 모듈은 어셈블리 로드 문맥을 생성하고 비즈 모듈을 로드할 때 어셈블리들이 언로드가 가능한 상태로 구성합니다.그리고 로드된 어셈블리가 변경되는지 감시하여 만약 변경되는 경우 로드된 어셈블리를 언로드(collect)하고 변경된 어셈블리를 로드 합니다.
이 속성의 기본값은
false이며useLoadContext속성값이false인 경우 이 속성값은 무시됩니다. -
throwOnError속성Fox Biz Service 초기화 모듈은 비즈 모듈을 찾아 로드 하며 비즈 클래스와 비즈 메서드를 검색하여 색인합니다. 개발 환경에서는 이러한 오류가 즉각적으로 개발자에게 피드백을 남기도록 초기화 과정은 중단되며
FoxBizServiceException예외가 발생합니다. 하지만 운영 환경에서는 서비스가 시작되지 않는 것보다 작동하는 일부 서비스라도 구동되는 것이 더 나은 선택일 수도 있습니다.throwOnError속성이false이면 Fox Biz Service 초기화 모듈은 초기화 과정에서 오류가 발생하면 오류 정보를 로그에 기록하고 오류를 일으킨 비즈 모듈/클래스/메서드에 대한 처리를 무시하고 초기화 작업을 계속 진행합니다.이 속성의 기본값은
true입니다. -
여러 차례 언급했듯이 Fox Biz Service 는 Fox Web API 를 통해 클라이언트가 백엔드 비즈니스 로직을 호출할 때 사용하는 것이 전형적인 사용 패턴입니다. Fox Web API 는 HTTP/JSON 기반의 통신 메커니즘을 사용하는데 이 때 JSON 의 데이터 타입과 닷넷의 데이터 타입이 일치하지 않기 때문에 여러가지 문제가 발생하곤 합니다.
supportJsonType속성이true로 설정되면 이러한 문제를 일부 회피가 가능합니다. JSON 타입과 매개변수 타입이 일치하지 않을 때 타입 변환을 시도하여 타입 변환 오류가 발생하지 않도록 해줍니다. 상세한 예제와 사용법은 타입 정보 지원 문서를 참조 하십시요.이 속성의 기본값은
true입니다.
바인딩 규칙¶
Fox Biz Service 를 통해 클라이언트가 호출하고자 하는 비즈니스 로직은 평범한 닷넷 메서드 이며 클라이언트는 비즈니스 로직을 호출하기 위해 FoxBizRequest 객체를 사용합니다. 따라서 FoxBizRequest 객체의 Parameters 컬렉션이 비즈 메서드의 매개변수에 어떻게 전달될 것인가, 그리고 비즈 메서드가 반환하는 리턴값을 FoxBizResponse 객체의 Result 속성에 어떻게 전달될 것인가를 결정하는 바인딩 규칙이 필요합니다.
매개변수 바인딩¶
매개변수 바인딩은 크게 세 가지 규칙을 따릅니다. 첫번째는 매개변수 이름을 사용하는 규칙입니다. Parameters 컬렉션은 기본적으로 IDictionary<string, object> 컬렉션이기 때문에 비즈 메서드의 매개변수 이름과 동일한 컬렉션의 키 이름을 사용하여 매개변수를 바인딩합니다. 이 과정에서 비즈 메서드에 필요한 매개변수가 Parameters 컬렉션에 존재하지 않는 경우 매개변수 불일치를 나타내는 FoxBizServiceException 예외가 발생합니다.
두번째 규칙은 비즈 메서드의 매개변수가 1개 이며 IDictionary<string, object> 혹은 FoxServiceParameterCollection 타입인 경우, FoxBizRequest 객체의 Parameters 컬렉션이 그대로 비즈 메서드의 매개변수 바인딩 됩니다.
세번째 규칙은 비즈 메서드의 매개변수가 1개 이며 FoxBizRequest 타입인 경우, 클라이언트가 전송한 FoxBizRequest 객체가 그대로 비즈 메서드의 매개변수에 바인딩 됩니다.
첫번째 규칙은 간단한 문자열, 정수 등의 매개변수를 2-3개 갖는 비즈 메서드에서 사용하기 적합하며 두번째 규칙은 매개변수의 개수가 많거나 동적인 매개변수를 처리해야 하는 경우 적합한 매개변수 바인딩 규칙입니다. 세번째 규칙은 클라이언트가 전달한 FoxBizRequest 객체의 모든 값을 사용하고자 하는 경우에 가끔 사용되는 바인딩 규칙입니다.
Note
Fox Biz Service 의 바인더(FoxBizBinder)는 비즈 메서드가 1개의 매개변수만을 갖으며 그 매개변수 타입이 FoxBizRequset 타입 혹은 IDictionary<string, object> 타입인 경우를 먼저 바인딩합니다. 이 시도가 실패한 경우에만 첫번째 바인딩 규칙을 사용하여 매개변수 바인딩을 시도합니다. 이 과정에서 매개변수 부족, 매개변수 타입 불일치 등의 오류가 발생할 수 있습니다.
결과 바인딩¶
Fox Biz Service 는 비즈 메서드 호출이 완료되면 FoxBizResponse 객체를 생성하고 비즈 메서드 호출 결과를 설정합니다. FoxBizReponse 객체에 포함되는 호출 결과는 호출 성공 여부(Success 속성), 출력 매개변수(Parameters 컬렉션), 메서드 리턴값(Result 속성) 등 입니다.
비즈 메서드의 출력 매개변수는 Parameters 컬렉션에는 출력 매개변수와 동일한 이름을 갖는 키/값이 추가되며 메서드이 리턴값은 Result 속성에 설정됩니다.
비즈 메서드의 리턴 타입이 FoxBizResponse 타입인 경우 Fox Biz Service 는 FoxBizReponse 객체를 생성하지 않고 비즈 메서드가 반환한 FoxBizRepnose 객체를 그대로 클라이언트에게 반환합니다. 즉, 비즈 메서드의 리턴 타입이 FoxBizResponse 타입인 경우에는 Fox Biz Service 는 어떠한 호출 결과 설정도 수행하지 않고 비즈 메서드의 결과를 그대로 클라이언트에게 반환합니다. 따라서 다음 ReturnBinding 메서드 호출 결과로 반환되는 FoxBizResponse 객체는 호출이 성공했음에도 불구하고 Success 속성 값이 false 이며 Parameters 컬렉션에는 out1 과 out2 출력 값은 존재하지만 outputParameter 출력 값은 존재하지 않습니다.
Summary¶
일반적으로 Fox Biz Service 는 Fox Web API 를 통해 사용하므로 개발자가 직접 FoxBizService 클래스의 인스턴스를 생성하고 Execute 메서드를 호출하는 경우는 많지 않습니다. 하지만 Fox Web API 를 사용하지 않고 커스텀 ASP.NET Core Web API 나 gRPC 를 작성하는 경우 FoxBizService 객체를 생성하고 호출하고자 하는 비즈니스 로직의 클래스 ID, 메서드 ID 그리고 매개변수를 포함하는 FoxBizRequest 객체를 Execute 메서드에 전달하면 됩니다.
비즈니스 로직을 수행한 결과는 FoxBizResponse 객체로 전달되며 이 객체에는 비즈 메서드의 출력 매개변수 및 리턴값이 포함됩니다. 비즈 메서드의 매개변수와 리턴값은 FoxBizRequest 객체와 FoxBizReponse 객체의 속성들(Parameters 컬렉션, Result 속성 등)이 몇가지 바인딩 규칙을 사용하여 결정됩니다.
Fox Biz Service 를 제어하는 다양한 기능은 FoxBizService 클래스의 public 속성들을 통해 제어할 수 있으며, 이러한 속성들은 neodeex.config.json 구성 설정 파일의 "bizService" 섹션에서 기본값을 설정할 수도 있습니다. 또한 Fox Biz Service 가 초기화 될 때 로드되어야 하는 비즈 모듈에 대한 구성 역시 "bizService:modules" 속성에서 설정할 수도 있습니다.