사용자 정의 로직의 추가

Midnight Peach 2008. 10. 9. 00:04

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

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

이번에는 좀 더 실용적인 예제를 살펴 보겠습니다.

MP가 생성해 낸 코드는 기본적인 데이터 액세스 레이어입니다. 가장 흔히 쓰이는 CRUD 작업은 지원되지만, 실무에서 요구되는 복잡한 비지니스는 물론 직접 작성하여야 합니다.

여기서는 사용자 정의 로직을 추가하고 이를 MP가 생성한 코드와 통합하는 방법에 대해서 알아 보겠습니다.

 

첫번째 예는 Memo 엔터티에 속성과 메서드를 하나씩 추가해 보겠습니다.

Memopad.Biz 프로젝트에 Entities 라는 폴더를 만들고 Memo 부분 클래스를 아래와 같이 추가합니다.

 

Entities 폴더나 Memo 클래스는 모두 MP가 생성한 Generated 폴더에 있지만, 이 생성된 Memo 클래스를 수정해서는 안됩니다.

왜냐하면 Memo 테이블의 스키마가 변경되거나 하여 다시 코드를 생성하면 기존의 수정 내용이 덮어씌여지기 때문입니다.

따라서 Generated 폴더 바깥에 Memo 클래스의 부분 클래스를 만들고, 커스텀 로직은 이곳에 작성하도록 합니다.

물론 부분 클래스이기 때문에 네임 스페이스는 동일하여야 합니다. (여기서는 Memopad.Biz)

(참고로 Memo와 같은 엔터티 클래스는 세 개의 부분 클래스로 이루어집니다. 첫번째는 LINQ to SQL 디자이너가 생성한 것이고(Memopad.designer.cs), 두번째는 MP가 생성해 낸 것이고(\Generated\Entities\Memo.cs), 마지막은 사용자가 추가한 것입니다. (여기서는 \Entities\Memo.cs))

Memo 클래스에는 작성일(시각을 제외한) 속성과 유효한 상태인지를 검사하는 메서드를 예제로 추가하였습니다.

 

이번에는 Memo의 DTO 객체인 MemoManager에 새로운 쿼리를 추가해 보겠습니다.

조회수가 N 이상인 메모의 제목과 본문을 각각 키와 값으로 하는 SortedDictionary를 반환하는 메서드를 만들겠습니다.

Memopad.Biz 프로젝트에 Managers 라는 폴더를 만들고 MemoManager 부분 클래스를 추가합니다.

 

메서드를 하나 더 추가해 봅시다.

Memo 테이블은 계층적인 구조를 가집니다. 이를 이용하여 자신과 자신의 자손들을 반환하는 메서드를 추가해 봅시다.

이러한 재귀적인 쿼리는 LINQ to SQL로 작성하기 보다는, SQL 서버 2005에 새로 추가된 CTE(Common Table Expression) 구문을 사용하는 것이 더욱 효율적입니다.

따라서 이번에는 저장 프로시져를 이용하도록 하겠습니다.

 

데이터베이스에 아래와 같은 저장 프로시져를 추가합니다.

 

이 프로시져를 실행한 결과는 다음과 같습니다.

exec Memo_GetChildren 1

 

비주얼 스튜디오에서 LINQ to SQL 디자이너를 열고, 서버 탐색기에서 Memo_GetChildren 프로시져를 Memo 클래스로 끌어다 놓습니다.

 

이제 MemoDataContext 클래스에 Memo_GetChildren 이라는 메서드가 생겼습니다.

MemoManager 클래스에 아래와 같이 메서드를 추가합니다.

Memopad.Console 프로젝트에 아래와 같은 코드를 추가하여 결과가 제대로 나오는지 확인해 봅니다.

 

실행한 결과는 다음과 같습니다.

 

이상 MP가 생성해 낸 코드에 사용자 정의 로직을 추가하는 방법에 관해서 알아 보았습니다.

: