
이거 하다가 죽는 줄 알았네 -_-
일단 MySQL 붙어서 CVE 목록 로딩 정도는 된다.
이제 bnd 매뉴얼도 제대로 읽어봐야겠고..
아직 왜 이렇게 동작하는지 모르는 부분도 찾아봐야 하고..
동적으로 SessionFactory 올리고 내리고 하는 부분도 해결을 해야 된다.
별 것도 아닌 기능인데 OSGi 위에서 돌리려니 사람 미치겠더라 -_-
대충 일주일 정도 삽질했나?
이클립스 플러그인으로 하이버네이트 올린 사람의 설명
(DynamicImport-Packge와 적절한 Import-Package 찾는 삽질)
현재 hibernate 통합 번들을 사용하는 helloworld 번들은 아래와 같이 Import 하고 있다.
Import-Package: \
!javax.resource*, \
org.hibernate.proxy, \
org.hibernate.exception, \
org.hibernate, \
org.hibernate.dialect, \
javax.transaction.*;version="1.0.1", \
javax.naming, \
javax.naming.spi, \
net.sf.cglib.proxy;version="2.1.3", \
javax.sql, \
org.xml.sax, \
javax.naming.event, \
org.apache.commons.dbcp, \
javax.persistence, \
org.osgi.framework, \
net.sf.cglib.reflect;version="2.1.3", \
*
처음에 org.hibernate.proxy.HibernateProxy ClassNotFound가 net.sf.cglib 바이트코드 제네레이션 하는 부분에서 계속 나왔는데.. 이게 아직 이해가 안 되는 부분이다. helloworld 번들이 직접적으로 HibernateProxy를 사용하지 않는데 왜 cglib 안에서 ClassNotFound가 나던 것이 helloworld 번들에서 위처럼 Import-Package 해주니까 제대로 동작하는 것인가?
(08-09-19 0시 추가) 이 문제에 대한 원인을 명확히 설명할 수 있는 답을 찾았다. 하이버네이트가 CGLIB을 쓰도록 설정되어 있고 (요새는 javassist로 대체 가능하다고 하던데.) 도메인 모델 로딩이 Lazy로 설정되어 있는 경우 (현재 default 설정값), CGLIB을 이용해서 프록시 클래스를 생성한다. (CGLIB이 뭔가 궁금하면 CGLIB 기초를 참고하자.) 이 때 하이버네이트의 PojoEntityTuplizer는 Proxy에 붙일 인터페이스 목록을 넘기게 되는데, 이 때 넘기는 인터페이스 목록에 HibernateProxy.class가 포함되어 있다. (당연히 모델 클래스도 넘어가겠지.) 그런데 이 때 CGLIB은 첫번째 인터페이스 클래스의 클래스로더를 이용해서 나머지 클래스를 찾는다는거다. 그러니 모델 클래스가 먼저 넘어갔다 치고, 다이나믹 임포트로 모델 패키지는 불러올 수 있게 걸어놨으니 여기까진 가능한데, 이 클래스로더를 이용해서 HibernateProxy.class를 로딩하려고 시도하면, 명시적으로 Import된게 아니기 때문에 필연적으로 ClassNotFound가 나게 된다. 증명 끝 (물론 저 글의 설명이 다 맞다고 가정해야겠지만.)




