Whiteship's Note

'Good Tools'에 해당되는 글 186건

  1. 2009.10.29 [JRebel, IntelliJ] IntelliJ에 JRebel 플러그인 설치/설정/사용하기
  2. 2009.10.26 [IntelliJ] 이클립스 바이바이~~ 인텔리J 안녕!! (22)
  3. 2009.10.15 [JRebel] 오퀘!! 퍼스널 OSS 라이선스 득탬!! (4)
  4. 2009.10.15 [JRebel] 개발시 서버 리부팅 시간을 줄이자. 아니 없애자!! (6)
  5. 2009.09.25 정말 멋진 플러그 디자인 (6)
  6. 2009.09.03 [이슈트래커] 레드마인 redmine 괜찮네~ (8)
  7. 2009.08.11 [파이어폭스 플러그인] 파이어버그 짱인듯... (4)
  8. 2009.08.10 [파이어폭스 플러그인] 구글 리더 왓처 (2)
  9. 2009.08.07 맥용 STS가 달라졌다!! (2)
  10. 2009.07.30 구글 토크 트위터 봇(bot) 추가하기
  11. 2009.07.27 아틀라샨 이클립스 플러그인
  12. 2009.07.07 [파이어폭스 플러그인]Live HTTP headers
  13. 2009.07.01 [파폭 테마] 구글 크롬 테마 (6)
  14. 2009.06.24 이클립스 3.5 갈릴레오 설치 인증샷 (6)
  15. 2009.06.14 [MAC]OmniGraffle
  16. 2009.05.13 메이븐 프로젝트에서 단위/통합 테스트 어설프게 구분하기 (2)
  17. 2009.05.13 [Mockito] void 메서드 stubbing 새로운 방법
  18. 2009.05.12 JUnit Max 자동 실행 여부 설정하기
  19. 2009.05.12 Maven Embedder 사용해서 자바 코드로 메이븐 Phase 또는 Goal 실행하기
  20. 2009.05.12 Cargo의 TomcatManager
  21. 2009.05.11 JGit로 push 성공 기념샷. (6)
  22. 2009.05.11 통합 테스트 분리와 메이븐 관련 참조 할 글
  23. 2009.05.11 Cargo 메이븐 플러그인 설정하기
  24. 2009.05.10 webdriver - NextSteps
  25. 2009.05.08 웹드라이버(webdriver) pom.xml에 의존성 추가하기
  26. 2009.05.07 웹 테스트 관련 공부할 것
  27. 2009.05.01 오늘 하루 타일즈(Tiles)에 낚였나보다~ (2)
  28. 2009.05.01 스프링 MVC에서 타일즈 2 사용하기 (2)
  29. 2009.05.01 Tiles와 SiteMesh 차이
  30. 2009.05.01 Tiles VS SiteMesh (2)

[JRebel, IntelliJ] IntelliJ에 JRebel 플러그인 설치/설정/사용하기

Good Tools : 2009.10.29 12:51


참조: http://www.zeroturnaround.com/intellij-idea-jrebel-tutorial-formerly-javarebel/

1. 플러그인 설치
- settings -> plugin -> available 탭에서 jre 검색 후 클릭해서 다운로드 설치 하고 재부팅.

2. 플러그인 설정.
- settings -> jrebel 에서 jrebel.jar 파일 찾아주기.
- settings -> Debugger -> Data View -> Show 탭에서 Synthetic fields 끄기
- 컴파일 output 폴더 변경
- 컴파일 이후에 웹 서버에 재배포 하지 않도록 설정하기
- 컴파일 단축키를 Ctrl+S로 설정하기
- rebel.xml 파일 만들기



3. 톰캣 Run with JRebel 실행하기


플러그인 설치까지는 수월했지만, 그 뒤에는 잡다하게 설정할 것들이 좀 있었네요. 하지만 한번만 설정해두면 두루 두루 좋은거니깐~

top


[IntelliJ] 이클립스 바이바이~~ 인텔리J 안녕!!

Good Tools : 2009.10.26 18:35


와.. 대박!! 인텔리J 완전 좋아요!!

단축키는 이클립스 단축키로 바꾸고, 기본적인 설정 몇 가지를 변경하면 이클립스에서 인텔리J로 후딱 갈아탈 수 있습니다. 물론, 100%까진 아니지만, 어느정도 개발이 가능한 정도까지.. 대충 70% 가량은 인텔리J로 개발환경을 바꿀 수 있습니다. 그담부터는 인텔리J의 고유 기능들과 단축키를 만끽하는 일만 남은거죠.


설치 후 한 일

1. settings에서 keyset 변경
- eclipse 키셋을 카피 한 다음 원하는 단축키 설정.
  - close(Ctrl + W)
  - declaration(Ctrl + 마우스 버튼1)
  - goto test(Ctrl + J)

2. settings에서 코드 라인수 보이도록 설정.
- code line으로 검색 후 apperance에서 체크.

3. settings에서 수정 후 저장하지 않은 파일 표시 되도록 설정.
- mark modi로 검색 후 Editor Tabs에서 체크.

4. settings에서 폰트 변경
- font로 검색 후 블라 블라.

5. 서버 추가 및 실행
- settings의 Application Servers에서 추가.
- 서버 설정 뷰에서 war/폴더 배포 설정 가능.

6. 기본 최대 메모리 512로 늘리기
- IDEA 설치 폴더/bin/idea.exe.vmoptions 편집 -Xmx512m로 수정
- code inspection 실행 할 때 빼곤 거의 기본 350m 정도면 충분해 보임.

7. 폰트에 안티 얼라이징 효과 주기
- IDEA 설치 폴더/bin/idea.exe.vmoptions 편집 -Dawt.useSystemAAFontSettings=lcd 추가

놀란 기능

1. Git/SVN 및 다양한 VCS 그냥 지원.

2. UML 그냥 지원.

3. MoreUnit 기능 그냥 지원.

그밖에도 아직 해보지 않은 환상적인 기능들이 무궁 무진 함.

충분히 갈아탈만한 개발 툴로 보입니다. 갈아타실 수 있는 분들은 갈아타자구요.
사용하시는 분들이 많아야 소소한 팁을 나누면서 좀 더 잘 써먹죠.ㅋ


top

TAG IntelliJ

[JRebel] 오퀘!! 퍼스널 OSS 라이선스 득탬!!

Good Tools : 2009.10.15 22:08


개인용 오픈 소스 라이선스를 받았습니다.

