Skip to content

FoxQueryMapper

Fox Query 기능에서 .foxml 파일들을 검색하고 XML 을 파싱하여 SQL 문장과 DB 매개변수 정보를 추출해 내는 작업은 FoxQueryMapper 객체에 의해 수행됩니다.

Overview

Fox Query 개념

FoxDbAccess 객체는 ExecuteQuery- 류의 FoxQuery 관련 메서드들이 호출되면 FoxQueryMapper 를 호출하여 FoxQuery 정보를 요청합니다.

Note

FoxQueryMapper 는 모든 XML 파일들을 읽고 파싱하는데 소요되는 시간을 줄이기 위해 초기화 시점에는 .foxml 파일들의 목록만을 검색하여 유지합니다.

FoxQueryMapper 는 .foxml 파일 목록에서 요청된 .foxml 파일을 찾아 XML 을 파싱하여 FoxQuery 캐시에 FoxQuery 들을 추가하며 요청된 FoxQuery 정보(FoxQuery 객체)를 반환합니다. 이제 FoxDbAccess 는 FoxQueryMapper 가 반환한 FoxQuery 객체를 사용하여 Command 객체를 생성하고 생성한 Command 객체를 수행하고 결과를 반환합니다. 다음 코드는 이러한 과정을 보여줍니다.

1
2
3
4
5
6
7
8
// FoxQueryMapper 를 호출하여 FoxQuery 객체 획득
string queryId = "northwind:get_product";
FoxQuery foxQuery = dbAccess.GetQuery(queryId);
// FoxQuery 정보로부터 Command 객체를 생성
var parameters = new { product_id = 3};
using IDbCommand command = dbAccess.CreateCommand(foxQuery, parameters);
// 생성된 Command 를 수행
List<Product> products = dbAccess.ExecuteCommandList<Product>(cmd);

FoxQueryMapper 객체들은 FoxDbAccess 에 의해 생성 및 관리되며 개발자는 직접 이 객체에 접근할 수 없습니다. 다만, neodeex.config.json 구성 설정을 통해 .foxml 파일들을 검색할 위치(디렉터리) 등의 설정을 수행할 수 있습니다.

FoxQueryMapper 설정

FoxQueryMapper 관련 구성 설정은 database:queryMappers 섹션 내에 FoxQueryMapper 설정들을 나열할 수 있습니다. 각 FoxQueryMapper 설정은 구분을 위해 고유한 이름을 사용해야 합니다.

{
  ...
  "database": {
    ...
    "queryMappers": {
      "name1": {
        ... FoxQueryMapper 설정 ...
      },
      "name2": {
        ... FoxQueryMapper 설정 ...
      },
      "name3": {
        ... FoxQueryMapper 설정 ...
      }
    }
  }
  ...
}
  • directories 속성

    .foxml 파일을 검색할 디렉터리 경로들을 배열로 설정합니다. 디렉터리 경로는 절대 경로 혹은 상대 경로를 사용할 수 있으며 상대 경로는 앱 기본 디렉터리로부터의 상대 경로 입니다. directories 속성에 명시된 디렉터리들은 그 하위 디렉터리들을 재귀적으로 모두 포함합니다. 만약 하위 디렉터리를 제외하고자 한다면 디렉터리 이름 뒤에 ! 문자를 추가해야 합니다.

    1
    2
    3
    4
    5
    6
    7
    {
      "queryMappers": {
        "mapperName1": {
          "directories": [ "./foxml/common", "./foxml/oracle!" ]
        }
      }
    }
    

    FoxQueryMapper 는 directories 에 나열된 디렉터리 및 그 하위 디렉터리에 대해서 .foxml 을 검색할 뿐만 아니라 .foxml 파일의 변경을 감시합니다. 만약 .foxml 파일이 추가/변경/삭제되면 캐시해두었던 FoxQuery 정보를 무효화하고 .foxml 파일 목록을 재구성합니다. 따라서 이 이후에 요청되는 FoxQuery 정보는 새롭게 .foxml 파일을 읽어 구성되며 캐시 됩니다.

  • files 속성

    사용할 .foxml 파일 경로를 배열로 설정합니다. .foxml 파일 경로는 절대 경로 혹은 상대 경로를 사용할 수 있습니다. 디렉터리와 마찬가지로 files 속성에 나열된 .foxml 파일들은 변경을 감시하고 변경이 발생하면 다시 로드하게 됩니다.

    1
    2
    3
    4
    5
    6
    7
    {
      "queryMappers": {
        "mapperName2": {
          "files": [ "../db/foxml/common.foxml", "../db/foxml/oracle/northwind.foxml" ]
        }
      }
    }
    
  • scriptLogger 속성

    FoxQuery 의 매크로 스크립트에서 사용하는 로거의 이름 입니다. 즉, env.Log 속성이 나타내는 로거 이름을 지정합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    {
      "queryMappers": {
        "mapperName1": {
          "directories": [ "./foxml/common", "./foxml/oracle!" ],
          "scriptLogger": "MacroLogger"
        }
      }
    }
    

