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을 사용하는 예제입니다.

 

: