BooK Plus2009.04.14 22:50

봄싹 스터디에서 진행하는 프로스프링2.5 베타리딩을 했습니다!
봄싹 대장 기선이 형 덕분에 재미있는 경험을 하게되었죠 >>ㅑ~!

1월 23일 부터 4월 13일 까지 두달 보름정도 진행을 했었는데...
900 페이지가 넘는 엄청난 양의 책이 었죠;;;
총 22장으로 이루어지고 스프링 2.5 의 전반과 후반부에 orm / remote / web service / mvc / 패턴 / 튜팅 / 기타 등등..
많은 정보들을 다루는 도서였습니다..

전 리딩중에 맡은 건 ! 코드 검증 이었습니다!
모 사이트에 책에 대한 리뷰에 예제 코드 소스가 X판이라는 이야기가 들린터라서 ..
검증에 나섰죠;;

딱 끝나고 나니 그런 말이 왜 나왔는지 느낌이 오더라구요~;;
http://www.apress.com/ 해당 출판사 사이트에 가시면 프로 스프링2.5 원서에 같이 배포된 소스 코드를 받을 수 있는데..
프로젝트들이  Intellij의 IDE기반으로 되어있다. 개인적으로는 좀 생소으나 IDE가 문제 될건 없었는데.... 일단 해당 프로젝트에서 사용되는 lib들이 하나도 없다!
그래서 손수 다 찾아서 해야만 하고... 코드들에 오류들이 있었다...
컴파일 조차 안되는 코드들도 존재 했고.. 제대로 실행되지 않는 코드들도 존재 했다..
그리고 결정적으로 책에서 나온 코드들과 다소 다른 코드들도 존재 하고..
여러명이서 작업을 했는지... 쳅터별로 프로젝트 구조들도 달랐고... 통일이 되지 않았다..
물론 책내용이 중요하지만... 독자들을 위해서 소스코드에 좀만더 신경써주었으면 어땠을 까 하는 생각이 들었다..

나처럼 허접한 사람이 예제들을 돌려보기에는 많은 난관들이 있었기에 말이다..
그래서 한글 번역본에선 이러한 불편했던 점들을 최대한 해결하기 위해서..
노력을 했다.. 우선 모든 프로젝트의 구조를 통일화 시켰고.. (소스코드의 위치정도..)
컴파일이 다 잘 될 수 있도록 코드를 수정하고, 가장 시간이 많이 들었던 의존관계를 가지는 lib들을 일일이 다 찾았다.. 그리고 모든 코드들을 책내용의 아웃풋과 비교 하면서 소스 코드들을 돌려 보았고..
결국 이클립스 기반의 메이븐 프로젝트들로 새롭게 작업을 마쳤다!

물론 100%완벽하다고는 생각하지는 않는다..
그래도 100%가 되기 위해서 많은 시간을 투자하여 ~ 열심히 작업을 했다..
덕분에 나 또한 접해보지 못했던 부분들도 마니 접할 수 있게 되었고.. ;;
덕분에 900페이지가 넘는 prospring책을 다 읽었다는거?
무튼 만족만족!! 어여 빨리.. 번역된 prospring2.5 책을 하루 빨리 다시 만나보고 싶을 따름이다..ㅋㅋ

함꼐 배타리딩을 진행한 봄싹 식구들과 도와 주신 몇몇 분들에게 수고하셨다는 말을 드리고 싶다! 수고하셨네요~~~

Posted by is윤군
봄싹2009.04.06 22:31
13장 코드를 보면 java mail을 보내는 예제가 나온다.. ;;
책에도 적혀 있듯이... 메일 Test를 하려면 자신의 환경에 맞추어서 환경 설정을 해야 한다.

음... 그럼 한번 메일을 보내볼까 ?
예제를 보면 여러종류의 예제가 있는데..
일단 그중에서 com.apress.prospring2.ch13.mime.SimpleHtmlMessageSender
놈을 돌려보는 예제를 실행해보자..

우선 메일을 보내려면 smtp서버가 있어야 하는데;;
가난한 개발자에게 무슨 말도 안되는 .. 말이고..
음.. 그중에서 smtp서비스를 제공해주는(으뜸사용자이면..) Naver 메일 서버를 이용해보았다.
물론 구글도 가능하지만.. Test를 하는데..ㅋㅋ 국산을 써줘야지;;ㅋㅋ

그럼 설정을 한번 살펴보면..
javaMailSender.xml 파일을 보면..
 <bean id="sender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host">
            <value>post.demon.co.uk</value>
        </property>
    </bean>

이런 부분이 있다.. 저쪽으로 메일을 보내면.. 깔끔하게 한줄이 출력된다.
Exception in thread "main"
ㅋㅋ

자 그럼 설정을 해보자..

 <bean id="sender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host">
            <value>smtp.naver.com</value>
        </property>
        <property name="username" value="helols" />
        <property name="password" value="xxxxx"/>
    </bean>

일단 호스트에 naver smtp 서버 주소를 적어주시고 ~
자신의 계정과 패스워드를 넣어준다..

그리고 ~ 예제를 실행하면..
메일이 자알간다~~~~~~~!!!


앗.. 빠진 내용이 잇는데.. 서버 설정후에..
자신의 메일 계정을 변경해주는걸 잊지 말자.. 기본 예제는 simpleHtmlMessageSender.xml 파일에서 ... 받는 사람 메일 주소와 보내는 사람 메일 주소를 입력할 수 있다!!!


Posted by is윤군
봄싹2009.04.04 23:06
com.apress.prospring2.ch11.service.SampleServiceDemo 코드를 돌리면..
코드가 거의 끝날 때쯔음..
ORA-12519, TNS:no appropriate service handler found
해당 예외가 발생한다..
(물론 오라클 설정을 미리 했다면 안날 수도 있다..)

기본 오라클을 자신의 로컬에 설치하고 따로 설정을 해주지 않았다면..
해당 예외가 날것이다... ;;
물론 해당 오라클 에러 코드로 구글링을 해보면 쉽게 해결책을 찾을 수 있다..

해당 데모 코드에 내용은 하이버네이트 관련한 코드인데;; 하이버네이트가 문제가 아니라;;
Test 용도로 여러건 인서트 하는 코드인데 ..
오라클의 설저에 프로세스 수 관련 하여 설정하는 부분이 잇는데..
기본적으로 적게 설정이 되어 잇어서 예외가 발생하기도 한다..

만약 예외가 발생한다면..
sys 계정으로 들어가 ;;
SQL> ALTER system SET processes=100 scope=spfile;
처리수를 넉넉히 늘려주고 ~
SQL> shutdown immediate;
셧다운 시켜주시고~
SQL> startup
다시 구동시켜준다!

이렇게 설정해주면.. 잘 돌아가는 ...
데모코드를 볼수 있을것이다..ㅋ
Posted by is윤군
봄싹2009.03.27 14:45
배타리딩중... 예제를 돌리는데 또 예외가 난다..

현재 사용중인 운영 체제는  Ubuntu 8.10 이다.. 여기에..
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)
해당 자바 버전을 사용 중이다..

8장을 보다 보면 JConsole 를 사용해서 Mbean은 보는 예제가 있다..
그런데 그냥 돌려 보면..

2009. 3. 27 오후 2:40:47 sun.rmi.transport.tcp.TCPTransport$AcceptLoop executeAcceptLoop
경고: RMI TCP Accept-0: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=55781] throws
java.io.IOException: The server sockets created using the LocalRMIServerSocketFactory only accept connections from clients running on the host where the RMI remote objects have been exported.
    at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:71)
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:369)
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:341)
    at java.lang.Thread.run(Thread.java:619)


이러한 error 가 난다..
음.. 이유는 모르겠지만.. ;;

해결책은 ... 의외로 간단했다..

VM arguments 에다가
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false 를 추가해주고 실행하면..

책에서와 같은..

결과를 볼수 있다!!

Posted by is윤군
봄싹2009.03.26 23:34
배타리딩을 하면서 .. InteliJ 기반으로 구성된 소스 코드를 메이븐으로 옮기고 잇다..
그러다가 8장 소스에 관련하여... 의존 jar들을 설정하고 잇는데..
마침 hibernate-3.2.3.ga.jar를 설정하는 순간..

Missing indirectly referenced artifact javax.transaction:jta:jar:1.0.1B:compile
에러가 난다.. 하이버네이트의 의존파일인가보다..

그래서

<dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>jta</artifactId>
        <version>1.0.1B</version>
      </dependency>
추가 했다..

그랬더니..
Missing artifact javax.transaction:jta:jar:1.0.1B:compile
이런 에러를 밷는다... ;;
메이븐을 처음 써보는 관계로 다소 생소했다.. ;;
그래서 좀 알아 봤더니..

pom.xml 중...  에 추가함!

  <repositories>
      <repository>
          <id>maven2-repository.dev.java.net</id>
          <name>Java.net Repository for Maven</name>
          <url>http://download.java.net/maven/2/</url>
      </repository>
  </repositories>

해주니.. 잘 되었다~~~

