블로그 이미지
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

2007.12.21 18:10 이전글(~2009)

@Configurable는 Spring2.0에서 지원되는 어노테이션이다.
DDD에서 Rich한 Domain을 만들기 위해서는 필수인듯 하다.
그러나 아직 실무(?)에서는 어노테이션을 지원하는 JDK 버젼이 적을뿐만 아니라 Spring 기반의 솔류션을 만든다면 범용(?)적인 환경에 적응할수 있어야 한다.

따라서 JDK5.x 이상의 환경과 Spring2.0 이상의 환경을 요구하는 @Configurable은
Rich한 Domain을 만들기 위해서는 그림에 떡이 될수도 있다.

@Configurable 효과를 낼수 있는 방법이 있을것이다. 물론 복잡하지 않는 범위 내에서 말이다. 찾아본 결과 MethodInvokingFactoryBean를 쓰면 비슷하게 구현할수 있다는걸 알게 되었다.

아래는 테스트한 내용이다.

1. XML
 <bean id="articleRepository" class="com.shyun.board.article.domain.hibernate.ArticleRepositoryHibernate"
   p:sessionFactory-ref="sessionFactory"/>
 <bean id="articleFinder" class="com.shyun.board.article.domain.hibernate.ArticleFinderHibernate"
   p:sessionFactory-ref="sessionFactory"/>  

 <bean id="articleRepositoryInjector"
   class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
   <property name="staticMethod">
     <value>com.shyun.board.article.domain.Article.setArticleRepository</value>
   </property>
   <property name="arguments">
     <list>
       <ref bean="articleRepository"/>
       <ref bean="articleFinder"/>
     </list>
   </property>
 </bean>

 

2. Article.java

public class Article {
 ........
 private static ArticleRepository articleRepository;
 private static ArticleFinder articleFinder;
 public static void setArticleRepository(ArticleRepository ar, ArticleFinder af){
  articleRepository = ar;
  articleFinder = af;
 }
 ........
 public Article saveArticle(Article article){
  return articleRepository.saveArticle(article);
 }
 public void removeArticle(Article article){
  articleRepository.removeArticle(article);
 }
 public List<Article> findArticleList(int currentPage, int countPerPage){
  return articleFinder.findArticleList(currentPage, countPerPage);
 }
 public Article findArticleById(Integer articleId){
  return articleFinder.findArticleById(articleId);
 }
.......
}


 

3. test case

public void testSaveAndReadAndRemote(){
  Article article = ArticleFixture.getArticle();
  Article articleSave = article.saveArticle(article);
  articleSave.setTitle(article.getTitle()+"(수정)");
  articleSave = article.saveArticle(article);
 
  ff("title ",articleSave.getTitle());
  ff("aritcle id",articleSave.getArticleId());
  assertEquals(article.getArticleId(), articleSave.getArticleId());
 
  article.removeArticle(article);
        try {
         article.findArticleById(article.getArticleId());
            fail("User found in database");
        } catch (DataAccessException dae) {
            ff("Expected exception: ",dae.getMessage());
            assertNotNull(dae);
        }
 }
 public void testFindArticleList(){
  Article article = ArticleFixture.getArticle();
  article = article.saveArticle(article);
  int currentPage = 0;
  int countPerPage = 1;
  List<Article> list = article.findArticleList(currentPage, countPerPage);
  ff("aritcle list size",list.size());
  assertEquals(1, list.size());
 
  article.removeArticle(article);
 }

4. 결과 화면

사용자 삽입 이미지


풍부한 도메인 만들기 위해서 환경이 된다면 @Configurable를 쓰는것이 좋지만, 환경이 안된다고 해서 포기할 필요는 없다. 위와 같은 방법 이외에도 Spring을 잘 안다면 좀더 쉽게 구현할수도 있을것이라고 생각된다.


Resouce
http://forum.springframework.org/search.php?searchid=1255212
http://joesbitbucket.blogspot.com/2006/08/how-to-inject-dependencies-into-domain.html
http://chris-richardson.blog-city.com/migrating_to_spring_2_part_3__injecting_dependencies_into_en.htm

신고
posted by Max.