Skip to content

Fox Data Service Overview

Fox Data Service 는 데이터액세스 계층의 불필요한 코드 작성을 최소화하기 위한 서비스 입니다. 특히 Fox Query 와 같은 SQL 매퍼를 사용하는 경우, 데이터액세스 계층의 코드는 단순히 매개변수 매핑하는 지루하고 귀찮은 코드가 되기 일쑤입니다. Fox Data Service 는 이러한 문제점을 해결하기 위해 코드를 작성하지 않고도 Fox Query 의 Foxml 파일을 사용하여 데이터베이스를 액세스할 수 있도록 하는 기능을 제공합니다.

Fox Data Service

서비스 개념

클라이언트는 호출할 쿼리의 ID 와 매개변수를 FoxDataRequest 객체에 담아 FoxDataServiceExecuteXXX 시리즈 메서드를 호출할 수 있습니다. 다음 코드는 ASP.NET Core Razor 페이지에서 Fox Data Service 를 사용하여 orders.foxml 파일의 get_all_orders_with_details 쿼리를 호출하여 결과를 HTML 로 렌더링하는 예를 보여줍니다.

@{
    ViewData["Title"] = "Home page";
    FoxDataRequest dataRequest = new("orders.get_all_orders_with_details");
    FoxDataService dataService = new();
    FoxDataResponse dataResponse = dataService.ExecuteDataSet(dataRequest);
    DataTable ordersTable = dataResponse.DataSet.Tables[0];
    int rowCount = ordersTable.Rows.Count;
}
<div>
    ......
    <tbody>
      @foreach (DataRow row in ordersTable.Rows)
      {
        <tr>
          <td>@row["order_id"]</td>
          <td>@row["customer_id"]</td>
          ......
        </tr>
      }
    </tbody>
    ......
</div>

위 예제처럼 Razor 페이지에서 Fox Data Service 를 직접 호출하는 코드의 장점은 크지 않습니다. 직접 FoxDbAccess 클래스를 통해 Fox Query 를 호출하는 코드에 비해 Fox Data Service 를 사용하는 코드가 더 효율적이거나 간결하다고 보기 어렵기 때문입니다.

하지만 Fox Web API 를 사용하여 원격 클라이언트에서 Fox Data Service 를 호출하는 경우, Fox Data Service 의 장점이 더욱 부각됩니다. 단순 조회와 같은 쿼리는 서버 측에서 코드를 전혀 작성하지 않고 SQL 문장이 담긴 Foxml 파일만 작성하여 원격 클라이언트에서 호출할 수 있습니다.

다음 JavaScript 코드는 FoxDataRequest 객체를 JSON 형태로 HTTP POST 요청의 본문에 담아 Fox Web API 를 통해 Fox Data Service 를 호출하고 그 결과를 <tbody>에 렌더링하는 예를 보여줍니다. 서버 측에 Fox Data Service 가 구성되고 .foxml 파일만 있다면 서버 측 코드 없이 클라이언트에서 데이터를 액세스할 수 있습니다.

const fetchOrders = async () => {
    const dataRequest = {
        queryId: "orders.get_order_by_id_with_details",
        parameters: {
            order_id: 1
        }
    }
    const httpResponse = await fetch("/api/dataservice/executedataset", {
        method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify(dataRequest)
    });
    const dataResponse = await httpResponse.json();
    const ordersTable = dataResponse.dataSet.Table;
    // ..... HTML 렌더링 코드 (생략) ......
};

다중 쿼리 수행

Fox Data Service 는 단일 쿼리 수행 뿐만 아니라 여러 쿼리를 한 번에 수행하는 기능도 제공합니다. 클라이언트는 FoxDataRequest 객체 컬렉션(FoxDataRequestCollection 객체)을 ExecuteMultiple 메서드에 전달하여 여러 쿼리를 한 번에 수행할 수 있습니다. ExecuteMultiple 메서드는 브라우저나 데스크톱 앱과 같은 원격 클라이언트와의 네트워크 왕복 횟수를 줄이는 데 유용합니다. 상세한 내용은 FoxDataService 클래스의 ExecuteMutiple 메서드 관련 항목 을 참조 하십시요.

다중 쿼리 수행 개념

트랜잭션 지원

Fox Data Service 는 Fox Query 의 쿼리를 수행할 때 트랜잭션 역시 지원합니다. FoxDataRequest 객체의 Transactsion 속성에 FoxDataTransactions 열거 타입의 값들 중 Local 혹은 Distributed 값을 설정하면 FoxDataService 클래스는 트랜잭션을 시작하며 쿼리가 트랜잭션에 참여하도록 작동합니다.

Transaction 속성은 다중 쿼리를 수행하는 ExecuteMultiple 메서드와 함께 사용할 때 특히 유용합니다. ExecuteMultiple 메서드에 전달된 여러 쿼리가 모두 트랜잭션에 참여하도록 하여, 여러 쿼리를 하나의 트랜잭션으로 묶어서 실행할 수 있습니다. 상세한 내용은 FoxDataService 클래스의 트랜잭션 관련 항목 을 참조 하십시요.

다음 코드는 2개의 쿼리를 하나의 트랜잭션으로 수행하도록 ExecuteMultiple 메서드를 사용하는 예를 보여줍니다.

1
2
3
4
5
6
7
8
FoxDataRequestCollection requests = new();
requests.Add(new FoxDataRequest("...") { ...... });
requests.Add(new FoxDataRequest("...") { ...... });
requests.Transaction = FoxDataTransactions.Local;
FoxDataService dataService = new();
FoxDataResponseCollection responses = dataService.ExecuteMultiple(requests);
// 첫번째 쿼리에 대한 결과: responses[0]
// 두번째 쿼리에 대한 결과: responses[1]

진단 및 로깅

Fox Data Service 는 코드를 작성하지 않고 쿼리를 수행하기 때문에 쿼리 수행 시 발생하는 문제를 파악하고 해결하는데 어려움을 겪을 수 있습니다. Fox Data Service 는 이러한 문제를 해결하기 위해 다양한 진단 및 로깅 기능을 제공합니다.

FoxDataService 클래스는 쿼리를 수행하는데 소요된 시간을 응답에 포함시켜 반환하며 로그에도 기록합니다. 쿼리 수행 시 발생하는 예외는 상세한 예외 메시지와 함께 로그에 기록되며 클라이언트게게도 반환될 수 있습니다. 대규모 앱에서 대량의 로그에서 문제를 일으킨 호출에 대한 로그를 손쉽게 찾을 수 있도록 로그 ID 기능을 포함하며 이러한 모든 진단 기능은 선택적으로 켜거나 끌 수 있습니다. 상세한 내용은 FoxDataService 클래스의 로깅 관련 항목 을 참조 하십시요.

구성 설정

Fox Data Service 는 구성 설정을 통해 작동 방식을 제어할 수 있습니다. 예를 들어, 진단 및 로깅 기능을 켜거나 끄는 설정, 쿼리 수행 시 DB 프로파일 정보를 반환하는 설정, 성능 로그를 기록하는 설정 등이 있습니다. 다음은 진단 기능을 활성화하며 로그를 기록하는 로거의 이름을 지정하는 구성 설정의 예를 보여 줍니다.

{
  ......
  "dataService": {
    "diagnostics": {
        "enable": false,
        "loggerName": "MyLogger",
    }
  }
  ......
}

Fox Data Service 구성 설정에 대한 상세한 내용은 FoxDataService 클래스의 구성 설정 항목을 참조 하십시요.

Summary