제일 처음 자바를 시작했을 때, 에러(Error와 Exception 나뉘지만 에러로 표기합니다)화면을 보고 깜짝 놀랬습니다.

2008-10-06 13:27:06 ApplicationDispatcher[/] Servlet.service() for servlet download threw exception
java.lang.IllegalStateException: getWriter() has already been called for this response
        at org.apache.coyote.tomcat5.CoyoteResponse.getOutputStream(CoyoteResponse.java:568)
        at org.apache.coyote.tomcat5.CoyoteResponseFacade.getOutputStream(CoyoteResponseFacade.java:148)
        at kr.pe.okjsp.DownloadServlet.doGet(Unknown Source)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
        at kr.pe.okjsp.ControllerServlet.doGet(Unknown Source)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
... 중략 ...
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
        at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
        at java.lang.Thread.run(Thread.java:619)

저런 식으로 우수수 떨어지는 에러메시지는 초보에게는 공포감을 일으키기 충분합니다. "내가 그 정도로 잘못했는지 정말 몰랐어요"라는 감정이 생기죠. 사실 에러메시지의 상단 2~3줄만 봐도 문제의 원인을 파악할 수 있는데, 스택트레이스(Stack Trace)라 불리는 사정없는 에러메시지는 정말 "안 좋아"였습니다.

try{...} catch(Exception e) { System.out.println(e.getMessage()); }

저런 메시지 폭탄을 피하기 위해서 위 코드를 통해 핵심 메시지만 봅니다. 이 포스팅의 핵심은 저기서 나온 메시지들과 친해지라는 것입니다. 아마 자주 보일 것입니다.

가까이 하기 어려운 사실 하나는 "영어"로 된 메시지라는 것이겠죠. 영어는 못해도 자바는 좀 하신다면 공개된 소스나 디컴파일을 통해서 저 메시지 생성부분을 찾아볼 수 있습니다. 더구나 자바의 기본 라이브러리는 공개되어 있습니다. src.zip 파일이 그것이죠.

이클립스 툴이나 텍스트 에디터 등을 통해서 에러 메시지를 검색해보면 해당 부분의 소스를 볼 수 있을 것입니다.

또 다른 방법은 구글링을 통해서 소스를 검색해 볼 수도 있습니다. 위 메시지의 경우 검색어를 다음과 같이 넣습니다.


따옴표("")로 감싼 이유는 단어 구분해서 찾지 말고 문구 그대로 검색하라는 의미이고 filetype:java 는 확장자가 java인 파일만 검색하라는 뜻입니다.

이런 식으로 소스를 찾아서 에러원인을 볼 수 있다면, 아마 문제해결(Troubleshooting) 능력이 많이 좋아질 것입니다.

버그와 에러는 다르죠. 에러 메시지! 사라지지 말고 함께 해요.

ps. 공통 프레임워크 만드시는 분들 에러 씹지 말고 보내주세요. ^^;
http://www.ibm.com/developerworks/kr/library/dwclm/20080826/ 

http://javapathfinder.sourceforge.net/ 

자바 프로그램의 데드락이나 발생가능한 예외상황을 찾아주는 프로그램이라고 합니다.

자바 패스파인더는 일반적인 디버거와 다르게 소프트웨어를 한번 실행하여 소프트웨어 상태를 확인하는 것이 아니라, 실행 가능한 모든 경로를 조사하여 발생 가능한 속성 위배(property violations) 사항(가령 deadlock이나 unhandled exception)을 확인하여 문제점을 보고한다.

from: http://www.ibm.com/developerworks/kr/library/dwclm/20080826/ 

사용자 삽입 이미지
이상민님의 멋진 강의 감사했습니다. 8시 메인 강의 이전에 TPTP로 간략하게 프로파일링하는 세션을 제가 진행했습니다. 그날 빌린 장소의 전기가 안 도와주는 바람에 15분 늦게 시작했지요. 죄송하게 생각합니다.

이상민 님의 강의는 아주 재밌었습니다. 실무에서의 경험담이 재밌었고, 특히나 뚱뚱한 PM과 날씬한 PM 앞에서 대화법은 아주 촌철살인이었습니다. 체격이 마른 PM 앞에서는 특히 말 조심해야한다는 지혜의 말씀이었죠.

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

뒷풀이에는 15분 정도가 참가했습니다. 때문에 금요일 오후 강남역 부근에 일찍 자리를 잡아놓지 않아서 또 많이 헤맸습니다. ^^; 그래서 들어간 곳이 조개구이집. 그 더운 날에 남아서 얘기 나누신 분들께 또 한 번 죄송했습니다. ㅡㅡ;
사용자 삽입 이미지
사용자 삽입 이미지


혼자서 30명이 넘는 세미나를 주최하는 무리수는 두지 말아야 할 것 같습니다.