하이버네이트 하는 분들은 다 아시는거겠죠?
Posted by is윤군
봄싹2009.03.26 00:20
프로스프링 6장은 @AspectJ에 대해서 다룬다..
뒷부분에는 aop의 표준이라고 말 할수 있는 aspectJ에 대해서 잠시 언급이 되는데..
프로스프링 소스를 받아서 실행해보려면..
책에 있는 내용있는 내용에 더불어 몇가지 해주어야 할 것들이 있다.

우선 책에서 나오는 예제들은 IntelJ IDE 기반으로 만들어진.. 소스들이고..관련 lib들이 없다..
그래서 막상 돌려 보려면 관련 lib들을 구하고... 이것저것 해주어야 한다..
번역서가 나오면 지금 계획하고 있는 형태로 새로운 소스가 배포가 될 수도 있으니..
큰 무리는 따르지 않을 것 같다..

물론 능숙한 개발자들은 알아서 손쉽게 돌려 볼 수도 있겠지만...
초보자들에겐 힘든 일이 될 수도 있다..

잠시 다른길로 새어버렸는데;; 다시 본론으로 가자면.. 우선..
com.apress.prospring2.ch06.aspectj.AspectJDemo1.java 파일이 있다..
코드를 보면 asepect 파일인 .aj 파일들이 있고.. AOP는 이놈들이 담당한다..

이클립스에 AspectJ플러그인을 설치 하던가 STS 를 사용하던가.. IDE에서 수행하려면 해당 플러그인의 도움으로 ajc를 할 수가 있는데.. 그렇게 변경하고도 돌려보면
Exception in thread "main" java.lang.VerifyError: (class: com/apress/prospring2/ch06/practical/PerformanceAndHealthCollectingAspect, method: ajc$inlineAccessMethod$com_apress_prospring2_ch06_practical_PerformanceAndHealthCollectingAspect$com_apress_prospring2_ch06_practical_PerformanceLogExtractor$extract signature: (Lcom/apress/prospring2/ch06/practical/PerformanceLogExtractor;Lorg/aspectj/lang/JoinPoint;Ljava/lang/Object;)Lcom/apress/prospring2/ch06/practical/PerformanceLog;) Illegal use of nonvirtual function call
    at com.apress.prospring2.ch06.services.DefaultUserService.login(DefaultUserService.java:13)
    at com.apress.prospring2.ch06.aspectj.AspectJDemo1.main(AspectJDemo1.java:17)

이러한 에러를 만날 수 있을 것이다..
왜 나는 건지 알아보지는 안았지만.. aop가 적용된 객체가 6장 예제 전반에 걸쳐서 사용되어 져서.. 그런지.. 실제로 돌려서 나온 결과들을 비교해보면 의도 하지 않은 AOP들이 적용되다가 예외가 나는듯하다..

그래서 보면 build.xml이 제공되어 진다..
책에선 aspectjtools.jar를 ${ANT_HOME}/lib 에다가 넣고 돌리라고 하는데;;
IDE에서 돌리려면;;
해당 그림처럼 ant 실행도구에 classpath를 잡아줘야 한다.
물론 ${ANT_HOME}/lib 홈에 카피를 했다면;;

해당 프로젝트 root에 가서;;
ant를 쳐주어도 되고..

해당 ant를 실행전에.. aspectj를 설치하라고 나오는데.. 일단 aspectjtools.jar 파일만 구해서 해당 경로에 넣어준다면..
설치하지 않고서도 돌아갈 수 있다..

우분투 유저라면
sudo apt-get install aspectj
라는 명령어로 쉽게 설치가 가능하며..
~/.ant/lib 안에 해당 jar 파일을 카피 해넣어도 물론 빌드를 할 수 있다.

aspectjtools.jar 파일을 구할 때는 잘 구해야 한다.. 사용하는 메이븐 저장소에 해당 jar 파일이 없어서 구글링을 통해서
구한 jar 파일로 예제를 돌렸다가.. 삽질을 하게 되었고.. 나중에는 다른 메이븐 저장소에서 해당 lib를 구해서 결과를 얻게 되었지만.. 말이다..

막상 적고 나니.. 책에 있는 내용을 풀어 놓것 밖에 되지 않는듯 하다.ㅋ
아.. 마지막으로 해당 build.xml 파일을 보면;
<property name="dir.lib" value="../../lib"/>
이부분이 있는데.. 이 경로는 해당 lib 위치로 수정을 하던가 프로젝트 두단계상위에다가 해당 lib 폴더를 만들어서..
해당 jar들을 넣어주어야 한다..
나같은 경우는 그냥..

<!--
    <property name="dir.lib" value="../../lib"/>
      -->
    <property name="dir.lib" value="/home/helols/.m2/repository/"/>
이렇게 바꾸고 해버렷다..!!

이제! 6장 소스 코드 검증도 ~ 끝나는구나!!
Posted by is윤군