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 객체)를 반환합니다. 이제 FoxDbAccessFoxQueryMapper 가 반환한 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!" ]
        }
      }
    }
    

    FoxQueryMapperdirectories 에 나열된 디렉터리 및 그 하위 디렉터리에 대해서 .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 설정이 사용됩니다.