[Generic] 자바 Generic 타입 알아내기
GenericDao를 만들다 보면, entity 클래스 타입이 필요하게 되는데, 이 타입을 구하기 위해 GenericDAO를 상속받을 때 마다 생성자에서 넘겨주거나, abstract 메서드로 entity 클래스를 세팅하도록 강제하기도 하기도 하고, 저 같은 경우는 DAO 이름 컨벤션에 따라 도메인 이름을 추측하여 Class.forName()으로 자동으로 인식할 수 있게 한적도 있습니다.
일단, 전자의 방법들은 GenericDAO를 상속받는 클래스를 만들 때 귀찮다는 단점이 있습니다. 맨 마지막 방법은 컨벤션을 따르지 않았을 경우 난감해진다는 문제가 있습니다.
그러나... 이 방법들 보다 더 좋은 방법이 있었습니다.
자바 Generic 타입 정보는 흔히들 런타임에 활용할 수 없다고 알고 계실겁니다. 그건 객체들 얘기이고, 모든 객체가 지니고 있는 클래스(.class)에는 해당 정보가 남아있습니다. 따라서 런타임 때도 리플렉션을 이용해서 Generic 정보를 활용할 수 있습니다.
http://whiteship.me/1614
@PersistenceContext
protected EntityManager entityManager;
public JpaDao() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[1];
}
참조 링크에 있는 JPA 패턴을보다가 발견한 이 코드를 응용해서 사용하시면 되겠습니다.
이로써, 보다 깔끔한 GenericDao를 만들 수 있겠네요. 하나 덤으로 위 링크에 첨언을 하자면, 위 링크에서는 주키 타입도 Generic 타입으로 지정해서 일일히 지정받고 있는데, 저는 그것보다 Serializable을 사용하면 타입 인자를 하나 더 줄일 수 있는데다, 키 타입에 대해 별다른 제약도 없기 때문에 더 깔끔하지 않나 생각하빈다.
ps: 오랜만에 HibernateGenericDao를 TDD로 만들고 있는데 재밌네요. 별거 아니지만;; 만들면 공개해볼까 합니다.
'모하니? > Coding' 카테고리의 다른 글
| 스프링 이메일 확장하기 2 (0) | 2009/09/12 |
|---|---|
| [하이버네이트] 쿼리를 수정할 것이냐 모델을 수정할 것이냐... (0) | 2009/09/10 |
| [하이버네이트] 1 + 2N select 문제 해결하기 (4) | 2009/09/08 |
| [hamcrest] Matcher 만들기 (0) | 2009/09/07 |
| [GenericDao] 하이버네이트 GenericDao (6) | 2009/09/04 |
| [Generic] 자바 Generic 타입 알아내기 (0) | 2009/09/04 |
| [봄싹 오픈] springsprout.org (20) | 2009/08/27 |
| [봄싹] D-day 오후 10시에 오픈하겠습니다. (4) | 2009/08/27 |
| [봄싹] 시즌 2 오픈 D-1 (2) | 2009/08/26 |
| [봄싹] 시즌2 다음 주 오픈 예정 (2) | 2009/08/17 |
| [테스트] 커스텀 MimeMessageHelper 테스트하기 (0) | 2009/08/14 |

Generic.zip