FoxQueryMapper 참조

queryMappers 섹션에서 정의된 여러 FoxQueryMapper 설정들 중 하나를 사용하기 위해서는 연결 문자열 설정에서 queryMapper 속성을 지정해 주어야 합니다. 즉, queryMappers 섹션에서 정의된 FoxQueryMapper 설정들 중 하나를 연결 문자열 설정에서 queryMapper 속성을 통해 참조하는 것입니다. 다음 예제는 연결 문자열에서 MyOralceMapper 라는 이름을 가진 FoxQueryMapper 설정을 참조하는 예를 보여 줍니다.

{
  "$schema": "https://neodeex.github.io/doc/neodeex.config.schema.json",
  "database": {
    "connectionStrings": {
      "Oracle": {
        "type": "NeoDEEX.Data.OracleClient.FoxOracleDbAccess",
        "connectionString": "... your connection string ...",
        "queryMapper": "MyOracleMapper"
      }
    },
    "queryMappers": {
      "MyOracleMapper": {
        "directories": [ "./oracle/foxml" ]
      }
    }
  }
}

디폴트 FoxQueryMapper

연결 문자열에 queryMapper 속성이 없는 경우 디폴트 설정의 FoxQueryMapper 가 사용됩니다. 디폴트 설정의 FoxQueryMapper 는 바꿀 수 없으며 내부적으로 생성되고 사용됩니다. 디폴트 설정의 FoxQueryMapper 는 다음과 같은 속성을 가집니다.

  • .foxml 검색을 위한 디렉터리는 ./foxml! 입니다. ./foxml 디렉터리의 하위 디렉터리는 검색하지 않음에 주의 하십시요.

  • .foxml 파일의 추가/변경/삭제는 감시하지 않습니다. 즉, .foxml 파일의 다시 로드 기능은 사용되지 않습니다.

  • 스크립트 로거 설정은 포함하지 않습니다.

많은 경우, 디폴트 FoxQueryMapper 설정만으로 다양한 앱을 구성할 수 있습니다. 하지만 .foxml 파일 변경을 감지하고 다시 로드해야 하거나 다수의 .foxml 파일을 여러 디렉터리에 나누어 관리해야 한다면 디폴트 FoxQueryMapper 설정 대신 새로운 설정을 구성하고 참조해야 합니다.

Summary

FoxQueryMapper 는 .foxml 파일들을 검색하고 로드하며 Fox Query 정보를 담는 FoxQuery 객체를 생성하고 캐시 및 관리합니다. FoxQueryMapper 에 직접 접근은 불가능 하지만 구성 설정을 통해 .foxml 파일을 검색할 디렉터리 등을 지정할 수 있습니다. queyrMappers 섹션에서 여러 FoxQueryMapper 설정을 정의하고 연결 문자열 설정에서 이들 설정 중 하나를 참조하여 사용할 수 있습니다. 연결 문자열에서 특정 FoxQueryMapper 설정을 참조하지 않는 경우에는 간략화된 설정을 가진 디폴트 FoxQueryMapper 설정이 사용됩니다.