블로그 이미지
Max.

calendar

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Notice

'spring-roo-addon-tostring'에 해당되는 글 1

  1. 2009.05.22 spring-roo-addon-tostring 모듈 프로젝트 보기
2009.05.22 21:13 개발관련

ROO에서 자동으로 생성한 도메인 클래스를 보면, ROO 전용 어노테이션이 붙는데, 예를 들면 다음과 같습니다.

@Entity
@RooJavaBean
@RooToString
@RooEntity(finders = { "findMembersById", "findMembersByLoginIdAndName" })
public class Member {
    @Size(min = 3, max = 100)
    private String loginId;
    @Size(min = 3, max = 100)
    private String loginPasswd;

spring-roo-addon-tostring 모듈 프로젝트는 여기서 @RooToString 어노테이션과 관련 있습니다. 다른것 보다도 이 모듈 프로젝트가 단순한 편이여서 이것 부터 살펴 보기로 합니다. spring-roo-addon-tostring 프로젝트를 열면, 3개의 자바파일이 있는데 다음과 같습니다.

RooToString.java
ToStringMetadata.java
ToStringMetadataProvider.java

본 모듈은 1). shell의 'new persistent class jpa' 명령으로 도메인 클래스 생성시 생성된 '도메인명_Roo_ToString.aj' 파일의 내용을 생성해주고, 2) 'add field string -class' shell 명력으로 해당 도메인 클래스에 필드를 추가시 생성된  '도메인명_Roo_ToString.aj'파일의 내용을 업데이트 하는 역할을 합니다. 여기서 ToStringMetadata.java 는 Metadata를 분석하여 반영할 aj파일 내용을 빌드하는 역할이고, ToStringMetadataProvider.java는 XXX 역할 입니다.  이제 하나씩 소스코드를 봅시다.

RooToString.java

어노테이션 선언 클래스인 RooToString.java 파일의 소스는 간단히 인터페이스 선언만 되어 있습니다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface RooToString {

 /**
  * @return the name of the {@link Object#toString()} method to generate (defaults to "toString"; if empty, does not create)
  */
 String toStringMethod() default "toString";
}

@Target으로 클래스,인터페이스 포함한 어노테이션 타입임을 선언해주고, @Retention으로 어노테이션 정보유지 범위를 파일에 저장하지 않고, 처리하는 도구로만 사용하겠다는 것입니다. 대부분의 ROO는 다 이런 형태로 컨파일이나, 런타임시 소스코드에 영향을 주지 않는 특징이 있습니다. 소스코드 내용을 보면, toStirngMethod에 default값 "toString"주어서 속성값 없이 사용할수 있게 했습니다.

ToStringMetadata.java

이 클래스는 MetadataItem 인터페이스의 구현체 중에 하나 입니다. MetadataItem은 아주 중요한 클래스 인데요. 먼저 Hierarchy를 보면 아래와 같습니다.

사용자 삽입 이미지

추상클래스도 많고, 인터페이스 확장 클래스도 많습니다. ToStringMetadata클래스의 역할은 생성된 도메인 클래스의  여러정보(id, aspectName, governorPhysicalTypeMetadata, beanInfoMetadata)를 가지고, getToStringMethod를 통해서 aj파일에 생성할 내용을 만들고, 빌더(addMethod)를 통해서 생성할 메서드(여기서는 toString() 네임)를 생성하고, 빌드 합니다. 정리하면, @ToString 어노테이션으로 제공할수 있는 스크립트 내용을 담고 있습니다.

ToStringMetadataProvider.java

먼저 이클래스는 @ScopeDevelopment 에 해당 합니다. 이는 ROO를 통해 개발시에만 사용되는 클래스임을 뜻합니다. 이 클래스 역시 좀 복잡합니다. 결국 MetadataProvider의 구현체인데, 먼저 Hierarchy를 보면 아래와 같습니다
사용자 삽입 이미지

ToStringMetadataProvider는 ITD기반(aspect)의 생성 행위를 하는 클래스로 관련정보(metadataService, metadataDependencyRegistry, fileManager, beanInfoMetadataProvider)를 인수로 받아서 상위클래스인 AbstractItdMetadataProvider에 다른 metadata와 의존관계를 등록하고, metadataService에 추가 시킵니다. 추가될때, MetadataNotificationListener의 notify()를 통해서 이벤트를 전파 시킵니다. 그리고 자신의 클래스에서는 beanInfoMetadataProvider 와 자신의 MetadataTrigger를 추가 시킵니다. 그리고 getMetadata()로 앞에서본 ToStringMetadata를 인스턴스 하여 넘겨줄수 있는 메서드를 제공하고 있습니다.

다소 복잡하게 풀이 되었는데, 정리하면, ToString Metadata를 제공하기 위해 주서비스에 등록하고, 롤관계를 설정하고 리스너에 알리는 역할을 합니다. 말그대로 해당 기능에 대한 단일 서비스 제공자 입니다.

신고
posted by Max.
prev 1 next

티스토리 툴바