결국 그냥 만들어버린 JPA 문서 자동화 툴
지난 번에 살펴본 hbm2doc로는 사부님이 원하는 문서를 만들기가 버거워서, 예전에 물개선생님이 만드셨다는 코드를 참조해서 비슷하게 만들었습니다.
@Entity
@Table(name = "users", uniqueConstraints = @UniqueConstraint(columnNames = { "loginid" }))
@SequenceGenerator(name="user_sq", sequenceName="user_sq")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Integer id;
@Version
Integer version;
@ColumnInfo(value = "아이디", description="중복 되는 값은 사용할 수 없음")
@Column(length = 50, unique = true)
String loginid; // identity
@ColumnInfo("이름")
@Column(length = 50)
String name;
@Column(length = 50)
String pwd;
@Column(length = 50)
@Index(name="email_idx")
String email;
@Column
int usertype;
@Column(length = 50)
String title;
@Column(length = 50)
String dept;
@Column(length = 50)
String tel;
@Column(length = 50)
String mobile;
@Column(length = 50)
String addr;
@Column
@Temporal(TemporalType.DATE)
Date birthday;
@ManyToMany
Set<Role> roles;
@OneToMany(cascade = { CascadeType.ALL})
Set<Familly> famillies;
이렇게 애노테이션이 난무 하는 도메인 클래스에 대한 정보 + 새로 추가한 애노테이션 @ColumnInfo를 사용하여 화면에서 해당 필드를 보여주는 이름(또는 도메인 전문가가 사용하는 용어)과 설명을 추가할 수 있습니다.
어제 하루 종일 만들고 오늘 아침에 조금 다듬은 결과물은 다음과 같습니다.
코딩은 TDD로 시작했는데, 저 위에 보이는 HTML 만드는 코드는 참조하던 코드를 짜집기해서 만들었습니다.
클래스 구조는 대충.
DocGenerator ---> DocWriter ---> EntityInfo
이렇습니다. DocGenerator에 엔티티 클래스 목록을 주면, DocWriter로 문서를 생성해 내는데, 이 때 new EntityInfo(엔티티 클래스) 생성자를 사용하여 애노테이션에서 정보를 축출하여 담고 있는 Info 클래스를 만들어 사용합니다.
DocGenerator는 기초 정보(Dialect, 엔티티 클래스, 타겟 폴더, ...) 수집 및 퍼사드 역할을 하고, DocWriter는 실제로 문서 생성을 책임지는데, 인터페이스를 둬서 여러 형태의 문서 작성기를 사용할 수 있도록 했습니다. 현재는 HTMLDocWriter만 구현되어 있습니다. EntityInfo는 리플렉션을 사용하여 주어진 클래스와 그 클래스에 붙어있는 애노테이션을 활용하여 화면 출력에 필요한 정보들을 수집해 두는 역할을 합니다. 일종의 DTO라고 봐야하나..
실행은 DocGeneratorRunner의 main 메서드를 약간 수정해서 실행하면 되겠습니다.
cfile2.uf.1866DF174A4C1D14258F02.zip
의존성, 프로젝트 이런거 없이 그냥 소스 코드만 묶었습니다. 아마.. 하이버네이트 애노테이션.jar, persistence.jar, 그리고 HTML을 처리할 때 사용한 hq-1.jar라는 라이브러리가 필요할 겁니다.
코드에 보시면 Writer 쪽에 심각한 중복 코드가 있는데.. 아직 해결하진 않았습니다. 캬캬캬
Info 쪽 코드도 전혀 깔끔하지 않습니다. 애노테이션에서 정보를 축출하여 초기화 하는 부분(생성자)을 일관성 있게 수정하고 싶은데.. 하진 않았습니다.
HTML에 어떤 DB 스키마에 해당하는 컬럼 타입인지 알려주기 위해 Dialect도 출력할까 했지만.. 역시 아직 하지 않았습니다. 이건 뭐 간단할 것 같으니 금새 추가할 수 있을지도 모르겠네요.