본문 바로가기

개발언어/C#

C# IBatis.Net 사용하기

안녕하세요 C#에서 IBatis를 적용하려고 하던 중 마음에 드는 글이 없어서 직접 정리하려고 합니다.



iBATIS 다운 




 iBatis는 공식 홈페이지에서 다운받을 예정입니다. 

공식 홈페이지가 아니라 NuGet을 통해서 다운이 가능하긴 하지만 iBatis를 사용하기 위해서는 DLL 이외에도 몇몇 설정 파일이 필요한데 이 설정 파일이 공식홈페이지에서 다운받은 압축 파일에 포함되어 있습니다. 

또한, 샘플 코드도 같이 다운받을 수 있게 되어있는데 저는 이 샘플코드를 활용해서 이번 포스팅을 진행해 나갈 생각입니다.

다운로드 링크는 다음과 같습니다. 


해당 URL에 접속하게 되면 아래와 같은 화면이 나타납니다.(2019-11-19일 기준)



위의 빨간 상자 중에서 아래의 상자가 현재 프로젝트에 iBatis를 포함하기 위한 파일들이 포함되어 있는 압축 파일이고 위의 상자가 이번 포스팅에서 테스트를 진행할 코드입니다. 

상황에 맞게 사용하시면 될것 같습니다.

이번 포스팅의 경우 위의 샘플코드를 가지고 진행하도록 하겠습니다. 샘플코드를 다운받으시고 압축을 해제 후 ConsoleApplication1.sln 파일을 실행하시면 비주얼 스튜디오가 실행됩니다. 





프로젝트 구성 



 프로젝트의 구성을 보시면 다음과 같습니다.



프로젝트 구조에서 표시해둔 5가지 파일이 현재 진행하고 있는 프로젝트에 적용하기 위한 파일들 입니다. 각각 다음과 같이 배치합니다.

iBatis DLL 파일
// 프로젝트 참조에 추가

IBatisNet.Common
IBatisNet.Common.Logging.Log4Net
IBatisNet.DataMapper


iBatis 설정 파일
//프로젝트 폴더 최상단에 배치

providers.config
SqlMap.config





프로젝트 분석




1. providers.config

해당 파일은 접속할 데이터 베이스의 드라이버를 설정해주는 파일입니다.
경로는 위와 같이 프로젝트 최상단에 배치시켜 둡니다.
하나씩 파일을 샘플코드의 내용을 보면 providers 라는 태그안에 여러개의 provider를 넣어두고 그 중에 하나의 provider를 선택해서 사용하는 방식으로 보입니다.
또한 default 속성을 사용하여 기본으로 사용할 provider를 설정해준 모습입니다.
일단 코드를 보면


<?xml version="1.0" encoding="utf-8"?>
<providers

<clear/>
<provider
    name="sqlServer2.0"
    enabled="true"
    default="false"
    description="Microsoft SQL Server, provider V2.0.0.0 in framework .NET V2.0"
    assemblyName="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
    connectionClass="System.Data.SqlClient.SqlConnection"
    commandClass="System.Data.SqlClient.SqlCommand"
    parameterClass="System.Data.SqlClient.SqlParameter"
    parameterDbTypeClass="System.Data.SqlDbType"
    parameterDbTypeProperty="SqlDbType"
    dataAdapterClass="System.Data.SqlClient.SqlDataAdapter"
    commandBuilderClass=" System.Data.SqlClient.SqlCommandBuilder"
    usePositionalParameters = "false"
    useParameterPrefixInSql = "true"
    useParameterPrefixInParameter = "true"
    parameterPrefix="@"
    allowMARS="true"
/>

<provider
    name="sqlServer4.0"
    enabled="true"
    default="true"
    description="Microsoft SQL Server, provider V4.0.0.0 in framework .NET V4.0"
    assemblyName="System.Data, Version=4.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089"
    connectionClass="System.Data.SqlClient.SqlConnection"
    commandClass="System.Data.SqlClient.SqlCommand"
    parameterClass="System.Data.SqlClient.SqlParameter"
    parameterDbTypeClass="System.Data.SqlDbType"
    parameterDbTypeProperty="SqlDbType"
    dataAdapterClass="System.Data.SqlClient.SqlDataAdapter"
    commandBuilderClass=" System.Data.SqlClient.SqlCommandBuilder"
    usePositionalParameters = "false"
    useParameterPrefixInSql = "true"
    useParameterPrefixInParameter = "true"
    parameterPrefix="@"
    allowMARS="true"
/>

</providers>


