'분류 전체보기'에 해당되는 글 189건

  1. 2008.10.16 실버라이트 2 출시
  2. 2008.10.15 MP 튜토리얼에서 사용된 샘플 프로젝트
  3. 2008.10.15 MP의 데이터베이스 트랜잭션 지원
  4. 2008.10.14 MP 1.1 업데이트
  5. 2008.10.10 MP의 구성
  6. 2008.10.09 사용자 정의 로직의 추가
  7. 2008.10.09 단위 테스트 코드를 이용한 사용 예제
  8. 2008.10.08 Midnight Peach가 만들어 낸 코드
  9. 2008.10.08 Midnight Peach의 빠른 시작
  10. 2008.10.08 Midnight Peach 소개와 FAQ

실버라이트 2 출시

번역/ScottGu's Blog 2008. 10. 16. 16:45

원문 : http://weblogs.asp.net/scottgu/archive/2008/10/14/silverlight-2-released.aspx

실버라이트 2의 최종 릴리즈가 오늘 출시되었습니다. 이곳에서 실버라이트 2와 비주얼 스튜디오 2008과 익스프레션 블렌드 2용 실버라이트 2 지원 도구를 다운로드 할 수 있습니다.

크로스 플랫폼 / 크로스 브라우저 .Net 개발

실버라이트 2는 브라우저 내에서 풍부한 미디어 경험과 .NET RIA(리치 인터넷 응용프로그램)를 지원하는 크로스 플랫폼 브라우저 플러그인입니다.

실버라이트 2는 크기가 작고(4.6MB), 겨우 4초에서 10초 가량이면 설치가 가능합니다. 닷넷 프레임웍은 설치되어 있지 않아도 괜찮습니다. 실버라이트 설치 다운로드는 비디오를 재생하고 응용프로그램을 실행하는 데 필요한 모든 것을 포함하고 있습니다.