이리도 빨리 30명의 신청이 빨리 끝날 줄은 몰랐습니다. ^^; 하루도 안 걸렸습니다. 이상민님을 모시고 2시간의 강의를 듣게 됩니다. 자바 성능과 튜닝에 대한 이야기죠.
금요일 저녁에 하는 세미나이기 때문에 워밍업타임을 위해서 저도 이클립스 TPTP에 대해서 간략하게 소개를 하게 됩니다.
메인 경기를 앞둔 오프닝 매치라고 할까요.

한빛미디어 출판사에서 몇 권의 책을 지원해주신다니 고마울 따름입니다.

7월에는 저자 세미나가 좀 있는 편 같네요. 저와 함께 "나는 프로그래머다"를 함께 쓰신 이춘식 님의 DB관련 세미나도 있고요, 친구인 옥상훈 차장플렉스 개정판 출간 기념 세미나도 flexcomponent 카페를 통해서 여니까 말이죠.

JUnit & Profiling 신촌 버전 장소도 신청해야겠습니다. ^^

사용자 삽입 이미지



마인드맵을 이용해서 강의한 두 번째입니다. 저도 허진영님 덕분에 알게 된 강의 방식이었죠. 자료는 부분 캡쳐를 차례대로 ppt에 붙여놓았습니다.

최상훈 JCO회장의 인사말과 자바원 개관으로 세션은 시작되었습니다.

사용자 삽입 이미지
현장의 모습에 대한 인상적인 사진이죠. 택시 옆문에 쓰여진 OUR PEOPLE. OUR COMMUNITY.는 자바원과 상관없는 것이지만 눈에 띄는군요.
사용자 삽입 이미지

총 370석이라고 하는데, 300분 정도 참여하신 것 같습니다.
사용자 삽입 이미지

세미나는 JavaOne 2008 내용을 요약해서 발표하는 것이었습니다. 자바의 2008 트렌드에 대한 이야기라고 할 수 있죠.
사용자 삽입 이미지

참가 기념품은 인형스피커인데, 깜찍합니다. 지금도 ipod video에 연결해서 잘 듣고 있습니다. 강사 기념품은 USB였습니다. 이거 뭥미~ 할 뻔하다가 8기가 USB에 헉~뜨 했습니다. 잘 쓰겠습니다. ^^;
사용자 삽입 이미지



세미나 끝나고 문 밖에서 질문받고 있었는데, 테스트 케이스의 효용성에 대해서 프로젝트 후반에 "삽질"을 효과적으로 줄일 수 있다고 답변을 도와주신 분께 감사드립니다.
SI 환경에서 테스트케이스를 만드는 것은 이미 생각하신대로 힘든 일입니다. 일정의 압박이나 그 외 스트레스가 많은 환경이니까요. 팀장의 의지와 팀원들의 소통도 원활해야 가능한 일이 아닌가 생각됩니다.

테스트케이스와 더불어 매일 30분 정도의 프로젝트 팀 코드리뷰시간을 갖는 것을 추천합니다. 팀원들 사이에 좋은 커뮤니케이션 시간이 될 것입니다.

들어주신 분들 감사합니다.
몇 년 전 okjsp를 통해서 jprofiler를 소개했었습니다.
http://www.google.co.kr/search?q=jprofiler+site%3Aokjsp.pe.kr

맥용으로도 지원이 되는군요. 벌써 버전이 5입니다. 처음 본 때가 3.x 였는데요. ^^;
사용자 삽입 이미지

프로파일링을 간단히 얘기하자면 메모리와 CPU의 활동 내역을 기록하고 보여주는 행위입니다. 객체와 인스턴스의 생성갯수과 소멸 등을 기록합니다. 모든 것을 기록하기 때문에 실행 성능에는 막대한 영향을 줍니다. 쌓이는 로그의 양도 그렇구요.

10일짜리 라이센스를 계속 연장할 수 있습니다. 회사에서 쓴다면 구입하기에 부담되는 가격은 아니니까 툴에 익숙해지시면 구입도 추천합니다.

사용자 삽입 이미지

open session 에서 데모를 돌리시면 물고기 사냥 게임이 나옵니다.
사용자 삽입 이미지

물론 자바로 만들어진 것이구요. 이것을 시작점으로 여러가지 정보를 얻으시면 좋을 듯 합니다.
사용자 삽입 이미지

related: http://ej-technologies.com/
Grails에도 ORM이 있군요. Object-Relational Mapping은 프로그래밍에서 자동화의 한축을 그은 기법입니다. 위키피디어의 정의를 참고하세요.

프로그래밍하면서 잡스러운 일들을 자동화시키려고 많은 프레임워크들과 라이브러리들이 나왔습니다. 그리고 CoC(Convention over Configuration)같은 개념들도 귀차니즘을 기반해서 나온 것들이죠. 똑똑한 프로그래머들은 자동화할 포인트를 찾으면 가차 없이 나옵니다.