1년에 무려 7만원 가량(59달러)이나 하는 제품의 무료 라이선스를 특탬했습니다. 냐하하하~ OSAF 말고도 WebTUnit 이나 SES 플젝으로 받아도 되긴할텐데 일단 컨플루언스에 그럴싸하게 올라가있는 걸로 받았습니다. 오늘 낮 1시쯤 메일을 보냈을텐데 9시간 정도 걸렸군요. 빠른편입니다.



저는 이제 귀찮은 서버 껐다 켜기에서 해방입니다. 냐하하하~~

기념으로 스크린캐스팅 하나 찍어줘야겠군요.
top

TAG JRebel

[JRebel] 개발시 서버 리부팅 시간을 줄이자. 아니 없애자!!

Good Tools : 2009.10.15 11:26


http://www.zeroturnaround.com/jrebel/installation/

JSP에서 DB 쿼리, 자바코드, HTML 짬뽕으로 몇 천 줄짜리 코드를 만들고 힘들게 유지보수 하는 이유가... '서버 리부팅을 하지 않아도 되니까'라고 하던데... 정말 그 이유 때문인지 모르겠습니다.

암튼, 그렇게까지 서버 리부팅이 하기 싫으시다면, JRebel을 쓰시는걸 추천하고 싶습니다.
사용법도 매우 간단합니다.
상용제품이기는 한데, 라이센스 없이 30일간 무료로 사용해볼 수 있습니다.

예전에도 이 제품을 써보려고 살펴보긴 했는데, 애플리케이션을 실행할 때 마다
noverify -javaagent:/path/to/jrebel.jar
이런 옵션을 줘야 한다는게 너무 귀찮아서 해보지도 않았습니다.

그런데 오늘은 방명록에 올라온 글 때문에 다시 살펴봤더니 이름도 JavaRebel에서 JRebel로 짧게 바꾸고 이클립스 플러긴도 제공해서 저런 옵션을 수동으로 주지 않아도 되게 해놨더군요. 대박이닷!! 해보자!!

그래서 해봤더니.. 정말 잘 돌아가고 너무 간단합니다.
개발 시간을 상당히 많이 단축 시킬 수 있을 것으로 보입니다.

톰캣 로그가 다음과 같은 모습이 됩니다.                                                     
#############################################################

 JRebel 2.1a (200910071200)
 (c) Copyright ZeroTurnaround, Ltd, 2007-2009. All rights reserved.

 A rough estimate: Over the last 1 days JRebel
 prevented the need for at least 0 redeploys/restarts.
 Using industry standard build and redeploy times,
 JRebel saved you between 0 and 0 hours.

 You are running JRebel evaluation license.
 You have 30 days until the license expires.

 You will see this notification until you obtain a
 full license for your installation.
                                                         
 Visit www.jrebel.com for instructions on obtaining   
 a full license. If you wish to continue your evaluation 
 please e-mail to support@zeroturnaround.com.            
                                                         
 If you think you should not see this message contact    
 support@zeroturnaround.com or check that you have your  
 license file in the same directory as the JAR file.      #############################################################