개발자는 모든 닷넷 언어(VB, C#, JavaScript, IronPython, IronRuby 포함)를 사용하여 실버라이트  응용프로그램을 개발할 수 있습니다. 실버라이트는 개발과 관련하여 아래와 같은 풍부한 기능을 제공합니다.

  • WPF UI 프레임웍: 실버라이트 2에는 강력한 웹 응용프로그램을 더욱 쉽게 만들 수 있는 풍부한 UI 프레임웍이 탑재되어 있습니다. 이에는 강력한 그래픽과 애니메이션 엔진 뿐만 아니라, 컨트롤, 레이아웃 관리, 데이터 바인딩, 스타일, 템플릿 스킨 등과 같은 고수준의 UI 기능이 포함되어 있습니다. 실버라이트의 WPF UI 프레임웍은 전체 닷넷 프레임웍 WPF UI 프레임웍의 호환 가능한 하위 집합이라서, 개발자들은 강력한 크로스 브라우저 웹 응용프로그램과 데스크탑 윈도우즈 응용프로그램을 개발하는 있어 기술, 컨트롤, 코드, 컨텐츠를 재활용할 수 있습니다.

  • 풍부한 컨트롤들: 실버라이트 2에는 개발자와 디자이너가 신속하게 응용프로그램을 만들 수 있도록 풍부한 컨트롤이 내장되어 있습니다. 실버라이트 2는 핵심 폼 컨트롤(TextBox, CheckBox, RadioButton, ComboBox 등), 내장 레이아웃 관리 패널(StackPanel, Grid, Panel 등), 공통 기능 컨트롤(, ScrollViewer, Calendar, DatePicker 등), 데이터 조작 컨트롤(DataGrid, ListBox 등)을 탑재하고 있습니다. 모든 실버라이트 컨트롤은 풍부한 컨트롤 템플릿 모델을 지원하고 있어서, 개발자와 디자이너가 협업하여 고품질의 솔루션을 만들 수 있습니다.

  • 강력한 네트웍 지원: 실버라이트 2는 강력한 네트웍 지원 기능을 포함하고 있습니다. 이는 REST, WS*/SOAP, POX, RSS, 그리고 표준 HTTP  서비스에 대한 투명한 지원을 포괄하고 있습니다. 게다가 실버라이트 2는 크로스 도메인 네트웍 접근도 지원합니다. (즉, 실버라이트 클라이언트가 웹 상의 리소스나 데이터에 바로 접근할 수 있다는 이야기입니다.) 마지막으로 실버라이트에는 소켓 네트웍 지원도 내장되어 있습니다.

  • 풍부한 베이스 클래스 라이브러리: 실버라이트 2에는 풍부한 기능성 닷넷 베이스 클래스 라이브러리가 탑재되어 있습니다. (컬렉션, IO, 제네릭, 쓰레딩, 전역화, XML, 지역 저장소 등) 또한 HTML DOM/JavaScript를 닷넷 코드와 통합하는 풍부한 API도 내장하고 있으며, LINQ와 LINQ to XML에 대한 지원(따라서 데이터의 전송과 쿼리가 쉽습니다.), 로컬 데이터 캐싱과 저장소에 대한 지원도 포함하고 있습니다.

  • 풍부한 미디어 지원: 실버라이트 2는 고화질의 비디오를 재생하고 웹을 통해 스트리밍(라이브 혹은 온디맨드 방식을 모두 지원합니다) 하기 위한 내장 비디오 코덱을 가지고 있습니다. 실버라이트 2에는 네트웍 상태에 따라 비디오의 비트레이트를 시청 중에 바로 변경할 수 있는 기능(따라서 사용자는 "버퍼링..." 같은 짜증나는 메시지를 보지 않아도 됩니다.), 비디오 스트림에 광고를 삽입하고 측정하는 기능, 컨테츠를 보호하는 기능도 포함되어 있습니다

실버라이트 2 최종 릴리즈는 방대한 수준의 강력함과 유연함을 제공합니다. 이로 인해 기존의 브라우저에서 할 수 있던 일의 경계를 무너뜨리고 놀라운 최종 사용자 경험을 가능하게 합니다.

실버라이트의 고객들

(역자 주 : 이 부분은 실버라이트의 여러 적용 사례를 이야기하고 있습니다. 생략하도록 하겠습니다.)

Over the last few months a number of very high profile sites have successfully launched using the beta releases of Silverlight 2. 

In August, NBC hosted the Olympics live on nbcolympics.com and served up 1.3 billion page views, 70 million video streams, and 600 million minutes of video content - making it the largest ever media event on the web.  Users visiting the site spent an average of 27 minutes on the site when they watched a video - an unprecedented number for online traffic.

In August, the Democratic National Convention was streamed live using Silverlight, and broadcast a 2Mbit live video feed of the event and speeches - receiving outstanding feedback from audiences watching it.

This month a number of other high profile sites are going live with the final release of Silverlight 2.  CBS College Sports Network will be streaming 20,000 hours of live games for 150+ college and university partners.  AOL is launching their new AOL Mail browser version to 60 million users using Silverlight 2.  Blockbuster will be launching their new MovieLink subscription service using Silverlight.  Yahoo! Japan is live today enabling live streaming of Major League Baseball games.  Hard Rock International will be updating their memorabilia site with new features.  And companies like Toyota, HSN and hundreds of others will be live this week as well.

실버라이트 툴팁

실버라이트 2는 수 십 개의 내장 UI 컨트롤과 함께 출시됩니다. 아래는 실버라이트 2의 최종 릴리즈에 포함된 DataGrid, RadioButton, CheckBox, DatePicker의 스크린샷입니다.


이에 더하여 실버라이트 2에서 사용할 수 있는 수 십 개의 컨트롤로 구성된 "실버라이트 툴킷"도 출시됩니다. 향후 몇 달 동안 새로운 컨트롤들이 이 컨트롤 팩에 추가될 예정입니다. (최종적으로 100개가 넘는 컨트롤을 탑재하는 것을 목표로 하고 있습니다.) 툴킷의 첫번째 릴리즈에서는 TreeView, DockPanel, WrapPanel, ViewBox, Expander, NumericUpDown, AutoComplete 등의 컨트롤이 포함되어 있습니다. 모든 컨트롤은 완전한 소스와 함께 제공이 되며, OSI 라이센스를 따르기 때문에 자유롭게 소스를 수정하실 수 있고 어떤한 목적으로든 자유롭게 사용하실 수 있습니다.

상호호환성

또 한 가지 오늘 발표할 내용은, 마이크로소프트가 Soyatec와 파트너가 되어 크로스 플랫폼인 이클립스 개발 플랫폼에서 실버라이트를 개발할 수 있는 추가 툴을 스폰서하기로 하였다는 것입니다. 여기에 가시면 더 자세한 정보를 보실 수 있고 무료 실버라이트 이클립스 플러그인도 다운받을 수 있습니다. 또한 여기에 가시면 이클립스 툴을 이용하여 실버라이트 2 응용프로그램을 개발하는 단계적 튜토리얼도 보실 수 있습니다.

또한 Open Specification Promise (OSP)에 따라 실버라이트 XAML 어휘와 스키마가 릴리즈 되었다는 사실도 알려드립니다. 이에 의해 이제 누구든지 실버라이트 XAML을 읽고 쓸 수 있는 제품을 개발할 수 있게 되었습니다. 이에 대해 더 자세한 내용은 여기서 확인하실 수 있습니다.

실버라이트 2 배우기

실버라이트 2를 배우는 가장 좋은 방법은 www.silverlight.net 웹사이트를 방문하는 것입니다. 그곳에 가시면 무료 온라인 튜토리얼과 비디오와 연습을 찾으실 수 있습니다. 또한 이 사이트에는 MVP와 마이크로소프트 실버라이트 팀원들이 기술적인 질문에 대답을 해주는 포럼도 준비되어 있습니다. 아울러 Silverlight Community RSS Feed, Jesse Liberty의 블로그, Tim Heuer의 블로그를 구독하는 것도 좋은 방법입니다.

저도 얼마전에 제 Digg 클라이언트 튜토리얼을 실버라이트 2 최종 릴리즈에 맞게 업데이트 하였습니다. 이 튜토리얼에는 실버라이트 2 응용프로그램을 처음부터 끝까지 만드는 연습과 이에 대한 프로그래밍적 배경(컨트롤, 레이아웃 관리, 네트워킹, 데이터 바인딩, 사용자 정의 컨트롤, 컨트롤 템플릿 등)이 설명되어 있습니다. 만일 실버라이트나 WPF를 처음 접하신다면 기본 이해 차원에서 읽어보실 것을 권장합니다.

 

비주얼 스튜디오 2008의 어떤 버전을 사용하더라도 실버라이트 2 응용프로그램을 개발할 수 있습니다. 간단히 비주얼 스튜디오 2008용 실버라이트 툴만 설치하시면 됩니다.

만일 VS 2008이 없다면, 무료인 Visual Web Developer 2008 Express SP1 Edition을 설치하시면 됩니다. 이 무료 툴은 강력한 ASP.NET 개발 툴을 지원하는데 이제 실버라이트 2 개발도 지원할 수 있게 되었습니다. Visual Web Developer 2008 Express Edition을 사용해도 위의 튜토리얼을 모두 연습하실 수 있습니다. 물론 완전한 인텔리센스, 디버깅, 배포 기능도 제공됩니다.

베타 버전에서 업그레이드

VS Tools for Silverlight의 베타2 혹은 RC 버전, 또는 실버라이트 2 베타 SDK 나 실버라이트 2 개발자 에디션을 가지고 계신다면 오늘자 릴리즈를 설치하시기 전에 모두 제거하셔야 합니다.

실버라이트 1이나 실버라이트 2 베타1 혹은 베타2를 설치한 사용자는 이달 하순부터 실버라이트 2 최종 릴리즈로 자동 업데이트 됩니다. 그전까지는, 사용자가 실버라이트 2 사이트를 방문하면 일반적인 설치 프롬프트가 뜨는데, 이를 클릭하면 실버라이트 2 최종 릴리즈로 업데이트 되게 됩니다. (사용자는 이전 버전을 삭제할 필요가 없습니다. 실버라이트 2는 실버라이트 1이나 이전 버전들 위에 깨끗하게 설치가 됩니다.)

실버라이트 2 베타2와 실버라이트 2 최종 릴리즈 사이에는 많은 변경이 있었기 때문에, 실버라이트 2 최종 릴리즈를 설치한 사용자는 실버라이트 베타2로 작성된 응용프로그램을 실행할 수 없습니다. 대부분의 주요 실버라이트 2 사이트는 24시간 안에 최종 릴리즈로 업그레이드 될 예정입니다. (따라서 이 문제는 해결이 되게 됩니다.) 하지만 만일 업그레이드 전에 사이트를 방문하면 문제가 발생할 수 있는데, 물론 모든 사이트가 일단 업그레이드 되면 이 문제는 저절로 해결이 될 것입니다. (바로 이 문제 때문에 - 개발자들로 하여금 최종 릴리즈를 준비할 수 있도록 하기 위하여 - 지난 달에 저희가 RC 버전을 발표한 것입니다.)

정리

실버라이트 2는 새로운 응용프로그램과 미디어 경험의 구축을 가능하게 하고 개발자가 모든 브라우저에서 동작하는 응용프로그램을 개발하는데 닷넷을 사용할 수 있도록 한 주요 릴리즈 입니다.

작년 한 해 동안 저희의 작업에 대해 도움과 피드백을 주신 모든 분께 감사드립니다. 저희 실버라이트 팀 모두는 개발자 여러분이 이것을 가지고 무엇을 만들어 내실지 정말 기대가 큽니다.

스캇.

:

MP 튜토리얼에서 사용된 샘플 프로젝트

Midnight Peach 2008. 10. 15. 22:26

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

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

다운로드


Memopad가 사용하는 데이터베이스의 스키마는 다음과 같습니다.

SQL 파일은 위 소스에 포함되어 있습니다.


위 스키마를 가지고 생성한 DBML은 다음과 같습니다.



그리고 아래는 프로젝트의 모든 폴더를 펼친 그림 입니다.



샘플 프로젝트를 간단하게 하기 위해 데이터 액세스 레이어와 비지니스 로직 레이어를 분리하지 않았습니다.

Memopad.Biz 프로젝트는 데이터 액세스 레이어를 포함한 비지니스 로직 레이어입니다.


B 폴더는 MP가 생성한 코드이며,  A와 C 폴더는 각각 사용자가 작성한 커스텀 로직을 가지고 있는 엔터티와 엔터티 매니저 폴더 입니다.

A와 C 폴더에 있는 모든 클래스들은 부분 클래스로 구현되어 있습니다.

따라서 데이터베이스의 스키마가 변경되거나 하여 DBML 파일이 수정된다면, MP로 다시 코드를 생성하게 되는데, 이때 새로 생성된 코드를 B 폴더에 덮어 쓰면 A와 C 폴더에 있는 사용자가 작성한 코드의 내용은 유지되게 됩니다.


Memopad.Test는 Memopad.Biz에 대한 단위 테스트 프로젝트입니다.

현재는 Memo 엔터티에 대한 단위 테스트 코드 만이 작성되어 있습니다.


단위 테스트를 수행하려면 다음과 같이 App.config 파일의 연결 문자열을 적절하게 수정하여야 합니다.


:

MP의 데이터베이스 트랜잭션 지원

Midnight Peach 2008. 10. 15. 18:03

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

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

MP는 LINQ to SQL을 기반으로 하고 있기 때문에, LINQ to SQL가 지원하는 것과 동일하게 데이터베이스 트랜잭션을 지원합니다.

바로 샘플 코드를 보면서 이야기하도록 하겠습니다.

 

샘플은 MemoManager 클래스에 트랜잭션을 타는 삽입 / 갱신 / 삭제 메서드를 추가하는 것 입니다.

MemoManager 클래스에 대해서는 이전 튜토리얼들을 참조하시기 바랍니다.

 

삽입

먼저 트랜잭션을 타는 삽입 작업을 봅시다.

 

 

MemopadDataContext 객체를 생성하고 Memo 엔터티 두 개를 삽입합니다.

SubmitChanges 메서드는 항상 내부적으로 트랜잭션을 타고 있습니다.

따라서 두 엔터티의 삽입 중 하나라도 에러가 발생하면 모든 엔터티의 삽입은 롤백 됩니다.

 

이를 사용하는 단위 테스트 코드를 볼까요?

 

 

Memo 엔터티 두 개를 트랜잭션을 태워 삽입하려고 합니다.

만일 트랜잭션이 커밋되면 삽입하기 전과 삽입한 후의 레코드의 갯수는 다를 것입니다.

하지만 삽입 작업 중 에러가 발생하면 트랜잭션이 롤백 되면 삽입 전후의 레코드의 갯수가 동일할 것입니다.

이 테스트에서는 그것을 체크하고 있습니다.

 

417번 줄은 (Memo의 Subject 에는 null을 입력할 수 없는 것을 이용한) 의도적으로 삽입 에러를 발생시키 위한 코드입니다.

 

테스트 결과는 물론 파란불 입니다.

즉, 첫번째 삽입이 수행된 후의 두번째 삽입에서 에러가 발생하여 첫번째 삽입을 롤백시킨 것을 알 수 있습니다.

 

갱신

이번에는 트랜잭션을 타는 갱신 메서드의 예를 봅시다.

 

 

75번과 78번 줄에서 Clone 메서드를 통해 원 객체의 복사본을 만든 이유는 memo0과 memo1이 로드된 DataContext와 갱신되는 DataContext가 서로 다르기 때문입니다.

로드하는 데 사용된 DataContext는 아마도 위 UpdateInTransaction 메서드를 호출하는 곳에서 생성되었을 것입니다.

반면에 갱신하는 데 사용되는 DataContext는 73번 라인에서 생성됩니다.

Attach 메서드에 대한 자세한 설명은 MSDN을 참고하시기 바랍니다.

 

이 메서드에 대한 단위 테스트 코드는 다음과 같습니다.

 

 

역시 null 값을 허용하지 않는 Memo.Subject 속성에 의도적으로 null을 집어넣어(434 번 줄) 트랜잭션의 롤백을 일으키고 있습니다.

 

삭제

마지막으로 삭제 메서드를 살펴 봅시다.

 

 

복사본을 만들어 DataContext에 Attach 하는 것은 갱신의 경우와 동일합니다.

그리고 DeleteOnSubmit 메서드를 호출하여 삭제 작업을 기록해 둡니다.

실제 삭제는 106번 줄에서 SubmitChanges 메서드가 호출될 때 일어나는데, 기록된 삭제 작업 중 하나라도 에러가 발생하면 전체 삭제가 롤백 됩니다.

 

이에 대한 단위 테스트 코드는 아래와 같습니다.

 

 

코드에서 드러나지는 않지만, Memo 객체는 Reading 객체와 참조 관계를 가지고 있습니다.

따라서 Reading 객체에 연결된 Memo 객체를 삭제하려고 하면 에러가 발생합니다.

450번 라인에서 list[0] 객체는 Reading에서 참조되지 않지만, list[3]는 Reading에서 참조되고 있는 객체입니다.

그래서 두 Memo 객체를 트랜잭션으로 묶어 삭제하는 작업은 롤백이 되어, 삭제 전과 후의 전체 레코드의 갯수는 동일합니다.

테스트는 이 사실을 검증합니다.

:

MP 1.1 업데이트

Midnight Peach 2008. 10. 14. 01:01

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

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

설명 컬럼

패키지의 변수 테이블에 설명 컬럼이 추가되었습니다.

 

CollectionType

기본 내장 패키지인 Default에 새로운 변수 CollectionType이 추가되었습니다.

기존에는 Get 메서드가 반환하는 컬렉션 타입이 List<T>로 고정되어 있었는데, 이제는 이를 직접 지정할 수 있습니다.

 

예를 들어 CollectionType을 기본값인 List로 그냥 두면,

와 같은 코드가 생성되나, 이를 BindingList로 지정하면,

로 변경됩니다.

 

CollectionType에 지정할 수 있는 타입은 ICollection<T> 제네릭 인터페이스를 구현하여야 합니다.

이 요구사항만 충족하면 Kimgwajang.Collection.Vector와 같은 커스텀 컬렉션도 사용할 수 있습니다.

 

컬렉션에 대한 삽입 / 갱신 / 삭제

엔터티 단위가 아닌 컬렉션 단위로 Insert / Update / Delete를 실행할 수 있게 되었습니다.

이제 많은 수의 엔터티를 삽입 / 갱신 / 삭제 할 때는 각 엔터티를 N번 전달하는 대신에 엔터티의 컬렉션을 전달할 수 있게 되었습니다.

즉, 기존에는 아래와 같이 작성하던 코드를

 

다음과 같이 좀 더 간단하게 작성할 수 있게 되었습니다.

 

이는 단순히 삽입 / 갱신 / 삭제를 호출하는 코드의 양이 조금 줄어든 것 이상의 의미가 있습니다.

컬렉션을 대상으로 삽입 / 갱신 / 삭제를 하면 컬렉션의 각 엔터티에 대해 매번 DataContext 객체를 생성하는 것이 아니라, 컬렉션 전체에 대해 하나의 DataContext 객체만을 생성하기 때문에, DataContext 객체를 생성하는 오버헤드를 줄일 수 있습니다.

 

아래 코드는 EntityManager<T>에 새로 추가된 Delete 메서드 입니다.

코드에서 보듯이 DataContext 객체가 하나만 생성됨을 알 수 있습니다.

또한 반환값으로 삭제된 엔터티의 갯수가 반환되는 것도 확인할 수 있습니다.

 

삽입 / 갱신과 엔터티의 상태 추적

또한 삽입과 갱신의 경우에는, 전달된 컬렉션의 모든 엔터티에 대해 무조건 삽입 혹은 갱신하는 것이 아니라, 엔터티의 상태에 따라 삽입 혹은 갱신 작업이 결정됩니다.

예를 들어 아래와 같은 코드가 있다고 합시다.

 

291번 줄에서 list에는 5 개의 메모가 담기게 됩니다.

그 중 하나의 엔터티를 수정하고, 컬렉션 전체에 대해서 Update를 호출합니다.

반환값인 count에는 Update 메서드에 의해 갱신된 엔터티의 갯수가 들어가는데, 여기서는 이 값이 1이 됩니다.

즉, 5 개의 엔터티가 있는 컬렉션에서 한 엔터티를 수정하고, 이 컬렉션을 Update 하면 갱신된 엔터티의 숫자가 1인 것을 알 수 있습니다.

 

이것이 가능한 이유는 각 엔터티가 자신의 상태를 가지고 있고, Update 메서드가 이 상태를 추적하여 갱신 여부를 판별하기 때문입니다.

 

주의 : 현재 버전의 MP에서 삭제 작업에는 엔터티의 상태 추적이 사용되지 않습니다. Delete에 컬렉션이 전달되면 컬렉션 내의 모든 엔터티가 (그 상태에 관계 없이) 삭제됩니다.

 

엔터티의 상태

엔터티는 세 가지 중 한 가지 상태를 가집니다.

 

 

각 상태 간의 변경은 아래 상태 다이어그램과 같습니다.

데이터베이스에서 로드되었는지 혹은 사용자가 생성하였는지에 따라, 엔터티는 Clean 혹은 Created 상태를 가지게 됩니다.

 

그림에서 보듯이, Created 상태의 엔터티는 Insert 메서드가 실행됨에 의해 Clean 상태로 밖에 변할 수 없습니다.

Clean 상태는 사용자가 엔터티의 값을 변경하면 Dirty 상태가 되었다가, Update 메서드가 실행되고 나면 다시 Clean 상태로 변경됩니다.

또한 Created 상태의 엔터티가 Clean 상태를 거치지 않고 Dirty 상태가 될 수도 없고, Clean 상태의 엔터티가 Created 상태가 될 수도 없습니다.

 

이렇게 엔터티의 상태를 추적하는 이유는 Insert 와 Update 메서드에 엔터티의 컬렉션이 전달될 때, 컬렉션 전체에 대해서가 아니라 해당하는 엔터티에 대해서만 삽입 혹은 갱신 작업을 하기 위해서입니다.

즉, Insert 메서드는 전달 받은 컬렉션에 있는 Created 상태의 엔터티에 대해서만 실행이 되고 Update는 컬렉션의 Dirty 엔터티에 대해서만 실행이 되는 것입니다.

 

한 가지 주의하여할 할 점은, 커스텀 로직을 추가하는 경우에는 엔터티의 초기 상태를 직접 설정하여야 한다는 것입니다.

엔터티 객체가 생성되면 기본값으로 엔터티 상태는 EntityStaus.Created가 됩니다.

하지만 아래와 같이 EntityManager의 Get 메서드 대신 데이터베이스에서 엔터티를 로드하는 코드를 작성한다면, 반드시 엔터티의 상태를 EntityStatus.Clean으로 변경하는 코드를 포함하고 있어야 합니다.

(그러지 않으면 이렇게 생성된 엔터티들은 갱신이 되지 않습니다.)

 

 

코드의 마지막에서 호출하는 ToCleanCollection 메서드는 EntityManager에 정의되어 있는 헬퍼 메서드입니다.

컬렉션의 각 원소의 엔터티 상태를 EntityStatus.Clean으로 설정한 후, 새로운 컬렉션에 담아 반환하는 일을 합니다.

 

 

위 메서드는 List<T>형만 반환하는 특화된 버전인 반면에, ToCleanCollection 메서드에는 제네릭 버전도 있습니다.

 

 

아래는 제네릭 ToCleanCollection을 사용하는 예제입니다.

 

:

MP의 구성

Midnight Peach 2008. 10. 10. 14:35

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

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

MP의 주요 구성 요소를 도해하면 대략 아래와 같은 그림이 됩니다.

DBML과 패키지는 코드를 생성하기 위해 사용자가 제공하는 요소이며, 스키마는 코드 생성을 위해 DBML에 있는 데이터베이스 모델을 추상화시킨 엔터티입니다.

 

코드 생성기가 코드를 생성하기 위해서는 두 개의 입력이 필요한데, 스키마와 패키지가 그것입니다.

스키마는 스키마 추출기가 DBML 파일에서 추출하며, 패키지는 MP의 내장 패키지 혹은 사용자 정의 패키지로 제공될 수 있습니다.

 

MP의 범용성은 바로 이 두 가지 입력에서 기인합니다.

DBML에 있는 데이터 모델을 바로 이용하지 않고 스키마 라는 추상 구성요소를 두고 있기 때문에, 다른 데이터베이스 시스템을 지원할 수 있습니다.

만일 MySql이나 Oracle을 지원해야 한다면, 각각 MySql과 Oracle용 스키마 추출기만 추가하면 될 것입니다.

 

MP는 LINQ to SQL에 기반을 두고 있기 때문에 MS SQL 서버 외의 다른 데이터베이스는 지원하지 않습니다만, MP의 전신이라고 할 NOW 라는 코드 생성기에서는 위와 같은 구조에 의해 다른 데이터베이스를 지원합니다. (NOW는 아직 공개할 만한 수준이 되지 않아 공개하지 못하고 있습니다)

 

MP의 범용성을 이루는 두 번째 요소는 패키지 입니다.

패키지는 한 개의 패키지 정의 파일(확장자가 pds)과 여러 개의 템플릿 파일(확장자가 tpl)로 이루어져 있습니다.

 

패키지 정의 파일은 패키지와 그에 속한 템플릿에 대한 각종 설정이 저장되는 XML 파일 입니다.

예를 들어 아래 그림은 패키지 정의 파일에 대한 설정을 지정하는 것입니다.

 

패키지 정의 파일에는 두 개의 XML 요소(Element)가 있습니다.

패키지에서 사용되는 변수를 정의하는 Variable과 템플릿의 정보를 설정하는 Template 요소가 그것입니다.

(GeneratedCode 라는 요소도 있지만 이는 MP 내부에서 임시로 사용되기 때문에 여기서는 제외합니다.)

아래 그림은 패키지 정의 파일의 XSD를 XSD 디자이너에서 연 화면 입니다.

 

패키지 정의 파일과 함께 패키지를 이루는 두 번째 구성품은 템플릿입니다.

템플릿은 매크로가 포함된 단순한 텍스트 파일입니다.

코드 생성기는 템플릿에 포함된 매크로를 스키마에 있는 적절한 값으로 치환시켜 코드를 생성합니다.

 

예를 들어 MP가 생성한 아래 코드에 대해 생각해봅시다.

이 코드를 생성하는 템플릿은 아래와 같습니다.

이 템플릿에 스키마 추출기가 추출해 낸 Memo 라는 스키마 엔터티를 전달하면 위와 같은 코드가 생성되는 것입니다.

이 경우 Memo를 템플릿의 소스라고 할 수 있겠습니다.

 

마지막으로 템플릿은 적용 범위를 가집니다.

템플릿의 소스가 데이터베이스이냐 테이블이냐에 따라서, 이는 "database" 혹은 "table" 중의 하나입니다.

 

위 템플릿 예제는 "table" 적용 범위를 가진 템플릿입니다. 따라서 템플릿의 소스는 테이블인 Memo가 됩니다.

반면에 아래 템플릿과 그에 의해 생성된 코드는 "database" 적용 범위를 가진 템플릿의 예입니다.

 

 

:

사용자 정의 로직의 추가

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가 생성해 낸 코드에 사용자 정의 로직을 추가하는 방법에 관해서 알아 보았습니다.

:

단위 테스트 코드를 이용한 사용 예제

Midnight Peach 2008. 10. 9. 00:02

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

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

지금부터는 위에서 생성된 코드를 가지고 실제로 CRUD 작업을 하는 코드를 보도록 합시다.

따로 샘플을 만들 필요 없이 MP 개발 중에 사용한 단위 테스트 코드 조각을 예제로 사용하면 될 것 같습니다.

(이하의 코드들은 비주얼 스튜디오 2008의 테스트 프로젝트를 이용하여 작성한 단위 테스트 코드 입니다.)

먼저 각 테스트가 수행되기 전 항상 DB를 초기화하는 메서드를 만들어 놓고 시작하겠습니다.

ManagerRepository.TruncateAll() 메서드는 Memo 테이블의 모든 데이터를 삭제하고 identity 값을 0으로 설정하는(DBCC CHECKIDENT ('Memo', RESEED, 0)) 저장 프로시저에 대한 래퍼입니다.

Get

public List<T> Get()

public List<T> Get(int startRowIndex, int maximumRows)

public List<T> Get(Expression<Func<T, bool>> where)

public List<T> Get(Expression<Func<T, bool>> where, int startRowIndex, int maximumRows)

public List<T> Get<U>(Expression<Func<T, U>> orderBy, bool ascending)

public List<T> Get<U>(Expression<Func<T, U>> orderBy, bool ascending, int startRowIndex, int maximumRows)

public List<T> Get<U>(Expression<Func<T, bool>> where, Expression<Func<T, U>> orderBy, bool ascending)

public List<T> Get<U>(Expression<Func<T, bool>> where, Expression<Func<T, U>> orderBy, bool ascending, int startRowIndex, int maximumRows)

Get은 엔터티의 컬렉션을 반환하는데 매개 변수로 필터링과 정렬과 페이징을 지정할 수 있습니다.

따라서 Get은 총 2 * 2 * 2 = 8 개의 오버로드를 가지고 있습니다.

하나씩 살펴보면 다음과 같습니다.

GetSingle

public T GetSingle(Expression<Func<T, bool>> where)
public T GetSingle(PK 매개변수)

GetSingle은 조건식에 맞는 한 개의 엔터티를 구합니다.

일반적으로 PK가 조건식으로 지정되며, 조건에 맞는 엔터티가 하나도 없으면 null이 반환되고, 두 개 이상이면 InvalidOperationException이 발생합니다.

조건은 람다식으로 지정하거나 변수로 지정할 수 있습니다.

GetFirst

public T GetFirst()

public T GetFirst(Expression<Func<T, bool>> where)

public T GetFirst<U>(Expression<Func<T, U>> orderBy, bool ascending)

public T GetFirst<U>(Expression<Func<T, bool>> where, Expression<Func<T, U>> orderBy, bool ascending)

조건식에 맞는 엔터티를 지정된 정렬 방법에 따라 정렬했을 때 첫번째 엔터티를 구합니다.

지정된 조건을 만족하는 엔터티가 없으면 null  값이 반환됩니다.

GetLast

public T GetLast()

public T GetLast(Expression<Func<T, bool>> where)

public T GetLast<U>(Expression<Func<T, U>> orderBy, bool ascending)

public T GetLast<U>(Expression<Func<T, bool>> where, Expression<Func<T, U>> orderBy, bool ascending)

첫번째가 아닌 마지막 엔터티를 반환하다는 점을 제외하고는 GetFirst와 동일합니다.

GetCount

public int GetCount()
public int GetCount(int startRowIndex, int maximumRows)
public int GetCount(Expression<Func<T, bool>> where)
public int GetCount(Expression<Func<T, bool>> where, int startRowIndex, int maximumRows)

지정된 조건식에 맞는 엔터티의 갯수를 구합니다.

startRowIndex와 maximumRows  매개변수는 지정되더라도 아무런 동작을 하지 않습니다.

(ObjectDataSource가 요구하는 메서드 시그니처를 맞추기 위해 있습니다.)

Create

public T Create()

public T Create(DateTime defaultDateTime)

엔터티를 생성합니다.

리플렉션을 사요하여 엔터티의 필드 중 string형의 필드는 string.Empty로, DateTime형 필드는 DateTime.Today 혹은 지정된 DateTime 값으로 초기화합니다.

기본값이 설정된 상태로 엔터티를 생성할 때 편리합니다.

Clone

public T Clone(T source)

엔터티를 복사합니다. ColumnAttribute 특성이 지정된 속성만 복사합니다. 주로 Update와 Delete 메서드 내부에서 사용됩니다.

Insert

public virtual void Insert(T entity)

엔터티를 데이터베이스에 삽입합니다.

Identity 컬럼은 삽입 후 자동으로 설정됩니다.

NULL을 허용하지 않는 컬럼에 값이 설정되지 않으면 SqlException 예외가 발생합니다.

Create 메서드로 생성된 엔터티는 기본값이 설정되어 있으므로 (string과 DateTime형) 이러한 문제를 피할 수 있어 편리합니다.

Update

public virtual void Update(T entity)

엔터티를 변경합니다.

Delete

public virtual void Delete(T entity)
public void Delete(PK 매개변수)

엔터티를 삭제합니다.

삭제할 엔터티 객체를 지정하거나 PK 매개변수를 지정할 수 있습니다.

:

Midnight Peach가 만들어 낸 코드

Midnight Peach 2008. 10. 8. 23:54

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

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

이전 포스트인 Midnight Peach의 빠른 시작에 이어 MP가 생성해 낸 코드에 대해서 좀 더 자세히 살펴보겠습니다.

빠른 시작의 서두에서 잠시 말씀드렸지만 MP는 범용 코드 생성 툴입니다.

사용된 패키지에 따라 다양한 코드가 생성되기 때문에, 여기서는 MP의 기본 내장 패키지인 Default 패키지가 Memopad DBML에 대해 생성해 낸 코드를 살펴보도록 하겠습니다.

전체적인 구조는 다음과 같습니다.

(Memo로 시작하는 클래스들은 각 엔터티마다 하나씩 존재하지만, 편의상 Memo 엔터티만 표시하였습니다.)

Entity<T>

Entity<T> 클래스는 모든 엔터티의 추상 제네릭 클래스 입니다.

Tag 라는 object형 속성을 가지고 있어서, 필요에 따라서 어떤 정보든 엔터티에 저장할 수 있는 기능을 제공합니다.

또한 추상 메서드로 Clone을 정의하고 있으므로 모든 엔터티 클래스는 이 메서드를 구현하게 됩니다.

Memo

MP가 아니라 LINQ to SQL이 생성해 낸 엔터티 클래스입니다.

MP는 이 엔터티 클래스에 대한 부분 클래스를 만들고, 이를 Entity<T> 로부터 상속 받는 코드를 추가합니다.

또한 Clone 추상 메서드에 대한 구현도 덧붙입니다.

MemberColumnName MemberColumn

엔터티의 속성 이름을 각각 문자열 상수와 열거형으로 가지고 있는 일종의 도우미(helper) 클래스와 열거형입니다.

EntityManager<T>

모든 DTO(Data Transfer Object) 객체의 추상 제네릭 부모 클래스입니다.

Default 패키지의 거의 모든 로직이 이 곳에 있습니다.

MemoManager

EntityManager<T>를 상속 받은 실제 DTO 객체입니다.

EntityManager 부모 클래스가 제공하지 않는 커스텀 로직은 이 곳에 위치하게 됩니다.

(나중에 다시 설명드리겠지만, 이 파일이 아닌 partial class로 지정된 다른 파일에 코드를 작성합니다. 기본적으로 자동 생성된 파일은 전혀 건드리지 않는 것이 원칙입니다.)

ManagerRepository

모든 DTO 객체(Manager)들의 저장소입니다.

DTO 객체는 new 연산자를 통해 직접 생성될 수도 있지만, ManagerRepository.Memo 와 같은 식으로 싱글톤으로 접근할 수도 있습니다.

또한 DataContext 객체를 생성하는 CreateDataContext 메서드도 가지고 있습니다.

다음 튜토리얼에서는 이 코드들에 대한 사용 예를 단위 테스트와 함께 살펴보겠습니다.

:

Midnight Peach의 빠른 시작

Midnight Peach 2008. 10. 8. 23:48

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

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

간단한 메모장을 만드는 예를 보면서 MP의 사용방법을 살펴 보도록 하겠습니다.

여기서는 데이터 액세스 레이어만 만들겠습니다.

먼저 데이터베이스 스키마를 작성하여야 겠지요.

사용자 / 메모 / 조회 테이블을 만듭니다.

Memo 테이블은 계층적 구조입니다. ParentID 키가 부모 메모에 대한 참조키입니다.

뷰도 하나 만듭시다. 이 뷰의 이름은 ReadingView 입니다.

데이터베이스 스키마를 만들었으니 이제 비주얼 스튜디오가 출동하면 되겠네요.

비주얼 스튜디오에서 새 솔루션과 클래스 라이브러리 프로젝트를 만듭니다. 솔루션의 이름은 MemopadSolution, 프로젝트의 이름은 Memopad.Biz로 지정합니다.

Memopad.Biz 프로젝트에 새 DBML 파일을 추가합니다.

프로젝트에 LINQ to SQL 클래스 항목을 추가하고 이름은 Memopad로 합니다.

서버 탐색기에서 위에서 만든 데이터베이스를 연후, 테이블과 뷰를 화면 가운데로 끌어 옵니다.

데이터베이스 연결 문자열은 설정 파일에 저장이 되는데, 이 때 암호와 같은 중요한 정보도 같이 저장하겠냐고 물어보는 대화상자가 열립니다.

예 혹은 아니오를 선택하고 다음으로 넘어갑니다.

이제 MP를 실행합니다.

MP에서 코드 생성은 3단계의 대화상자를 거치게 됩니다.

첫번째 대화상자에서는 DBML  파일과 패키지 파일을 선택합니다.

DBML 파일은 위에서 만든 Memopad.dbml을 선택하고, 패키지는 내장 패키지인 Default를 선택하고 확인을 누릅니다.

두 번째 대화 상자에서는 코드를 생성할 테이블 혹은 뷰를 선택합니다.

코드 생성 컬럼이 선택되지 않은 테이블 혹은 뷰에 대해서는 코드가 생성되지 않습니다.

기본값은 모든 테이블/뷰에 대해 코드를 생성하는 것입니다.

(위 그리드에서 배경 색상이 연한 노란색이 아닌 셀은 읽기 전용 데이터이며, 코드 생성 컬럼의 헤드 부분을 누르면 전체 선택 / 해제가 토글됩니다.)

확인을 눌러 다음으로 넘어갑니다.

아래와 같은 경고 대화상자가 나타납니다.

Timestamp 형식 컬럼을 이용한 업데이트 동시성 검사가 지정되지 않았기 때문에, 각 컬럼의 UpdateCheck 특성을 "Never"로 설정하여 업데이트 동시성 검사를 하지 않도록 DBML 파일을 수정한다는 의미입니다.

(업데이트 동시성 검사와 LINQ to SQL 및 MP간의 관계에 대해서는 다음 문서에서 자세히 설명하도록 하겠습니다.)

여기서는 "예"를 선택하여 다음으로 넘어갑니다.

마지막 대화상자는 패키지의 옵션을 설정하는 대화상자 입니다.

패키지의 설정은 크게 변수와 템플릿 두 부분으로 나누어 집니다.

각 세부 항목은 패키지에 따라 다를 수 있습니다.

MP의 내장된 기본 패키지인 Default 패키지의 경우에는 두 개의 변수와 다섯 개의 템플릿이 있습니다.

변수인 Namespace와 ConnectionString은 각각 생성될 코드들의 네임 스페이스와 데이터베이스 연결 문자열을 의미합니다.

데이터베이스 연결 문자열의 경우에는 "server=A; database=B; uid=C; pwd=D"와 같이 직접 지정할 수도 있고 위 그림과 같이 설정 파일을 사용하도록 지정할 수도 있습니다.

템플릿의 경우에는 생성될 코드가 저장될 경로를 지정합니다. 나중에 메인 폼에서 "저장" 명령을 통해 생성된 코드를 파일로 저장할 때 폴더를 지정하면 여기에 정의된 상대경로에 따라 각각의 생성된 코드들이 파일로 저장됩니다.

또한 템플릿의 범위가 "table"인 경우에는 자리표시자인 "{0}"를 사용할 수 있습니다. 이 자리표시자는 테이블의 이름으로 치환이 됩니다. 예를 들어 Memo와 Member라는 두 개의 테이블이 있다면, Generated\Entities\{0}.cs 는 각각 Generated\Entities\Memo.cs와 Generated\Entities\Member.cs로 치환이 됩니다.

여기서는 위 그림과 같이 설정을 하고 "확인"을 누릅니다.

이제 코드가 생성되고 MP의 메인 폼이 열립니다.

왼쪽에 있는 트리뷰에서 각 항목을 선택하면 오른쪽의 텍스트 상자에 해당 내용이 표시됩니다.

트리뷰의 구조는 다음과 같습니다.

데이터베이스 범위 템플릿과 테이블(뷰) 범위 템플릿이 순서대로 표시되어 있는데, 이 중에서 템플릿 이름을 누르면 텍스트 박스에 템플릿 자체가 표시됩니다. 반면에 데이터베이스 이름이나 테이브/뷰의 이름을 클릭하면 텍스트 박스에 해당 템플릿에 의해 생성된 코드가 나타납니다.

"저장" 툴바 버튼을 클릭하면 폴더를 선택한 후 생성된 코드를 파일로 저장합니다.

"확인"을 누르면 모든 생성된 코드를 선택된 폴더의 하위에 저장합니다.

이때 저장 경로는 패키지 옵션 중 템플릿의 저장위치에 설정된 값에 의해 결정됩니다.

여기서는 바탕 화면을 선택합니다.

이제 다시 비주얼 스튜디오로 돌아갑니다.

윈도우 탐색기에서 바탕 화면에 있는 Generated 폴더를 선택한 후 비주얼 스튜디오의 솔루션 탐색기의 Memopad.Biz 프로젝트로 끌어옵니다.

패키지 옵션에서 연결 문자열로 "ConfigurationManager.ConnectionStrings[0].ConnectionString"를 지정하였기 때문에 Memopad.Biz 프로젝트에 "System.Configuration" 어셈블리에 대한 참조를 추가합니다.

마지막으로 프로젝트 생성시 추가된 Class1.cs 파일을 삭제하면 Memopad의 기본 데이터 액세스 레이어가 완성되었습니다.

(정확하게는, 우리가 만든 레이어는 비지니스 로직 레이어이며, 데이터 액세스 레이오는 이 비지니스 로직 레이어 내부에 포함되어 있습니다. 아키텍쳐에 관해서는 이후에 좀 더 자세히 설명드리도록 하겠습니다.)

이제 Memopad의 프리젠테이션 레이어를 만들어 봅시다.

여기서는 간단힌 콘솔 응용프로그램을 만들겠습니다.

솔루션에서 새 콘솔 응용프로그램을 추가하고 이름은 Memopad.Console라고 합니다.

콘솔 응용프로그램에서 새 항목 추가로 응용프로그램 구성 파일을 추가하고 아래와 같이 연결문자열을 설정합니다.

주의할 점은, name 특성은 중복만 아니라면 아무 값이나 지정해도 무방하지만, 위에서 ConfigurationManager.ConnectionStrings[0].ConnectionString로 지정되었기 때문에, <clear />가 먼저 나와서 첫번째 연결 문자열로 만들어줘야 한다는 것입니다.

Memopad.Console의 Program.cs 파일에 아래와 같은 테스트 코드를 작성하고 결과를 확인해봅니다.

콘솔에 "0" 이 출력되면 정상입니다.

여기까지 해서 MP의 사용 방법에 대해 간략하게 살펴보았습니다.

다음 문서에서는 MP가 만들어낸 코드에 대해서 좀 더 자세히 살펴보도록 하겠습니다.

:

Midnight Peach 소개와 FAQ

Midnight Peach 2008. 10. 8. 23:45

[주의]
이 글은 MP의 현재 버전 (3.X)에 맞지 않습니다.
 
단순 참고용으로만 활용하십시오 

MP(Midnight Peach)는 LINQ to SQL을 기반으로 하는 범용 코드 생성 툴입니다.

DBML 파일과 템플릿(내장 템플릿 혹은 사용자 정의 템플릿)을 결합하여 다양한 코드를 생성할 수 있습니다.

 

설치

http://snssoft.net/MidnightPeach/publish.htm

 

소스

다운로드

 

FAQ

누가 어떤 용도로 사용하는 툴입니까?

개발자가 LINQ to SQL을 기반으로 하여 데이테 액세스 레이어 코드를 만들어 내는 툴입니다.

사용 환경은 어떻습니까?

MP 자체를 실행하기 위한 환경은 .NET Framework 3.5 SP1만 설치되어 있으면 됩니다.

MP가 생성해낸 코드를 실행하기 위한 환경은 LINQ to SQL의 환경과 동일합니다.

지원하는 데이터베이스는 무엇입니까?

LINQ to SQL이 지원하는 데이터베이스를 지원합니다. 즉 SQL 서버 2000 이상을 지원합니다.

지원하는 언어는 무엇입니까?

내장 패키지인 Default는 C# 3.0 코드를 생성하지만, 패키지의 정의에 따라 다른 닷넷 언어용 코드도 생성할 수 있습니다.

MP 자체의 UI는 영어로 되어 있지만, 한국어 지역화 버전도 같이 제공됩니다.

패키지란 무엇입니까?

패키지는 여러 개의 템플릿과 한 개의 템플릿 정의 파일로 이루어진 코드 생성 단위입니다.

템플릿은 MPML에 따라 작성된 매크로 파일입니다. MP는 이 매크로를 DBML 파일에 포함된 클래스로 치환하여 코드를 생성해 냅니다.

MPML 이란 무엇입니까?

MPML(Midnight Peach Macro Language)는 MP에서 사용하기 위해 만든 매크로 언어입니다.

MP에는 이에 대한 파서와 처리기가 포함되어 있습니다.

MPML에 대한 문법(EBNF)은 이 포스트에서 볼 수 있습니다

기술 지원은 어떻게 합니까?

MP의 공식 커뮤니티인  제작자의 블로그에서 지원합니다.

어떠한 라이센스를 따릅니까?

라이센스에 관해서는 좀 더 조사를 해 보고 결정을 해야겠으나 특별한 제한을 두고 싶지는 않습니다.

현재로서는 MP를 이용해서 나쁜짓만 하지 않으면 자유롭게 사용하셔도 좋습니다.

 MP를 사용하다 입게 된 손해에 대해서는 누가 책임집니까?

MP는 사용자에게 알리지 않았거나 예상하지 못한 어떠한 작업도 하지 않습니다.

따라서 만일 사용자의 부주의에 의한 손해가 발생한다면 전적으로 사용자가 책임을 져야 합니다.

 개발자에게 메일 보내도 됩니까?

웰컴이지요. 메일 주소는 kimgwajang@hotmail.com 입니다.

: