GenericDao에 대한 각종 아이디어와 구현은 Java5가 나오기 시작한 시점부터 다양하게 등장했다. POJO기반의 Transparent Persistent를 지원하는 HibernateDao구현에는 GenericDao가 최적이다. 하지만 CRUD 또는 getAll() 따위를 제외하면 구체적인 finder류의 메소드 구현은 직접해야했다.

비슷한 포맷의 많은 스프링 빈들을 간단히 등록할 수 있게 만들어준 AridPOJOs가 좀 더 기능 확장을 했다.

 

이번에 소개한 것은 GenericDAO with dynamic finders.

Grails GORM나 RoR Active Record스타일의 dynamic finder method를 구현하는 것이다. 자바의 meta programming기능이 Ruby의 그것만은 못하다 할지라도 dynamic proxying등을 이용한 런타임에서 코드제너레이션 기술을 통해 나름  다양한 방법으로 발전해왔다. AridPOJOs도 아직 소스 코드를 들여다보지는 않았지만 그런 방식으로 구현했음을 쉽게 짐작할 수 있다.

 

GenericDao인터페이스는 하이버네이트의 기본 CRUD와 간단한 기능들(merge따위)로 구성되어있다.

이를 확장해서 만든 다음과 같이 naming rule을 적용한 DAO인터페이스를 정의한다.

public interface AccountRepository extends GenericDao<Account, Integer> {
    Account findByAccountId(String accountId);
    List<Account> findByBalanceGreaterThan(double lower);
    List<Account> findByBalanceBetween(double lo, double hi);
}

findByBalanceGreateThan 이라는 것은 balance라는 프로퍼티의 값이 파라메터로 오는 것보다 크다는 조건으로 검색하는 것이다. “from Account a where a.balance > ?”에 파라메터를 바인딩하는 코드가 자동으로 만들어지는 것이다.

findByBalanceBetween는 2개의 값의 between조건을 이용한 검색이겠고.

물론 복잡한 메소드의 경우 직접 구현해도 무방하다. 이때는 전형적인 GenericDao/GenericDaoHibernate 스타일의 코드가 나올 것이다.

 

만약 AridPOJOs가 제공하는 finder method만을 사용할 수 있다면 구지 구현 클래스를 만들지 않아도 된다. 인터페이스를 만든 뒤 다음과 같이 factory bean을 사용해서 정의해주는 것으로 끝. JaxRpxPortProxyFactoryBean처럼 구현 인터페이스만을 이용한 전형적인 dynamic proxy구조의 빈이다.

    <bean name=”accountRepository”
        class=”net.chrisrichardson.arid.dao.hibernate.GenericDAOFactoryBean”>
        <property name=”sessionFactory” ref=”sessionFactory”/>
        <constructor-arg value=”net.chrisrichardson.arid.dao.AccountRepository”/>
    </bean>

CRUD만을 이용해서 만든 AppFuse의 GenericDao보다 한 수 위다. Matt Raible이 왜 AridPOJOs를 AppFuse 2.0에 도입하려고 하는지 알만하다.

 

기존의 자동 bean 등록기능도 훨씬 세련된 모습으로 발전했다.

만약 다음과 같은 abstract bean설정이 있다면,

    <bean name=”parentGenericDaoFactoryBean” abstract=”true”
        class=”net.chrisrichardson.arid.dao.hibernate.GenericDAOFactoryBean”>
        <property name=”sessionFactory” ref=”sessionFactory”/>
    </bean>

<arid:define-beans/> 태그를 이용해서 GenericDao방식의 Dao들을 한번에 등록할 수 있다.

    <arid:define-beans package=”net.chrisrichardson.arid.dao”
        package-scanner=”net.chrisrichardson.arid.InterfaceAndAbstractClassPackageScanner”
        pattern=”net.chrisrichardson.GenericDao+”
        bean-generator=”net.chrisrichardson.arid.ChildWithConstructorArgBeanGenerator”
        parent-bean-name=”parentGenericDaoFactoryBean”>
    </arid:define-beans>

이 태그를 통해서 다음과 같은 방식의 빈들이 등록된다.

    <bean name=”accountRepository”
        parent=”parentGenericDaoFactoryBean”>
        <constructor-arg value=”net.chrisrichardson.arid.dao.AccountRepository”/>
    </bean>

 

처음에 AridPOJOs가 시작될 때는 그저 custom schema의 활용예를 소개한 정도라고 생각했는데 점점 본격적인 프로젝트로 발전해나가는 것 같다. 고급유저를 위한 편리한 개발지원과 Spring의 다양성을 보여줄 수 있는 좋은 프로젝트가 되기를 기대해본다.

Related posts:

  1. AridPojos – 스프링빈 한방 등록 커스톰 태그
  2. 스프링이 쓰는 Dynamic Proxy는 Proxy 패턴인가 Decorator 패턴인가?
  3. JCO컨퍼런스와 Spring Dynamic Modules for OSGi(tm)
  4. Spring Dynamic Modules for OSGi(tm) 한글 레퍼런스 자료
  5. 유쾌한 이슈처리 재촉 메일

Facebook comments:

to “AridPOJOs: Active Record스타일의 Dynamic Finder지원 GenericDao”

  1. 우와.. 멋진 소스네요. :)

  2. [...] AridPOJOs 점점 맘에 든다. 인터페이스만을 이용한 dynamic finder method 지원이라니. 오전 8시 15분 [...]

  3. bluehost review…

    bluehost review…

  4. jason aldean tickets…

    jason aldean tickets…

  5. discount mbt AridPOJOs: Active Record스타일의 Dynamic Finder지원 GenericDao » Toby’s Epril

  6. shimano mtb shoes AridPOJOs: Active Record스타일의 Dynamic Finder지원 GenericDao » Toby’s Epril

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha