spring mvc 로 잘 만들고 있던 프로젝트였는데, 갑자기 Roo 가 눈에 들어왔다. Roo의 ActiveRecord가 좋아 보였던 것. 그리고 Controller들의 기본 구현 등...
머.. 사실 ActiveRecord 를 쓸지, Repository를 쓸지 아직 고민이긴 하지만..
딴거 할일은 많았지만... 이미 내 손은 Roo를 적용하고 있다. ㅠㅠ.
기존 프로젝트를 Roo기반으로 바꾸면서 일어 났던 일을 (뒤늦게)기록해 본다. (처음부터 기록하면서 작업했으면 좋았을걸)
아무래도 Roo가 생각하는 기본 프로젝트 구조가 있기 때문에, 테스트로 Roo 프로젝트를 하나 만들고 jpa, web mvc 까지 다 세팅한 다음, 이 놈을 참고 하면서 작업하는 것이 좋을 것이다.
우선 web.xml.
web.xml에 스프링의 xml 설정 파일을 지정하는데, roo는 기본적으로 소스의 resources 쪽에다가 applicationContext.xml 을 만들고, WEB-INF 쪽에 webmvc-config.xml 를 만들고 있다. 나도 그에 따라서 spring의 xml 파일 대거 리팩토링!
그리고 나는 hibernate를 쓰고 있었는데, roo는 jpa를 선호하는 것 같으니 jpa설정까지 해 줌. (설정을 복사하는 수준).
덕분에 pom.xml 파일도 수정이 필요했는데, roo프로젝트의 pom.xml을 참고해서 빠진 것들 복사함.
그런 다음 roo shell에서 jpa setup 명령했더니 ... 별로 하는 일 없음. 내가 이미 다 했음.
이제 도메인 클래스들을 손볼 차례인데, 이 부분이 작업이 크다. Controller, Repository 모두 손봐야 한다.
이제 entity jpa --class <기존 클래스> --testAutomatically
했더니.. 뜨아... 내 클래스 덮어 씀. 그냥 기존 클래스 위에
@RooJavaBean
@RooToString
@RooJpaActiveRecord
@RooEquals
네개의 annotation 추가. 글고 테이블에 version 칼럼 추가.
이 때, 다른 화면을 실행 해보니 동작은 함. 하지만 jpa가 사용되고 있는 것은 아니고 여전히 hibernate 기반으로 동작하는 것이겠지. 방금 수정한 entity에 대한 controller는 에러 남.
IllegalStateException Post-processor tried to replace bean instance of type XXX with (proxy) object of type [YYY] not supported for aspect-configured classes
하지만
java.lang.IllegalStateException: Post-processor tried to replace bean instance of type [kr.co.gaon.irs.basic.Bank] with (proxy) object of type [$Proxy112] - not supported for aspect-configured classes!
왠지 늪에 빠진 느낌. 글고 sts 3.0으로 하고 있는데 이게 아직 안정화가 덜 되서 그런지 너무 느리다. 도대체 뭘 하고 있는지 모르지만 cpu는 100~200% 기본이고...
sts 재시작 한 번 해주고... (씁쓸하구만...) 그래도 문제 해결은 안되고...
검색해보니 @Configurable 과 @Transactional 을 같이 쓸 수 없다는 얘기가 나온다. 아니다. 어라... 되네? 아까 Build Automatically를 잠시 꺼두었던거 때문인가?
계속하자. 이젠 Table 이름을 잘못 찾아가고 있다. @RooJpaActiveRecord(table="BankAccount") 라고 했는데, bank_account 라는 테이블로 sql이 날아간다.
이 문제는 persistence.xml 에서 ImprovedNamingStrategy 때문에 발행하는 것. comment out하자.
이제 동작한다. 휴~~
하지만... 왜 일케 메모리 사용량이 많은겨... reload 한 번 하면 2G를 채워버리네...
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
이 녀석 때문인가?
javaagent 방식으로 바꾸니 좀 낫구나. 아니다. 마찬가지구나.
<context:load-time-weaver aspectj-weaving="autodetect" />
삭제해도 잘 동작한다. 지우니 메모리 사용량이 떨어졌다.
오늘은 일단 여기까지.