Whiteship's Note

결국 그냥 만들어버린 JPA 문서 자동화 툴

모하니?/Coding : 2009. 7. 2. 11:42


지난 번에 살펴본 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 메서드를 약간 수정해서 실행하면 되겠습니다.


의존성, 프로젝트 이런거 없이 그냥 소스 코드만 묶었습니다. 아마.. 하이버네이트 애노테이션.jar, persistence.jar, 그리고 HTML을 처리할 때 사용한 hq-1.jar라는 라이브러리가 필요할 겁니다.

코드에 보시면 Writer 쪽에 심각한 중복 코드가 있는데.. 아직 해결하진 않았습니다. 캬캬캬
Info 쪽 코드도 전혀 깔끔하지 않습니다. 애노테이션에서 정보를 축출하여 초기화 하는 부분(생성자)을 일관성 있게 수정하고 싶은데.. 하진 않았습니다.
HTML에 어떤 DB 스키마에 해당하는 컬럼 타입인지 알려주기 위해 Dialect도 출력할까 했지만.. 역시 아직 하지 않았습니다. 이건 뭐 간단할 것 같으니 금새 추가할 수 있을지도 모르겠네요.
top

  1. Favicon of http://seal.tistory.com BlogIcon 물개 2009.07.02 14:04 PERM. MOD/DEL REPLY

    예전에 만든 코드를 누군가 읽어줄 줄 알았다면, 그렇게 엉망으로 짜진 않았을텐데.. ㅋㅋ

    Favicon of http://whiteship.me BlogIcon 기선 2009.07.02 14:30 PERM MOD/DEL

    엇 저는 쉽게 쉽게 볼 수 있어서 좋았는데요.
    그 코드가 없었다면.. 아직도 헤매고 있었을 것 같아요.
    감사합니다~ ^^

  2. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.07.03 09:58 PERM. MOD/DEL REPLY

    좋은일 많이 하시는군요. :) 복 받으실껍니다.

    Favicon of http://whiteship.me BlogIcon 기선 2009.07.03 13:42 PERM MOD/DEL

    아직 지원하는 애노테이션이 몇 개 없습니다.ㅋㅋ

    @Embedded나, @SuperClassType인가.. 머시기도 지원해야 정확하게 필드를 모두 뽑아 낼 수 있을 것 같습니다.
    그런 점에서는 hbm2doc이 역시 좋더군요.

    JPA 애노테이션이랑 하이버 애노테이션이 몇개더라.. @_@

Write a comment.




: 1 : ··· : 469 : 470 : 471 : 472 : 473 : 474 : 475 : 476 : 477 : ··· : 2638 :