위와 같은데 샘플코드는 sqlServer를 기준으로 코드가 작성 되었지만 사용하시는 분들은 자신의 데이터 베이스에 맞는 provider를 추가로 다운받은 압축파일에서 providers.config 파일 내부를 찾아서 선택하셔야 할 것입니다.


2. SqlMap.config

데이터 베이스의 커넥션 정보가 들어갈 파일입니다. 
경로는 마찬가지로 프로젝트 폴더 최상단에 배치 시켜줍니다.
바로 코드를 살펴보면 


<?xml version="1.0" encoding="utf-8" ?>

<settings>
<setting useStatementNamespaces="false" />
<setting cacheModelsEnabled="true" />
<setting validateSqlMap="true" />
</settings>

<database>
<provider name="sqlServer2.0" />
<dataSource name="SalesData" connectionString="Data Source=localhost , 1433
;User ID=sa;Password=1234;Initial Catalog=FC_TRNS_NH1;Integrated Security=False"/>
</database>

<sqlMaps>
<sqlMap embedded="sqlFile.xml, ConsoleApplication1" />
</sqlMaps>
</sqlMapConfig>



위 코드에서 dataSource 부분에서 데이터 베이스 정보를 입력해주고 sqlMap에서 포함시킬 mapper 파일을 추가해줬음을 알 수 있습니다. 특히 dataSource에서 connectionString 값의 경우 제 피시에 맞는 값으로 변경 시켜두었으니 사용시 이점 참고하여 자신의 서버 상황에 맞게 설정하시길 바랍니다. 또한 mapper 파일이 추가되는 경우 위 코드부분을 추가해줘야 정상적으로 mapper가 동작하므로 해당부분을 잊지말고 추가해주시길 바랍니다.

3. sqlFile.xml 

해당 파일은 실질적으로 사용할 쿼리와 연결해줄 객체에 관한 파일입니다.
이 파일의 쿼리와 내용도 역시 제 상황에 맞게 내용이 변경되어 있으므로, 따라해보시는 분들도 쿼리 혹은 속성값을 자신의 상황에 맞게 변경하시기 바랍니다.


<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace=“MemberMapper" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/20    01/XMLSchema-instance" >

    <statements>
        <statement id=getMemberCnt" parameterClass=“string" resultClass=Int32" >
           SELECT      COUNT(*)            FROM MEMBER            WHERE 1 = 1            AND   user_id = #value#
        </statement>
    </statements>
</sqlMap>


이 코드에서 중요한 점은 첫번째로 sqlMap 태크에서 namespce의 값입니다. 위의 값은 나중에 실제로 쿼리를 실행 시 해당파일의 구분자로 쓰입니다.
두번째로 parameterClass와 resultClass의 경우 입력할 객체와 출력할 객체를 정하는 속성입니다. 해당 값의 경우 자신이 만든 VO를 직접 사용하는 경우 namespace의 값을 먼저 적고 .으로 구분 후 클래스명을 적어주셔야 정상적으로 작동 합니다.
아래의 #value#으로 적어준 값의 경우 제가 사용한 것 처럼 string 과 같은 클래스에서만 사용하는 값이고, 만약 직접 만든 VO를 사용하셨다면 VO 내부의 변수명을 그대로 사용해 주시면 됩니다.

4. Program.cs

마지막으로 위에서 작성한 Mapper를 실 사용하기 위한 코드입니다.


namespace ConsoleApplication1
{
    public class Program
    {
        public static ISqlMapper EntityMapper
        {
            get
            {
                try
                {
                    ISqlMapper mapper = Mapper.Instance();
                    mapper.DataSource.ConnectionString = "Data Source=(local);Initial Catalog=web;Integrated Security=True";
                    return mapper;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

        public static Int32 executeFunction()
        {
            ISqlMapper mapper = EntityMapper;
            Int32 val = mapper.QueryForObject<Int32>("MemberMapper.getMemberCnt", "Footer");

            return val;
        }

        static void Main(string[] args)
        {
            XmlConfigurator
.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "log4net.config"));

            Console.Write(executeFunction());
            Console.Read();
        }
    }
}



위 코드에서 확인해야 할 부분은 executeFunction함수 입니다. 해당 함수에서 mapper 객체를 생성한 후 
mapper.QueryForObject<Int32>("MemberMapper.getMemberCnt", "Footer”);
위와 같은 방식으로 쿼리를 실제로 실행 했습니다.

여기서 <>의 값은 리턴 값, 첫번째 매개변수는 ‘파일의 namespace.쿼리명’ 두번째 매개변수는 쿼리에 파라미터로 전달할 값입니다.

해당 코드를 실행시키면 정상적으로 쿼리가 동작하는 것을 확인할 수 있습니다.