본문 바로가기

Homo Faber/Techniques

EJB3 JPA 모델링 Notation 제안 [I]

EJB3의 JPA 는 Hibernate 나 JDO 진영의 ORM 개념을 도입하여 기존의 EJB2와는 새로운 형태로 개발을 가능하게 해준다.
또한, EJB3 의 POJO 개발이 가능한 부분은 실질적으로 일반 자바 클래스를 사용하여 기존보다는 확실하게 더 단순한 작업으로
개발할 수 있게 해준다.

하지만, 코드만을 보고 개발을 한다는 것은 쉬운 일이 아니기 때문에 모델링 도구를 같이 사용하는 것이 개발의 생산성을
도와줄 수 있는데, 현재 JPA의 Notation (혹은 Annotation)을 수용하는 모델링 도구가 없기 때문에 모델링 도구의 Stereotype이나
제약사항(Constraint), Tag 등을 사용하면 기존의 모델링 도구를 이용한 JPA의 모델링이 어느 정도는 가능하다고 본다.

따라서, 현재 JPA의 Notation을 UML 의 확장 형태로 다음과 같이 사용할 것을 제안한다.
실제로 저자가 경험해 본 바로는 이와 같은 모델링 Notation을 사용해서 개발하면 소스를 참조하지 않더라도 한눈에 알아볼 수
쉬우며, 개체들간의 관계를 한눈으로 바라볼 수 있다는 점을 들 수 있다. 물론, 기존의 모델링에 대한 장점이 이러한 부분들을
포함하겠지만, MDA나 DSL/DSM을 사용한 개발까지도 충분히 가능하리라 생각된다.

여기서 사용되는 모델링 도구는 Enterprise Architect 라는 것으로 http://www.sparxsystems.com.au/ 를 참조하기 바란다.

우선 그 첫번째 제안으로 Association을 제외한 엔티티에 대한 속성을 stereotype을 사용하는 방법에 대해서 제안한다.

엔티티의 속성들은 PK를 나타내는 @Id와 테이블의 컬럼을 나타내는 @Column, 그리고, 임시저장을 위한 @Transient 에 대해서만
언급한다. 물론, @EmbbededId 등 기타 annotation들이 있지만, 주로 사용하는 것들에 대해서만 표시한다.

우선 UML 에서 클래스 속성에 대한 stereotype을 @Id는 <<Id>> 로, @Transient는 <<Transient>> 로 표기를 한다.
@Column 같은 경우, 엔티티 클래스 내에서도 표기하지 않으면, @Column으로 자동으로 인식하기 때문에 별도의 stereotype을 선언하지 않는다.
대신, 클래스의 stereotype을 <<JPA_ENTITY>> 라고 명시적으로 선언하는 경우에 한해서이다. Entity 스테레오 타입은 이미 사용 중인
것이라 JPA_ENTITY라는 것을 사용한다.

즉, 위의 클래스 다이어그램에서 userId는 PK로 선언되어 있음을 의미하고, juminNo는 임시속성, 나머지는 컬럼으로 선언되어 있음을 알 수 있다.

@Entity
public class User implements Serializable {
@Id private String userId;
@Column private String userName;
@Column private int age;
@Column private String gender;
@Transient private String juminNo;
… // get/set operation
}

소스로는 이와 같이 표현이 가능하다. @Id의 경우 세부적으로 ID에 대한 생성방법에 대한 제약사항을 더 둘 수 있다.
하지만, 모델상으로는 표기가 곤란하기 때문에 이러한 것들은 Constraints 에 두도록 한다.

위의 그림에서 userId 속성에 대한 제약사항으로 ID를 자동으로 생성하는 것을 추가하였다.
EA에서는 Constraints 에 대한 Type을 사용자가 지정할 수 있도록 하는데,
Settings > General Types 에서 Constraint 탭에서 사용자가 Type을 지정할 수 있다.

또한, ID에 대한 컬럼명이 중요할 수 있는데, 이는 OneToMany 등 관계를 맺을 때에 참조 컬럼명을 사용하는 경우가 있기 때문이다.
이 경우는 Association에 관련된 내용을 설명할 때 설명할 것이며, 현재로써는 태그를 사용하여 컬럼명을 표기하는 방법을 사용하도록 한다.
위의 <<Id>> 인 userId의 컬럼명이 "user_id" 라고 하면,
해당 속성에 대한 태그로 column_name="user_id" 로 표기한다.

위의 그림에서 userId 에 대한 컬럼을 태그로 표기한 그림이다.
같은 방법으로 컬럼에 대한 길이(column_length), null 여부 (column_nullable) 등을 추가할 수 있다.
이를 위해서는 태그에 대한 정의를 사전에 해서 사용하는 것이 편리한데, EA에서는 이러한 기능 또한 제공한다.
위의 그림에서 Tagged Values 바로 하단의 이 아이콘을 클릭하면 사용자가 태그값에 대한 이름을 정의할 수 있다.

태그에 대한 이름을 위의 그림과 같이 정의할 수 있다.

위와 같이 표기된 것을 XMI를 통해서 보면 userId 속성에 대한 stereotype 과 tagged value, constraint 등을 볼 수 있다.

위의 XMI는 userId 속성에 대한 것이다.
이를 토대로 모델을 통한 소스 Generation이 바로 가능하다.

다음 내용은 엔티티 간의 관계에 대해서 모델링 Notation을 제안하도록 한다.

반응형