2009. 10. 15 오전 10:56:59 org.apache.tomcat.util.digester.SetPropertiesRule begin
경고: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server:springsprout2' did not find a matching property.
2009. 10. 15 오전 10:56:59 org.apache.catalina.core.AprLifecycleListener init
정보: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jdk1.6.0_10\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\oracle\product\10.2.0\db_1\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\QuickTime\QTSystem;c:\Program Files\Microsoft SQL Server\90\Tools\binn;C:\Program Files\VanDyke Software\SecureCRT;C:\Program Files\SecureCRT;C:\Program Files\QuickTime\QTSystem;c:\Program Files\Microsoft SQL Server\90\Tools\binn;C:\Program Files\TortoiseSVN\bin;C:\Program Files\Subversion\bin;C:\Program Files\ESTsoft\ALZip;C:\Program Files\QuickTime\QTSystem\;C:\Program Files\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\Java\jdk1.6.0_10\bin;C:\apps\apache-maven-2.0.10\bin;"C:\Program Files\PostgreSQL\8.3\bin";C:\apps\apache-ant-1.7.1\bin;C:\Program Files\Git\bin;C:\Program Files\ESTsoft\ALZip;C:\apps\spring-roo-1.0.0.M1\bin
2009. 10. 15 오전 10:56:59 org.apache.coyote.http11.Http11Protocol init
정보: Initializing Coyote HTTP/1.1 on http-8080
2009. 10. 15 오전 10:56:59 org.apache.catalina.startup.Catalina load
정보: Initialization processed in 323 ms
2009. 10. 15 오전 10:56:59 org.apache.catalina.core.StandardService start
정보: Starting service Catalina
2009. 10. 15 오전 10:56:59 org.apache.catalina.core.StandardEngine start
정보: Starting Servlet Engine: Apache Tomcat/6.0.18
JRebel: Directory 'C:\workspace-sts\springsprout2\web\WEB-INF\classes' will be monitored for changes.
JRebel: Directory 'C:\workspace-sts\springsprout2\target\test-classes' will be monitored for changes.
JRebel: Directory 'C:\workspace-sts\springsprout2\web' will be monitored for changes.
2009. 10. 15 오전 10:56:59 org.apache.catalina.loader.WebappClassLoader validateJarFile
정보: validateJarFile(C:\workspace-sts\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\springsprout2\WEB-INF\lib\com.springsource.javax.servlet-2.5.0.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

=============================== [JRebel Spring Framework Plugin] ===============================
Plugins are contributed by third party and can cause compatibility problems.
If you have any troubles set -Drebel.spring_plugin=false to disable it.
------------------------------------------------------------------------------------------
Description: Supports adding new beans and adding new bean dependencies using
annotations or XML. Singletons will be reconfigured after the change. It also
supports adding or changing Spring MVC controllers or handlers.
=============================== [/JRebel Spring Framework Plugin] ==============================


=============================== [JRebel AspectJ Plugin DISABLED] ==============================
You can enable AspectJ Plugin by setting -Drebel.aspectj_plugin=true.
------------------------------------------------------------------------------------------
Description: Allows the AspectJ load-time weaving (javaagent launched by aj5 or
-javaagent:aspectjweaver.jar) to be used with JavaRebel. Note that AspectJ
weaver will still show "java.lang.Exception: AspectJ5 does not weave hotswapped
class" in the beginning, but this can be safely ignored.
=============================== [/JRebel AspectJ Plugin DISABLED] =============================

2009. 10. 15 오전 10:57:00 org.apache.catalina.core.ApplicationContext log

...생략...

INFO - FrameworkServlet.initServletBean(322) | FrameworkServlet 'springsprout': initialization completed in 828 ms
Hibernate: select this_.id as id4_0_, this_.authCode as authCode4_0_, this_.avatar as avatar4_0_, this_.blog as blog4_0_, this_.email as email4_0_, this_.joined as joined4_0_, this_.name as name4_0_, this_.outDate as outDate4_0_, this_.outReason as outReason4_0_, this_.password as password4_0_, this_.status as status4_0_, this_.totalAttendanceRate as totalAt12_4_0_, this_.totalTrustRate as totalTr13_4_0_ from Member this_ where this_.status=?
Hibernate: select this_.id as id13_1_, this_.descr as descr13_1_, this_.endDay as endDay13_1_, this_.manager_id as manager10_13_1_, this_.maximum as maximum13_1_, this_.meetingCount as meetingC5_13_1_, this_.memberCount as memberCo6_13_1_, this_.startDay as startDay13_1_, this_.status as status13_1_, this_.studyName as studyName13_1_, member2_.id as id4_0_, member2_.authCode as authCode4_0_, member2_.avatar as avatar4_0_, member2_.blog as blog4_0_, member2_.email as email4_0_, member2_.joined as joined4_0_, member2_.name as name4_0_, member2_.outDate as outDate4_0_, member2_.outReason as outReason4_0_, member2_.password as password4_0_, member2_.status as status4_0_, member2_.totalAttendanceRate as totalAt12_4_0_, member2_.totalTrustRate as totalTr13_4_0_ from Study this_ left outer join Member member2_ on this_.manager_id=member2_.id where this_.status in (?, ?, ?)
JRebel: Reloading class 'springsprout.modules.study.StudyController'.
JRebel-Spring: Reconfiguring bean 'studyController' [springsprout.modules.study.StudyController]
WARN - DefaultHandlerExceptionResolver.handleNoSuchRequestHandlingMethod(142) | No matching handler method found for servlet request: path '/study/index.do', method 'GET', parameters map[[empty]]
JRebel: Reloading class 'springsprout.modules.study.StudyController'.
JRebel-Spring: Reconfiguring bean 'studyController' [springsprout.modules.study.StudyController]

OSAF를 이용해서 오픈 소스 라이선스를 신청해야겠습니다. 냐하하~

JRebel에 스프링 빈들의 의존성과 컨트롤러, 핸들러 등을 XML과 애노테이션 정보가 바뀔 때마다 클래스를 릴로딩 해주는 것을 플러긴화해서 내장하고 있나봅니다. 스프링 뿐 아니라, 구글쥬스, 스트럿츠 설정이 변경되는 것도 감지하도록 되어 있네요. 캬...

감동입니다!

ps: 오늘 할 일이 다 끝나고도 여유가 생기면 오랜만에 스크린캐스팅으로 찍어보겠습니다.
top


정말 멋진 플러그 디자인

Good Tools : 2009.09.25 14:11


멋져요;;



자세한 건 요기서;;
top


[이슈트래커] 레드마인 redmine 괜찮네~

Good Tools : 2009.09.03 09:18


이슈트래커는 상용제품인 Jira만 써봤는데, 봄싹에서 Redmine이라는 걸 설치했길래 살펴봤는데, 괜찮습니다. UI도 깔끔한 편이고, 제공해주는 기능과 플러그인도 많이 있네요.

개인적으로 가장 맘에 드는건, 소스 코드 뷰 기능이 기본으로 탑재되어 있다는거.. Jira나 Bamboo에서는 그럴수가 없었고, Fisheye라는 걸 설치해야만 했었는데, 플러그인만 추가하면 소스 코드에 코멘트까지 다는 Crucible의 기능까지 할 수 있다고 합니다. 아틀라시안.. 제품 두 개(Fisheye, Crucible)와 Jira의 주요 기능이 한 곳에 들어있는 느낌입니다.

http://dev.springsprout.org/redmine

봄싹과 관련해서 버그나 새로운 추가 기능 요구가 있으신 분들은 위 이슈 트래커를 이용해주세요~

곳곳에 숨어있는(?) 그래프 들이 눈을 즐겁게 합니다.





top


[파이어폭스 플러그인] 파이어버그 짱인듯...

Good Tools : 2009.08.11 21:15


요즘 봄싹에서 개발을 하다보니(참... 봄싹은 개발 업체가 아니라 스터디입니다.) 재밌는 것이 있는데, 여러 툴 사용법을 익힐 수 있다는 겁니다. 파이어버그가 좋은 줄은 알고 있었지만, 사용법을 제대로 익혀본적이 없어서 어떻게 써먹는 줄 몰랐는데.. 이번 기회에 유용한 기술을 몇 개 습득했습니다.

1. 레이아웃 미리 조정해보기

레이아웃은 float등으로 띄우고 나서 margin, padding, border로 조정할 수 있는데 border야 뭐.. 그렇다 치고.. margin이랑 padding을 주로 사용해서 레이아웃을 조정합니다. 이 때, JSP나 CSS를 조금 바꾼 담에 브라우저에서 릴로딩해서 보고, 다시 또 수정해서 다시 브라우저가서 릴로딩 하고.. 이런 일을 반복하기 일수인데, 파이어버그를 써서 미리 화면이 어떻게 바뀌는지 조정해서 적당한 값을 알아낼 수 있습니다.


오른쪽 아래에 보이는 레이아웃 창에서 숫자를 클릭해서 조정하면 곧바로 화면에 띄워져 있는 박스들의 위치가 바뀝니다. 캬~~ 멋져요 멋져.

2. 자바스크립트 미리 실행해보기


두번째로 유용하게 쓰고 있는 기능은 '콘솔' 너무 막연해서 뭔지 몰랐는데 여개다가 자바스크립트를 입력해서 미리 실행해 볼 수 있었습니다. 위 화면에서는 복잡한 selection을 하는 제이쿼리를 미리 실험해본 화면입니다.

3. net

왔다 갔다 하는 요청/응답 헤더와 내용을 볼 수 있어서 유용합니다. 스샷은 생략~

IE 8부터는 파이어버그 같은 프로그램이 포함되어 있다던데.. 어떨런지 모르겠습니다. 수수료만 안 붙는다면 10달러 정도 기부하고 싶어지네요.

top


[파이어폭스 플러그인] 구글 리더 왓처

Good Tools : 2009.08.10 17:35


https://addons.mozilla.org/en-US/firefox/addon/4808

구글 리더를 모니터링 해주는 플러긴 입니다. 얼마전 RSS 갱신이 다소 느리고 사이트 차단까지 당해서 접속이 안 되던 한RSS에서 구글 리더로 갈아탔습니다. 그런데도 도무지 사부님 블로그 포스팅을 실시간으로 캐치하지 못하겠더군요.(실시간으로 알아채지 못하면 항상 애정이 식었다고 하시기 떄문에 @_@) 그래서 결국은 이런 플러그인까지 찾아서 설치했습니다. 과연~~ 애정은 어찌될런지... 몇 일 지켜봐야겠습니다.

혹시 매일 인터넷 서핑을 1시간 이상 하시는 분들 중에 아직도 RSS를 모르시거나, RSS 리더기를 사용하지 않으시는 분들이 있다면 사용을 권해드리고 싶습니다. 정보 습득량과 속도가 많이 달라 지실 겁니다.

ps: 그러고보니, 봄싹 RSS를 개발해야하는군요. 음... 스프링 3.0에 AtomView같은게 있었던 것 같은데 사용해 볼 수 있겠네요.ㅎ
top


맥용 STS가 달라졌다!!

Good Tools : 2009.08.07 22:54


2.1.0이 배포됐다길래. 받으러 들어갔더니.. dmg 파일들이 있다. 오호.. 설마 그냥 옮겨 담기?? 아니네! 인스톨러가 뜨네... 이야~~


이전에는 끼워주기(?)로 주는 dm 서버, tc 서버, roo를 덩달아 다운받아 설치하는 수밖에 없었다. 뭐 압축만 풀면 끝이니깐.. 설치라고 하기도 뭐하지만.. 그런데 이번에는 설치할 제품 목록을 선택하는 화면에서 빼내면 설치하지 않을 수도 있다. 설마.. 이것 때문에 이런 installer를 만들었단 말인가!?

암튼 귿!

ps: 맥용으로 carbon, cocoa, cocoa 64 세 가지 버전이 있는데, 아직은 cocoa로 빌드한 버전을 성능 관련 문제로 비추하고 있다.

Mac OS X

Download the STS Mac OS disk image (*.dmg) from the list above. Once downloaded, please mount the disk image by double-clicking the downloaded dmg file. Open the volume named 'SpringSource' and double-click on the installer to launch the installation. Follow the on-screen instructions to finish the installation.

(*) At this time we do not recommend to use any of the Cocoa builds for Mac OS. There a numerous open performance related problems with the Cocoa port reported at Eclipse.org.


top


구글 토크 트위터 봇(bot) 추가하기

Good Tools : 2009.07.30 13:25


참조: http://www.labnol.org/internet/most-useful-google-talk-bots/4347/

예전에 사부님이 알려주신 구글 토크 사전 봇 en2ko.dict@bot.talk.google.com을 추가해서 요긴하게 쓰고 있는데, 갑자기 jabber와 xampp에 관심이 가서 자료를 찾아 보던 중 윗글을 발견했습니다.

그 중에 하나로 트위터가 있더군요. 간단하게..

twitter@twitter.com

이 녀석을 친구추가 해주시면.... 안 됩니다.

초대를 받아주질 않네요. 일정 시간이 되면 친구 검색해서 일괄처리하나...@_@ 기다려보죠. 뭐.

낚아서 죄송합니다~ㅋㅋ

top


아틀라샨 이클립스 플러그인

Good Tools : 2009.07.27 21:52




http://www.atlassian.com/software/ideconnector/eclipse.jsp

앗.. 몰랐네~ 좋구만~
top


[파이어폭스 플러그인]Live HTTP headers

Good Tools : 2009.07.07 11:56


https://addons.mozilla.org/en-US/firefox/addon/3829

HTTP 헤더 정보를 보여주는 창을 띄울 수 있습니다. 도구 -> Live HTTP headers를 클릭하면 되죠.
그런 다음 파폭 아무 탭에서 URL을 날리면 Headers 탭에서 HTTP 헤더 정보를 보여줍니다.


전 이제 이것과 스프링의 AbstarctController와 WebContentGenerator를 보면서 HTTP 공부를 해야 하고, js 파일들을 캐싱해서 보내주는 컨트롤러를 만들어야 합니다. 오늘 안에 꼭!!! 파이팅!

이것도 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

top


[파폭 테마] 구글 크롬 테마

Good Tools : 2009.07.01 21:51


https://addons.mozilla.org/en-US/firefox/addon/8782


음~~ 귿!! 가끔씩 테마를 바꿔주는 센스..
top


이클립스 3.5 갈릴레오 설치 인증샷

Good Tools : 2009.06.24 22:58


http://www.eclipse.org/downloads/

이클립스 JEE Mac OS X carbon 버전을 설치했습니다.

http://blog.springsource.com/2009/06/24/installing-sts-into-eclipse-35/

좀 전에 올라온 스프링 소스 블로그 글을 보고 STS 설치를 시도했지만, AJDT 플러그인 사이트에는 연결이 안되고, 스프링 IDE 사이트에서 접근 가능한 플러긴은 AJDT 관련 플러긴 밖에 없길래 포기했습니다. @_@ 뭐.. 조만간 STS 2.1.0 RC 버전이 나온다고 하니.. 아직은 3.5 기반 STS를 좀 더 오래 기다려야 할 것 같습니다.


top


[MAC]OmniGraffle

Good Tools : 2009.06.14 14:52


OmniGroup이라는 회사 제품 중 하나인데, 맥에서 UML 그릴 때 뭐가 좋을지 찾다가 발견했습니다. 여태 PPT로 그렸었는데, 이젠 좀 더 편하게 그릴 수 있겠네요.

http://www.omnigroup.com/applications/omnigraffle/



top

TAG UML2.0,

메이븐 프로젝트에서 단위/통합 테스트 어설프게 구분하기

Good Tools : 2009.05.13 17:58


참조: http://wiki.rodcoffin.com/index.php?title=Maven_Integration_Testing

안타깝게도 maven-surefire-plugin에는 아직 이 둘을 구분지을 만한 기능이 없습니다. 그럼에도 불구하고 기존에 제공하는 기능들을 잘~ 조합하여 원한 것과 비슷한 결과를 도출해 냅니다. 결코 원하던 결과는 아니지만, 뭐 그나마 그래도 다행인 결과이기는 합니다.

결론부터 보자면

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>**/*WebTest.java</exclude>
                    </excludes>
                </configuration>
                <executions>
                    <execution>
                        <id>integration-test</id>
                        <goals>
                            <goal>test</goal>
                        </goals>
                        <phase>integration-test</phase>
                        <configuration>
                            <excludes>
                                <exclude>none</exclude>
                            </excludes>
                            <includes>
                                <include>**/*WebTest.java</include>
                            </includes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

이런 식으로 설정해야
<단위 테스트>
mvn test를 실행 할 때 WebTest로 끝나는 자바 파일은 테스트 대상에서 제외하고,
<통합 테스트>
mvn integration-test를 실행 할 때는 모든 WebTest로 끝나는 자바 파일을 포함하여 모든 것들을 다 테스트 합니다.

그나마 다행이라고 한 이유는 통합 테스트를 할 때 단위 테스트를 실행하는 건 시간 상 메모리 상 분명히 오버헤드에 해당하지만, 통합 테스트 자체가 이미 상당량의 시간과 메모리를 잡아 먹을 것이기 때문에, 마치 큰 산에다가 흙 한 줌 더한 꼴로 볼 수 있기 때문이죠. 또 하나 테스트 실패/성공 측면에서 보더라도 이미 단위 테스트 단계를 통과하고 온 것들이라면 이 단계에서 실패할 가능성은 거의 없다고 봐도 무관하겠죠.

그래도 좀.. 잘 나눌 수 있게 sufire:integration-test 같은 골을 추가해주거나, 설정을 좀 더 잘할 수 있게 기능을 추가해줬으면 좋겠습니다.

ps: mutual exclusive 설정 같은걸 추가해주면 안 되남..
top


[Mockito] void 메서드 stubbing 새로운 방법

Good Tools : 2009.05.13 16:41


참조: http://mockito.googlecode.com/svn/branches/1.4/javadoc/org/mockito/Mockito.html

링크에 있는 글대로 작성 해 보면

        stubVoid(mockWarManager).toThrow(new WarPackgingException()).on().packaging();

이렇게 됩니다.

"누가 뭘 던 진다 뭐 할 때."

새로운 형태로 작서한 코드는 다음과 같습니다.
       
        doThrow(new WarPackgingException()).when(mockWarManager).packaging();

"이걸 던진 다. 누가 뭐 할 때"

후자가 조금 더 짧죠.

ps: 매녈 좀 업데이트 해주시지 말입니다. 스프링은 매녈이 소스 코드를 앞서 간다는데...
top

TAG Mockito

JUnit Max 자동 실행 여부 설정하기

Good Tools : 2009.05.12 19:57


도대체 이 기능이 있다고는 하는데, 어딨는지 몰라서 못쓰고 있었네요. 단위 테스트면 뭐 계속 돌아가도 상관이 없는데, 통합 테스트도 완전히 웹 서버까지 띄워서 테스트를 하고 있는데, 이걸 계속 JM이 돌리겠다고 아둥 바둥 하다가 에러를 뱉어 내길래 답답하던 참이었는데 사부님한테 물어봐서 알아냈네요. ㅋㅋㅋ

진작 물어볼 걸...



top

TAG JUnitMax

Maven Embedder 사용해서 자바 코드로 메이븐 Phase 또는 Goal 실행하기

Good Tools : 2009.05.12 16:03


참조: http://maven.apache.org/guides/mini/guide-embedding-m2.html
http://repo1.maven.org/maven2/org/apache/maven/maven-embedder/

메이븐 pom.xml에 의존성을 추가해 줍니다. 엄청 많은 transitive 의존성들이 추가되기 때문에 조금 오래 걸릴 겁니다.

        <!-- maven emberdder -->
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-embedder</artifactId>
            <version>3.0-alpha-2</version>
        </dependency>

이 녀석 하나가 끌고 오는 것만 15개입니다. 따라서 총 16개의 라이브러리를 추가한 겁니다. @_@ 사용하는 방법은 다른 것들은 다 기본 값을 사용하도록 하고, ClassLoader를 설정한 configuration을 만들어서 MavenEmbedder를 만들고, 실행할 phase나 goal들을 MavenExecutionRequest에 담고 execute를 하면 Result를 받을 수 있습니다.

        Configuration configuration = new DefaultConfiguration()
            .setClassLoader(Thread.currentThread().getContextClassLoader());

        ConfigurationValidationResult validationResult = MavenEmbedder
                .validateConfiguration(configuration);

        if (validationResult.isValid()) {
                MavenEmbedder embedder = new MavenEmbedder(configuration);
                MavenExecutionRequest request = new DefaultMavenExecutionRequest();
                request.setGoals(Arrays.asList(new String[] { "package", "cargo:start" }));
                MavenExecutionResult result = embedder.execute(request);
                if (result.hasExceptions()) {
            ...
                }         
        } else {
            ...
        }

이런 식이죠. 이렇게 하지 않고, 그냥 콘솔 명령어를 호출하도록

Runtime rt = Runtime.getRuntime();
Process p = rt.exec("/apps/apache-maven-2.0.10/bin/mvn.bat package");

이렇게 짤 수도 있지만, 이렇게 하면 메이븐이 돌다가 에러 난 상황에 적절한 대처를 하기가 어렵기 때문에 위와 같이 다소 장황한 방법을 사용했습니다.

top


Cargo의 TomcatManager

Good Tools : 2009.05.12 14:36


아파치 톰캣 매니저를 랩핑한 녀석인데 아주 편리합니다.

TomcatManager manager;
manager = new TomcatManager(new URL("http://localhost:8080/manager/"));
manager.deploy("/springsprout", new URL("file:target/springsprout.war"), true);
manager.undeploy("/springsprout");

이런식으로 사용할 수 있습니다.

이슈 1.

Cargo와 관련 된 것이 아니지만, 한 가지 이슈 사항은 undeploy를 했을 때 해당 webapp에서 path에 해당하는 폴더가 지워지지 않으면 그 다음에 같은 폴더로 deploy를 하면, 톰캣은 제대로 배포가 됐다고 생각을 하는데, 실제로는 그렇치 않습니다. 접속해보면 404가 뜨죠.

derby.jar 파일이 지워지지 않고 lib폴더에 남아있는 경우였는데, deploy할 때 무슨 이유에서든가 webapp 밑을 이 파일만은 유독 지워지지 않고 남아서 이 다음 deploy를 방해하고 있었습니다. @_@ 필요도 없는 라이브러리였는데 들어가서 말썽을 부리더군요.

이슈 2.

두 번째는 Cargo에서 제공하는 TomcatManager말고 여러 Deployer들이 있는데, 그 녀석들을 사용하여 deploy는 할 수 있었지만, 그 외의 메서드 redeploy(), undeploy() 등은 Not Supported 예외를 발생시킵니다. 메이븐으로 연동하였을 때도 마찬가지로 cargo:undeploy 등은 not support 에러가 나고 제대로 동작하지 않았습니다. 물론 제가 뭔가 잘못했을 수도 있습니다. @_@ 하지만, TomcatManager 설정이 Deployer 보다 더 간단하고 잘 동작하기 때문에 다시 Deployer를 시도해보진 않을 것 같습니다.


top


JGit로 push 성공 기념샷.

Good Tools : 2009.05.11 01:04


재일이형 제보로 알게된 기트 허브 이클립스 플러그인을 설치할까 하다가 그림을 보니까 JGit랑 거의 흡사하길래 그냥 JGit에 머물기로 했습니다. 위 링크에 보이는 그림 대로 push to를 해봤더니 되네요. 이전에는 어찌해야 할지 몰라서 제대로 못 썼는데 이젠 좀 쓸만하네요.ㅋㅋ

commit, push to, fetch from 메뉴에 단축키만 지정해 두면 웬만한 SVN, CVS 플러그인 부럽지 않게 사용할 수 있을 것 같습니다.

팁으로 SVN, CVS에 비해 히스토리 정보 참조가 엄청나게 빠르다는 겁니다. 그도 그럴 것이 저장소가 로컬에 있으니깐 필요한 히스토리 정보 로딩이 SVN이나 CVS에 비해 훨씬 빠른 것 같습니다. 물론 뭐 네트워크 사정에 따라 조금씩 차이는 있겠지만요..ㅋ




top

TAG JGit, 기트

통합 테스트 분리와 메이븐 관련 참조 할 글

Good Tools : 2009.05.11 00:53


http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testing

http://docs.codehaus.org/display/MAVEN/Creating+a+Maven+Integration+Test

http://wiki.rodcoffin.com/index.php?title=Maven_Integration_Testing

이 중에서 마지막 글이 지금 봄싹 프로젝트 상태에 가장 적합한 내용인 듯...

통합 테스트를 별도의 프로젝트로 분리할 것인가 말 건인가.. 고민이로세~
top


Cargo 메이븐 플러그인 설정하기

Good Tools : 2009.05.11 00:36


참조: http://cargo.codehaus.org/Maven2+plugin

상당히 간단하지만, 그 결과는 그다지 간단하지 않은 것 같습니다. 일단 설정은 이렇게 했습니다.

            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven2-plugin</artifactId>
                <configuration>
                    <container>
                        <containerId>tomcat6x</containerId>
                        <home>/apps/apache-tomcat-6.0.18</home>
                    </container>
                </configuration>
            </plugin>

이렇게 하고, cargo:start 골을 실행하면 톰캣 서버를 메이븐에서 실행할 수 있습니다. mvn cargo:start 이런식으로요.

테스트 진행은 다음 순서대로 할 겁니다.

WAR 파일 패키징 -> cargo를 사용하여 톰캣 서버 실행 -> 웹 (통합) 테스트 -> cargo를 사용한 톰캣 서버 정지

이 것을 그대로 메이븐 골로 옮겨 적으면 다음과 같습니다.

mvn package cargo:start test cargo:stop

그러나 이건 예상대로 동작하지 않습니다. 일단, 단위 테스트와 통합 테스트가 분리되어야 합니다. 단위 테스트를 실행하는데 굳이 카고를 이용하여 테스트 서버를 실행할 필요는 없기 때문이죠.

두 번째로 cargo:start를 실행하는 순간, 해당 커맨드 창은 이용할 수가 없습니다. 서버 로그가 뜨고 Ctrl+C를 눌러 서버 실행을 멈추기 전까지는 해당 커맨드 창이 먹통이나 다릅없습니다. 또 다른 콘솔을 띄우고 그 곳에서 테스트를 진행 한 다음 cargo:stop으로 서버 실행을 멈출 수 있습니다.

이 두 가지를 생각해 봤을 때 빌드가 2단으로 구성되어야 할 것 같습니다.

1단에서 할 일은 clean package(이 안에 complie, test 포함) cargo:start
2단에서 할 일은 integration-test, cargo:stop

궁금한 건 이러한 2단 빌드를 제공하는 CI 툴이 있느냐 하는 것과 메이븐으로 이런 구성을 하는 방법입니다. 후자는 금방 찾을 것 같은데 전자는 잘 모르겠네요. 기존 CI 툴의 plan을 잘 짜서 여러 plan끼리 의존성을 주며 실행하도록 할 수 있다면 가능할지도 모르겠고, 아예 하나의 plan으로 이러한 2단 빌드를 구성할 수 있게 해준다면 편리할 것 같습니다.
top


webdriver - NextSteps

Good Tools : 2009.05.10 14:38


참조: http://code.google.com/p/webdriver/wiki/NextSteps

어떤 웹 드라이버 구현체를 사용해야 하는가?

HtmlUnitDriver: 모든 OS 지원
FirefoxDriver: 모든 OS 지원
InternetExplorerDriver: 윈도우만 지원
SafariDriver: 맥 OS X만 지원

빠르게 테스트하고 싶다면, HtmlUnitDriver가 제격이지만, 실제 브라우저를 통해서 어떤 일이 벌어지는지 보고 싶다면, 각 브라우저에 대한하는 드라이버를 이용. 대신 속도는 떨어질 수 있다.

WebDriver 인터페이스를 사용하여 각각의 구현체를 교체해가며 테스트 할 수 있다.

WebDriver driver = new HtmlUnitDriver();

네비게이션

페이지 이동을 테스트 할 때는 get()을 사용한다.

driver.get("http://www.google.com");

또는 driver.navigate().to("http://www.google.com"); 이런 식으로 이동할 수도 있다.

페이지 다루기

<input type="text" name="passwd" id="passwd-id" />

이 엘리먼트를 참조하는 객체를 만들려면 아래와 같이 사용할 수 있다.

WebElement element;
element = driver.findElement(By.id("passwd-id"));
element = driver.findElement(By.name("passwd"));
element = driver.findElement(By.xpath("//input[@id='passwd-oid']"));

XpathInWebDriver를 사용할 때, 쿼리에 해당하는 엘리먼트가 여러개 라면 그 중에서 가장 첫 번째 엘리먼트를 참조하게 되고, 해당하는 엘리먼트가 없다면, NoSuchElementException이 발생한다.

값을 입력할 수도 있다.

element.sendKeys("some text");

방향키를 누른 효과를 낼 수 도 있다.

element.sendKeys(" and some", Keys.ARROW_DOWN);

텍스트 필드에 입력한 값은 자동으로 지워지지 않기 때문에 원하는 곳에서 clear()로 지워야 한다

element.clear();

폼 채우기

WebElement select = driver.findElement(By.xpath("//select"));
List<WebElement> allOptions = select.getChildrenOfType("option");
for (WebElement option : allOptions) {
    System.out.println(String.format("Value is: %s", option.getValue()));
    option.setSelected();
}

위 코드는 화면에서 SELECT 엘리먼트를 찾고 그 안에 있는 OPTION을 순회하면서 화면에 값을 출력하고 모두 체크한다.

폼을 서브밋 할 수도 있다.

driver.findElement(By.id("submit")).click();  // Assume the button has the ID "submit" :)

또는 모든 엘리먼트에 있는 submit() 메서드를 이용할 수도 있다.

element.submit();

비주얼 정보와 드래그 앤 드랍

화면에 보여줄 엘리먼트인지 감추는 엘리먼트인지는 캐스팅을 통해 알 수 있다

WebElement plain = driver.findElement(By.name("q"));
RenderedWebElement element = (RenderedWebElement) element;

만약 화면에 보여주는 엘리먼트라면 그 위치와 크기 정보를 알 수 있으며 드래그 앤 드랍도 할 수 있다.

RenderedWebElement element = (RenderedWebElement) driver.findElement(By.name("source"));
RenderedWebElement target = (RenderedWebElement) driver.findElement(By.name("target"));

element.dragAndDropOn(target);

윈도우와 프레임 이동하기

화면을 전환할 수 있다.

driver.switchTo().window("windowName");

프레임을 이동할 수도 있다.

driver.switchTo().frame("frameName");

닷(.)을 이용해서 서브 프레임으로 이동할 수도 있다.

driver.switchTo().frame("frameName.0.child");

네비게이션: 히스토리와 위치

처음에 살펴본 get()을 사용할 수도 있지만, navigate()를 이용해서 이동할 수도 있다.

driver.navigate().to("http://www.example.com");

navigate를 사용하면, forward()와 back()을 이용하여 히스토리 정보를 이용할 수 있다.

driver.navigate().forward();
driver.navigate().back();

쿠키

// Go to the correct domain
driver.get("http://www.example.com");

// Now set the cookie. This one's valid for the entire domain
Cookie cookie = new Cookie("key", "value");
driver.manage().addCookie(cookie);

// And now output all the available cookies for the current URL
Set<Cookie> allCookies = driver.manage().getCookies();
for (Cookie loadedCookie : allCookies) {
    System.out.println(String.format("%s -> %s", loadedCookie.getName(), loadedCookie.getValue()));
}

top


웹드라이버(webdriver) pom.xml에 의존성 추가하기

Good Tools : 2009.05.08 15:27


참조: http://code.google.com/p/webdriver/wiki/UsingWebDriver

라이브러리가 담겨있는 저장소부터 등록합니다.

            <repository>
                <id>openqa-releases</id>
                <name>OpenQA Releases</name>
                <url>http://nexus.openqa.org/content/repositories/releases</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>

다음은 사용할 드라이버에 따라 각기 다른 의존성을 추가합니다.

HTMLUnit 드라이버를 사용할 때는

    <dependency>
        <groupId>org.openqa.selenium.webdriver</groupId>
        <artifactId>webdriver-htmlunit</artifactId>
        <version>0.6.964</version>
    </dependency>

Firefox 드라이버를 사용할 때는

    <dependency>
        <groupId>org.openqa.selenium.webdriver</groupId>
        <artifactId>webdriver-firefox</artifactId>
        <version>0.6.964</version>
    </dependency>

IE 드라이버를 사용할 때는

    <dependency>
        <groupId>org.openqa.selenium.webdriver</groupId>
        <artifactId>webdriver-ie</artifactId>
        <version>0.6.964</version>
    </dependency>

사파리 드라이버를 사용할 때는

    <dependency>
        <groupId>org.openqa.selenium.webdriver</groupId>
        <artifactId>webdriver-safari</artifactId>
        <version>0.6.964</version>
    </dependency>

마지막으로 서포트 클래스들을 사용하고 싶다면 아래 의존성을 추가합니다.

    <dependency>
        <groupId>org.openqa.selenium.webdriver</groupId>
        <artifactId>webdriver-support</artifactId>
        <version>0.6.964</version>
    </dependency>
top


웹 테스트 관련 공부할 것

Good Tools : 2009.05.07 17:53


PageObject 패턴
webdriver
WebDriver와 PageObject 패턴
XPath
DOM
Test Driven

생각해 볼 것
- TDD, 꼭 작은 테스트를 만들어야 하는가? 단위가 중요한게 아니다.
- CRUD 테스트라면 구지 DAOTest, ServietTest, ControllerTest로 나눌 필요가 있을까?

top


오늘 하루 타일즈(Tiles)에 낚였나보다~

Good Tools : 2009.05.01 19:46


성윤이랑 정말 신나게 가지고 놀았는데, 집에 갈 때 쯤이 다 되서 생각해 보건데..

매번 페이지를 추가할 때 마다 설정을 추가해야 한다는 건 정말 못 할 짓이다. 하루 종일 성윤이랑 씨름하며 개발중인 봄싹 사이트에 적용해 보았다.

못 할 짓이다.

안그래도 하면서 성윤이한테 이런 얘길 했었다.

    <!-- main page  -->
    <definition name="index" extends=".root">
        <put-attribute name="content" value="/jsp/index.jsp" />
    </definition>

    <definition name="login" extends=".root">
        <put-attribute name="content" value="/jsp/login/login.jsp" />
    </definition>

    <!-- member page  -->
    <definition name="member/list" extends=".root">
        <put-attribute name="content" value="/jsp/member/list.jsp" />
    </definition>

    <definition name="member/add" extends=".empty">
        <put-attribute name="content" value="/jsp/member/add.jsp" />
    </definition>

    <definition name="member/view" extends=".empty">
        <put-attribute name="content" value="/jsp/member/view.jsp" />
    </definition>

    <definition name="member/update" extends=".empty">
        <put-attribute name="content" value="/jsp/member/update.jsp" />
    </definition>

이런 식으로 계속 설정하는 건 정말 안 되겠다 싶어서, definition의 name 속성에 넣는 값이랑 put-attrubute의 value 속성에 넣는 값들이 비슷해 보이니까 저런걸 CoC 적용해서 자동으로 할 수 있게 패치를 만들어 볼까? 하는 얘길했었다.


그러나...


못 할 짓이고, 안 해도 될 것 같다. 하루 종일 공부했는데 허탈한 기분이 들지만..

사부님이 such is life 란다. ㅋㅋ

내일은 태그파일을 적용해봐야겠다.


top


스프링 MVC에서 타일즈 2 사용하기

Good Tools : 2009.05.01 19:10


참조: http://richardbarabe.wordpress.com/2009/02/23/apache-tiles-2-integration-with-spring-mvc/

오늘은 노동자의 날(?)이라 쉬는 사람들이 많은데도 출근한 성윤군이랑 열심히 타일즈를 적용하고 있습니다. 아파치 타일즈 2 홈페이지, 프로 스프링 2.5, 스프링 3.0 레퍼런스를 보면서 적용했지만... 잘 안되더군요.  결국은 위 블로거가 제공하는 패치를 사용해서 해결했습니다.

0. pom.xml에 Tiles 라이브러리 추가하기

        <!-- tiles -->
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>com.springsource.org.apache.tiles</artifactId>
            <version>2.1.2.osgi</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>com.springsource.org.apache.tiles.core</artifactId>
            <version>2.1.2.osgi</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>com.springsource.org.apache.tiles.servlet</artifactId>
            <version>2.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>com.springsource.org.apache.tiles.jsp</artifactId>
            <version>2.1.2</version>
        </dependency>

1. xxx-servlet.xml에 TilesConfigurer 추가하기

    <!-- ============================================================= -->
    <!--  Tiles                                                        -->
    <!-- ============================================================= -->
    <bean id="tilesConfigurer" class="springsprout.web.SpringTilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/tiles/general-layout.xml</value>
                <value>/WEB-INF/tiles/tiles-content.xml</value>
            </list>
        </property>
    </bean>

2. xxx-servlet.xml에 뷰 리졸버 추가하기

    <bean id="tilesViewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver"
        p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView" />

3. 타일즈 설정 파일 추가하기

위 설정대로 /WEB-INF/ 밑에 tiles라는 폴더를 만들고 그 안에 파일 두 개를 만들어 줍니다.

저희는 제일 간단한 3단 구조로 설정했습니다.

general-layout.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
    <definition name=".root" template="jsp/root.jsp">
        <put-attribute name="header" value="/jsp/layout/header.jsp" />
        <put-attribute name="footer" value="/jsp/layout/footer.jsp" />
    </definition>
</tiles-definitions>

tiles-content.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
    <definition name="index" extends=".root">
        <put-attribute name="content" value="/jsp/index.jsp" />
    </definition>

    <definition name="login" extends=".root">
        <put-attribute name="content" value="/jsp/login/login.jsp" />
    </definition>
</tiles-definitions>

general-layout.xml은 그야말로 템플릿 레이아웃이고 이 레이아웃을 tiles-context.xml에 상속 받아서 사용합니다. 이렇게 해야 설정을 최소화 할 수 있겠죠. 불편한 거 하나는.. 모든 뷰를 명시적으로 저렇게 설정이 한 덩어리씩 추가가 되어야 한다는 거죠. 이걸 CoC로 어떻게 간편화 할 수 없을지 고민입니다. 타일즈에서 만들어 주세요~

4. 템플릿 만들기

general-layout.xml에 정의한 root.jsp, header,jsp, footer.jsp, empty.jsp 파일을 만듭니다. 이 JSP 페이지가 기본 레이아웃을 그리는 JSP 페이지입니다.

roo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" lang="en">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <title>SpringSprout</title>
    <link href="/css/main.css" media="screen" rel="stylesheet" type="text/css" />
  </head>
<body>
    <div id="main">
        <tiles:insertAttribute name="header"/>
        <tiles:insertAttribute name="content"/>
    </div>
    <tiles:insertAttribute name="footer"/>
</body>
</html>

header.jsp
<div id="header" class="basic">
    <div class="site">
         <div class="logo">
             <a href="/"><img src="images/logo.png" alt="springsprout" /></a>
         </div>
         <div class="actions">
             <a href="/">Home</a>
             <a href="/">Studies</a>
             <a href="/">Seminars</a>
             <a href="/">Blog</a>
             <a href="/">Wiki</a>
             <a href="/">Signup</a>
             <a href="/login.do">Login</a>
         </div>
    </div>
</div>

footer.jsp
<div id="footer">
    <div class="site">
        <h2>Good Bye ~~~!!</h2>
    </div>
</div>

empty.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<tiles:insertAttribute name="content"/>

끝입니다. 이제 새로운 페이지를 만들 때 마다 헤더와 푸터를 제외하고 몸통 부분만 만들면 됩니다.

5. 패치

1번에서 설정한 tilesConfigurer를 등록하시려면 아래 파일이 필요하실 겁니다.


이 파일을 사용하지 않고 스프링이 제공하는 클래스를 사용하시면 맨 위 링크의 글에 나타나 있는 에러가 발생할 겁니다.

top


Tiles와 SiteMesh 차이

Good Tools : 2009.05.01 14:42


참조: http://tiles.apache.org/framework/tutorial/pattern.html

이 두 가지 툴이 비슷한 일을 하지만, 그 일을 하는 방식은 다른 것 같습니다. Tiles는 Composite View 패턴을 사용하고 SiteMesh는 Decorator 패턴을 사용하는 차이가 있더군요.

두 패턴을 비교한 표가 있길래 옮겨 봅니다.

Aspect Composite View Decorator
Reusability The different parts of the
page (template and pieces) can
be reused across the whole
application.
Each decorator can be
reused, but the decoration
itself can be applied to
one page at a time.
Ease of
configuration
Each page must be defined
explicitly.
The decorator can be
applied even to the entire
application.
Runtime
configuration
The pages can be configured
and organized at runtime
Since one page is decorated
at a time, this feature is
not present.
Performances Low overhead for composition. The page to be decorated
has to be parsed.

일단, 재사용성에 있어서는 매번 데코레이터를 적용하여 페이지를 만들어 내는 데코레이터 패턴 보다는 변하는 부분만 바뀌고 나머지는 재사용하는 컴포짓 뷰 패턴에 한표를 주고 싶습니다.

두 번째, 설정에 있어서는 컴포짓 뷰 패턴이 모든 페이지에 (뷰 구성요소들을)명시적으로 정의해줘야 하는 불편함이 있기 때문에 데코레이터에게 한표 주겠습니다.

세 번째. 실행시에 설정을 변경할 수 있는 것 때문에 컴포짓 뷰에 한표 주겠스니다.

마지막으로 성능에 있어서도 컴포짓 뷰에 한표 주겠습니다.


top


Tiles VS SiteMesh

Good Tools : 2009.05.01 14:25


너무 차이가 많이 나네요. 3단 구조(위, 본문, 아래)로 나누려는데, 비슷한 일을 해주는 두 개 툴중에 뭘 쓸까 고민하다가 일단 트랜드를 확인해 봤습니다. 무작정 트랜드를 따르려는 건 아니고, 둘 중에 어떤게 왜 인기가 많은지 궁금하자나요.ㅎㅎ



Tiles가 엄청나게 인기가 좋군요. 작년에 무슨일이 있었길래 인기가 급상승 중이던 SiteMesh가 급 하락 하고, Tiles 인기가 확 올라갔는지 궁금해지네요. 그보단 일단 왜 Tiles가 인기가 좋은 건지 Tiles를 좀 봐야겠습니다~
top




: 1 : 2 : 3 : 4 : 5 : ··· : 7 :