파이썬 & 오픈소스 개발 Tip과 강좌

이곳은 파이썬과 여러 오픈소스 기반 프레임워크 관련 Tip과 강좌 게시판 입니다. 관련 개발을 진행하면서 알아내신 Tip이나 강좌와 새로운 소식을 적어 주시면 다른 공부하는 분들에게 큰 도움이 됩니다. 감사합니다. SQLER.com은 개발자와 IT전문가의 지식 나눔을 실천하기 위해 노력하고 있습니다.

ORM 간단하게 구현하기.

T__T 2011.06.01 11:04 Views : 13686

안녕하세요.

처음 글 써 봅니다.

이런 곳에 올려도 되나 했는데 그냥 올려봅니다. ^^;

 

Framework가 갖추어야 할 주요 기능 중에 ORM(Object Relation Map) 기능이 있습니다.

 

ORM의 개념은 간단하나 대충 어떤 식으로 구현되는지에 대해서 간단하게 코드를 만들어보았습니다.

 

Class의 Property를 이용하게끔 되어있고,

Name Bind 방식이므로 Sql 실행결과인 DataTable의  Column Name과 Class의 Property Name은 같게 구성하여야 합니다.

 

예시로 나온 부분은 Sql의 실행 결과에 대해서 특정 클래스의 인스턴스로 리턴하는 예제입니다.

 

전체 코드를 올리지는 못해도 대략적인 이해를 도와드릴 것 같습니다.

 

//사용하는 코드 

{

        //자체적인 biz 모듈구현

        //참조된 sql 쿼리로 추측하십시오.

        DataSet dsUser = userBiz.GetMembershipInfo(userNo);

 

        //ORM 클래스 생성

        // 사실 static 메소드로 빼놓아도 무방합니다.

        ObjectRelationMapFactory factory = new ObjectRelationMapFactory();

 

        //사용자 정보 조회 DataSet MembershipInfo 클래스의 인스턴스로 생성

        //Type 정보를 알아야 하기 때문에 Generic을 사용하였습니다.

        //MembershipInfo의 형태는 참조된 소스를 참고하십시오.
        MembershipInfo membershipInfo = factory.ConvertObject<MembershipInfo>(dsUser.Tables[0].Rows[0]);

 

}

대략 감이 잡히시나요?

 

감이 안잡히시는 분들을 위해 코드 설명 들어갑니다.

 

      

        /// <summary>

        /// DataRow Object로 변환한다.

        /// </summary>

        /// <typeparam name="T">Generic</typeparam>

        /// <param name="row">DataRow</param>

        /// <returns></returns>

        public T ConvertObject<T>(DataRow row)

        {

            //타입정보 가져오기

            Type typeT = typeof(T);

 

            //속성정보 가져오기

            PropertyInfo[] propertyInfos = typeT.GetProperties();

 

            //리턴할 객체 생성

            T t = Activator.CreateInstance<T>();

 

            try

            {

                if (propertyInfos != null && propertyInfos.Length > 0)

                {

                    //DataRow에 칼럼정보가 있으면

                    for (int i = 0; i < row.Table.Columns.Count; i++)

                    {

                        DataColumn column = row.Table.Columns[i];

                        foreach (PropertyInfo propertyInfo in propertyInfos)

                        {

                            //Name Bind 방식이기 때문에 T 클래스의 속성명과 Query의 실행 결과 칼럼정보의 이름이 같아야 한다.

                            if (propertyInfo.Name.ToLower() == column.ColumnName.ToLower())

                            {

                                if (row[column.ColumnName] != null && row[column.ColumnName] != DBNull.Value)

                                {

                                    //유효한 값에 대해서 멤버의 속성에 해당 값을 Set 해준다.

 

                                    //쿼리 결과의 칼럼값에 값이 없으면 패스한다.

 

                                    //속성이 아닌 Member 변수를 이용해서 ORM을 구성하시려면 아래 코드를 수정하시오.

 

                                    //개인 취향으로는 속성을 이용하는 것이 이뻐 보입니다.

 

                                    typeT.InvokeMember(propertyInfo.Name, BindingFlags.SetProperty, null, t, new Object[] { row[column.ColumnName] });

                                }

                            }

                        }

                    }

                }

            }

            catch (Exception ex)

            {

                throw ex;

            }

 

            return t;

        }

 

 

그럼 나만의 ORM 만들어 봅시다.

No. Subject Author Date Views
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2021년 1월 업데이트) 코난(김대우) 2021.01.01 401
23 [C#강좌] 06.조건식 SuYoung Kim(김수영) 2011.06.16 24978
22 [C#강좌] 05.Data Type 2 - 참조 형식, 변수, 상수 SuYoung Kim(김수영) 2011.06.16 37487
21 [C#강좌] 04.Data Type 1 - 값 형식 SuYoung Kim(김수영) 2011.06.16 37866
20 [C#강좌] 03.C# 기본 구문 SuYoung Kim(김수영) 2011.06.16 41266
19 [C#강좌] 02.Hello World C# - 기본 개념의 이해 SuYoung Kim(김수영) 2011.06.16 32431
18 [C#강좌] 01.C#의 발전 SuYoung Kim(김수영) 2011.06.16 36617
17 초보 프레임워크 만들기 DB part -1 [1] T__T(이현배) 2011.06.03 15247
» ORM 간단하게 구현하기. [4] T__T 2011.06.01 13686
15 [.NET 4 Customizing] 나만의 dynamic 만들기 [1] 컴포지트 2011.05.12 11589
14 C#의 Dynamic 기능을 소개 - 강보람 코난(김대우) 2011.05.10 11696
13 VBA(Visual Basic Application) 매크로를 C# 4.0으로 변환 (7/7) [1] 코난(김대우) 2011.05.10 15314
12 C# 4.0 문법(grammar) - (6/7) 코난(김대우) 2011.05.10 17434
11 C# 4.0의 공변성과 반공변성(Covariance와 Contravariance) 소개 (2) - (5/7) 코난(김대우) 2011.05.10 17529
10 C# 4.0의 공변성과 반공변성(Covariance와 Contravariance) 소개 (1) - (4/7) 코난(김대우) 2011.05.10 19907
9 C# 4.0의 COM Interop 기능 소개(COM Interop and Office) - (3/7) 코난(김대우) 2011.05.10 17250
8 C# 4.0의 명명된, 옵셔널 파라미터 소개(Named and Optional Parameters) - (2/7) 코난(김대우) 2011.05.10 14342
7 C# 4.0의 새로운 기능 소개 및 동영상 (1/7) 코난(김대우) 2011.05.10 17606
6 MSDN의 Visual C# 공식 웹사이트 - C#을 공부하면서 항상 참조하면 좋은 곳~ 코난(김대우) 2011.05.10 23830
5 MSDN의 C# 개발자 러닝 센터의 C# 강좌 [1] 코난(김대우) 2011.05.10 20618
4 C# 초보 강좌 자료 링크 코난(김대우) 2011.05.10 21514





XE Login