티스토리 뷰

반응형

[펌] http://andwiz.tistory.com/entry/MyBatisnet%EC%97%90%EC%84%9C-%EC%BF%BC%EB%A6%AC-%EB%A7%B5%ED%95%91-%ED%8C%8C%EC%9D%BC%EB%93%A4%EC%9D%98-%EB%B6%84%EB%A6%AC

================================================================================================================================================================


웹 어플리케이션에서 iBatis.NET을 사용하여 데이타베이스를 액세스하는 프로젝트를 만든다고 가정합니다.

뭐, 대략 DAO 프로젝트와 Web UI 프로젝트로 솔루션을 구성한다고 할때 일반적인 예상과 달리 쿼리를 담고 있는 XML 파일을 UI 레이어에 위치 시켜야 합니다. 

이것은 iBatis.NET에서 기본적으로 제공해주는 Mapper.Instance() 메소드가 providers.config 파일과 SqlMap.config 파일을 Web.Config 파일이 있는 루트 디렉토리에서만 찾기 때문입니다.

iBatis.NET 사이트에서 샘플 어플리케이션으로 다운받을 수 있는 NPetshop 프로젝트도 이런식으로 구성되어 있는데, 이건좀 아니라고 누구나 생각할 겁니다.

이럴때는 설정 파일들을 Embeded Resource로 셋팅하고 Mapper.Instance() 메소드를 Empeded Resource에서 파일을 찾는 방식으로 재구성 해야 합니다.

간단하게 샘플을 보여드리겠습니다

1. 솔루션 아래에 웹 어플리케이션 프로젝트와 클래스 라이브러리 프로젝트를 추가한 후 Config 폴더 아래에 providers.config 파일과 SqlMap.config 파일을 위치시키고 Models->Mappers 폴더 아래에 쿼리 맵핑 파일을 위치 시킵니다.
레이어는 DAO를 따로 분리할 수도 있겠지만 일단 쉽게 설명하기위해서 간단히 두가지 프로젝트로만 구성합니다.

 

 


2. providers.config, SqlMap.config, 맵핑 파일(여기서는 Categories.xml)의 빌드 액션을 모두 "Embedded Resource"로 변경합니다.

3. SqlMap.config 파일을 다음 처럼 작성합니다.

 

 

   
   코드를 보시면 


     <providers embedded="Service.Config.providers.config, Service"/>
      ............
      ............
     <sqlMap embedded="Service.Models.Mappers.Categories.xml, Service" />


처럼 resource가 아닌 embeded 어트리뷰트를 사용해서 파일들을 지정한 것을 보실 수 있습니다.
사실 XML 맵핑 파일들은 반드시 embeded 속성으로 지정해야 하는 것은 아닙니다. resource 타입으로 지정하시고 XML 맵핑 파일들의 속성을 copy always나 copy if newer로 지정하고 


<sqlMap resource="./bin/Models/Mappers/Categories.xml" />


이렇게 변경하여도 상관은 없습니다. 
일단 모두 embeded로 하는것로 하구요. 

4. 다음은 Mapper.Instance() 메소드를 대신할 메소드를 만듭니다.

위의 솔루션 그림에서 DaoFactory 클래스에서 아래처럼 구현하도록 하겠습니다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Xml;
using IBatisNet.Common.Utilities;
using IBatisNet.DataMapper;
using IBatisNet.DataMapper.Configuration;

namespace Service
{
    public class DaoFactory
    {
        private static object syncLock = new object();
        private static ISqlMapper mapper = null;

        public static ISqlMapper Instance
        {
            get
            {
                try
                {
                    if (mapper == null)
                    {
                        lock (syncLock)
                        {
                            if (mapper == null)
                            {
                                DomSqlMapBuilder dom = new DomSqlMapBuilder();

                                XmlDocument sqlMapConfig = Resources.GetEmbeddedResourceAsXmlDocument("Config.SqlMap.config, Service");

                                mapper = dom.Configure(sqlMapConfig);
                            }
                        }
                    }

                    return mapper;
                }
                catch
                {
                    throw;
                }
            }
        }
    }
}


iBatisNet.Common.Utilities 네임스페이스에서 제공하는 Resources 클래스를 사용하여 Embeded 되어있는 SqlMap.config 파일의 인스턴스를 생성하고 있는 부분을 유심히 보셔야할것 같네요. 
그리고, 상관은 없지만 개인적인 취향상 Instance() 메소드를 property로 바꾸어 보았습니다. 


이렇게하면 모든 구성은 끝나구요.

5. 새로운 맵퍼 인스턴스를 사용하는 방법은 아래처럼 간단하구요


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Service.Models.Entities;

namespace Service
{
    public class CategoryService
    {
        
        public IList<Categories> GetCategories()
        {

            IList<Categories> list = DaoFactory.Instance.QueryForList<Categories>("SelectCategories", null);
            return list;
        }
    }
}


UI 레이어에서는 서비스 프로젝트를 참조하여 사용하면 되겠습니다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Service;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                CategoryService s = new CategoryService();

                GridView1.DataSource = s.GetCategories();

                DataBind();
            }
            catch (Exception ex)
            {
                Response.Write(ex.ToString());
            }
        }
    }
}


그럼 부디 삽질없이 한번에 성공하시길~

반응형
공지사항