GORM은 하이버네이트를 그루비(Groovy)로 살짝 덧씌운 것이다("Gibernate"가 "GORM"보다 발음하기가 어려워 쓰이지 않는 것으로 추측한다).
from:
dw: GORM: 재미있는 이름, 진지한 기술 (한글)

가이버네이트보다는 GORM이라는 이름이 더 낫다고 합니다. (맥가이버가 생각나는 저는 ^^;)


공부거리가 자꾸 생겨서 심통이 납니다. 언제 활용하라구요. ^^;
일상이 무료한 개발자는 따라가보셔도 좋을 듯 합니다.
http://www.ibm.com/developerworks/kr/library/j-grails02128/index.html?ca=drs-kr
https://jugs.dev.java.net/programs-list.html
컨퍼런스 패스가 무료 또는 할인이 되네요.
오라일리의 리뷰 건도 그렇고요.
그 외에도 많은 혜택들이 있습니다.
http://ant.apache.org

make의 java버전
James Duncan Davidson
Tomcat의 멀티플랫폼 빌드를 위해 만들어짐.

java 작업 자동화의 기본
확장성이 뛰어난 설계로 인해 많은 벤더에서 제품에 추가

xml형식의 빌드 설정 파일
build.xml 이 기본 이름

<project> 최상위
<target> 작업그룹
<task> 수많은 작업 http://ant.apache.org/manual 에서 task 확인 가능
<properties> build.xml 내에서 사용되는 변수

task에는 두 종류가 있음
ant 배포판과 함께 기본적으로 지원되는 core tasks
ant/lib 에 넣고 참조할 다른 jar파일이 필요한 Optional tasks.

설치 방법
압축 풀고, ANT_HOME 환경변수 설정하고 %ANT_HOME%\bin; 을 Path 시스템 환경변수 맨 처음에 추가하면 설치 완료.

cmd창에서 ant -version 으로 설치 확인


Ant와 같이 자기 몸의 50배 이상 일하듯, 작은 빌드 툴이지만 자바를 비롯해서 시스템 작업까지 거의 다 가능함. Another Neat Tool 의 약자.
사용자 삽입 이미지
관심있는 주제들을 뽑아봤습니다.
하루에 5개의 세션을 소화한다고 생각하고 20개를 골라봤습니다.

TS-5040 The Many Moons of Eclipse Technical Session
TS-6072 Advanced Enterprise Debugging Techniques  Technical Session
TS-5250 Asynchronous Ajax for Revolutionary Web Applications  Technical Session
TS-5502 Ten Ways to Destroy Your Community Technical Session
TS-5918 Open-Source Service-Oriented Architecture with Service Component Architecture and Apache Tuscany Technical Session
TS-6389 Growing Open-Source Developer Communities Technical Session
TS-5535 Tying Java™ Technologies Together the RESTful Way Technical Session
TS-6574 How to Implement Your Own OpenSocial Container on the Java™ Platform Technical Session
TS-5859 Unit-Testing Database Operations with DBUnit Technical Session
TS-5274 Groovy on a Cloud: Testing Java™ Platform, Enterprise Edition (Java EE Platform) Applications on Amazon EC2  Technical Session
TS-6537 Applications for the Masses by the Masses: Why Engineers Are an Endangered Species Technical Session
TS-5415 Java™ Servlet 3.0 API: What’s New and Exciting Technical Session
TS-6421 Mylyn: Code at the Speed of Thought Technical Session
TS-6163 Building Effective Mobile Enterprise Applications Technical Session
TS-5969 Distributed Client-Server Persistence with the Java™ Persistence API  Technical Session
TS-5596 Pimp My Build: 10 Ways to Make Your Build Rock  Technical Session
TS-6053 Optimizing JavaScript™ Programming Language Performance Technical Session
TS-6547 Improving the Engineering Process Through Automation by Hudson  Technical Session
TS-5389 Rich Internet Applications with Adobe Flex and Java™ Technology Technical Session
LAB-7430  Developing Distributed Wireless Applications Using Sun™ Small Programmable Object Technology (Sun SPOT) Systems Hands-On Lab

관련 세션 정보는 아래 링크를 통해서 찾아볼 수 있습니다.
http://java.sun.com/javaone/sf/sessions.jsp 

그리고 전체 세션 목록은 329개입니다. JCO에서 하루에 개최한 30개보다는 많죠. 보통 세션은 60분 단위입니다. 전체 목록 엑셀 파일 첨부합니다.


아으~ 가고 싶군요. 미니멈 400만원(등록 150만, 항공 150만, 체류 100만) 정도의 예산이 들 듯 합니다. ^^; 2004년, 2006년, 휴가내고 사비로 다녀왔는데, 출혈이 크긴 큽니다. 다녀와서 카드값 지불하느라 ㄷㄷㄷ 이었죠.

그땐 투자라 생각했는데, 지금은 소심해진 듯 하기도 하고...

+ Recent posts