생성된 코드로 보는 Midnight Peach 소개

Midnight Peach 2011. 2. 11. 10:19

[주의]
이 글은 MP의 현재 버전 (3.X)에 맞지 않습니다.

단순 참고용으로만 활용하십시오

Northwind의 몇 개의 테이블을 가지고 진행을 해보겠습니다.

아시다시피 Northwind DB에는 고객, 주문, 제품 테이블들이 있는 이들은 아래와 같은 관계를 가지고 있습니다.

그리고 페이징을 지원하며, 제품 이름과 고객 이름을 검색 조건으로 하고 제품 정보를 반환하는 GetForCompany 라는 메서드가 있다고 가정을 해봅시다.

간단하지만 이 쿼리에는 몇 가지 이슈가 포함되어 있습니다.

A. 여러 단계의 조인(inner / outer)을 사용합니다.

B. 검색 조건에 따라 서로 다른 쿼리를 생성하는 이른바 동적 쿼리가 포함되어 있습니다.

C. 엔터티의 모든 멤버가 아니라 특정 멤버만 반환하는 프로젝션이 필요합니다.

D. 페이징을 지원합니다.

통상적으로 윈폼 환경에서는 클라이언트(윈폼)과 서버(DB) 사이에 미들티어(WCF 서비스 등)을 두게 됩니다.

따라서 위 메서드를 호출하기 위해서는 위 메서드를 WCF 서비스로 만들고 클라이언트에서 이를 호출하여야 합니다.

MP를 이용하면 이 메서드를 3 티어 환경에서 사용하기 위한 코드를 자동으로 생성할 수 있습니다.

즉, 서비스 메서드 등을 따로 만들 필요가 없이 아래와 같이 클라이언트에서 바로 이 메서드를 호출하면 됩니다.

MP는 WCF 서비스가 있는 경우와 없는 경우(즉, 클라이언트가 DB 서버에 바로 연결되는 경우)를 모두 지원하며, 아무런 코드 수정 없이 두 경우를 자유롭게 변경할 수 있습니다.
위 코드와 같이 릴리즈 모드에서만 BizRepository.ActivateService 메서드가 호출되도록 구성해놓으면, 디버그 모드에서는 DB에 바로 접속을 하고, 릴리즈 모드에서는 WCF 서비스를 사용하도록 할 수 있습니다.

아래 그림은 각 경우에 있어서 메서드들 간의 호출순서를 표현한 것입니다.

하늘색은 DB에 바로 접속하는 경우이며 주황색은 WCF 서비스를 경유하는 경우인데, ‘경계통과’ 라 함은 각 경우에 있어 실행 흐름이 클라이언트에서 서버로 넘어가는 것을 말합니다.

그림에서 보다시피 두 경우는 ProductBiz에서 갈라지는데, 이는 ProductBiz가 ProductData 객체를 가지고 있느냐, 아니면 ProductData를 상속 받은 ProductServiceData 객체를 가지고 있느냐에 달려 있습니다.

이를 결정하는 것이 바로 BizRepository.ActivateService 메서드가 하는 일입니다.

 

위 그림을 염두에 두고, MP가 생성하는 코드들을 살펴보면 다음과 같습니다.

1. 각 엔터티에 대해 30가지 이상의 기본 메서드를 생성합니다.

A. 조건식과 정렬식과 페이징을 지원하는 Get 메서드 (8개의 오버로드)

예컨데, ‘재고 수가 10개 이상인 상품을 이름순으로 5개를 가져오는 쿼리’는 아래와 같은 람다식을 사용하면 바로 실행할 수 있습니다.

B. 엔터티의 PK를 검색 조건으로 하는 GetSingle 메서드

C. 조건식과 정렬식을 지정하여 첫번째 혹은 마지막 원소를 반환하는 메서드 (각 4개의 오버로드)

D. 조건식에 해당하는 엔터티의 갯수를 구하는 메서드 (4개의 오버로드)

E. 하나의 엔터티를 삽입/수정/삭제하는 메서드 (각 2개의 오버로드)

F. 트랜잭션을 지원하며 엔터티의 컬렉션을 삽입/수정/삭제하는 메서드 (각 2개의 오버로드)

2. 각 엔터티에 대해 다양한 헬퍼 코드를 생성합니다.

A. 기본값이 지정된 생성 메서드

B. 복사 메서드

C. 부분 메서드를 사용하여 재정의가 가능한 ToString 메서드

D. IEditableObject 인터페이스 구현

E. 속성 이름에 대한 상수값과 열거형 타입

F. 엔터티의 PK를 사용하여 엔터티의 동등성을 비교하는 IEqualityComparer 인터페이스를 구현

3. WCF 서비스를 위한 코드를 생성합니다.

A. 서비스 메서드 (ProductService.GetForCompany)

B. 서비스 메서드를 호출 래퍼 (ProductServiceData.GetForCompany)

C. 비지니스 레이어 메서드(ProductBiz.GetForCompany)

: