2007년 8월 15일 수요일

클래스 위치 찾아 주는 프로그램

 


WAS에 jar 파일과 class 파일들을 만들어 올려서 사용하다 보면, 서버에서 에러가 나면서 어떤 클래스 파일에 문제가 있다고 메시지가 뜨는 경우가 많다.

그런데 이 클래스가 도무지 어디에 박혀 있는지 찾기가 쉽지 않다.

그냥 클래스파일이면 경로를 뒤지다 보면 나올 수도 있지만 jar 파일 안에라도 들어가 있으면 하나씩 열어 가면서 확인해야 한다.

그래서, jar 파일과 class 파일이 있는 디렉토리만 입력해 주면 포함된 모든 클래스 파일을 뒤져서 해당 클래스 파일을 찾아 주는 프로그램을 만들어 보았다.

본 S/W Architect 카테고리의 이전 포스트 중 '클래스 중복 확인 프로그램'과 기본 로직은 비슷하고 단지 이것은 그냥 필요한 것만 찾아 줄 뿐이다.

대신, 해당 클래스 파일을 모두 찾아 주기 때문에 같은 경로의 클래스 파일이 결과에 여러번 반복되어 나타난다면 중복되어 올라갔다고 볼 수 있으며 이런 것은 되도록 하나만 남도록 하는 것이 찾기 어려운 에러가 발생하는 것을 방지하는 좋은 방법이다.


사용법 :

1. 첨부된 zip 파일의 압축을 푼다.

2. lib.properties에 WAS 동작시 로딩되는 jar 파일 디렉토리(lib)와 class 파일 디렉토리(classes)를 모두 입력한다.

   jar를 포함한 디렉토리는 jar로 시작해서 일련번호를 붙이고, class파일을 포함한 디렉토리는 class로 시작해서 일련번호를 붙인다.

   단, 경로는 절대경로로 입력하며 경로구분자는 반드시 "/"로 해야 한다. "\"일 경우는 바꿔 주어야 한다.(이건 귀차니즘 때문에.. ^^;)

   웹애플리케이션을 개발할 경우, 보통 jar를 포함하는 lib 디렉토리들은 WAS 루트의 lib, server/lib, 웹애플리케이션의 WEB-INF/lib 정도가 되고,

   클래스파일 디렉토리는 웹애플리케이션의 WEB-INF/classes 정도가 된다.

3. runFinder.bat를 실행한다.

   C:\> runFinder [클래스명 전체 또는 일부]

    단, 여기서 클래스명은 대소문자를 구분한다.

4. 생성되는 result.txt 파일을 열어 클래스들의 위치를 확인한다.


프로젝트마다 lib.properties 하나만 세팅해 놓으면, 끝날 때까지 편리하게 사용할 수 있을 것이다.

클래스 중복 확인 프로그램과 형식이 똑같으므로 같은 디렉토리에 놓고 공유해서 사용해도 괜찮다.



이것도 역시, 아무쪼록 많은 도움이 되길...


추가>

이것도 원래 JDK1.5에서만 돌아가서 추가로 1.4로 컴파일한 프로그램을 올립니다.


2007년 8월 12일 일요일

놀라운 발견

오늘 코딩을 하다가 놀라운 사실을 발견했다.

아래와 같은 코드를 디버깅용으로 만들어 넣고 테스트해 보았다.

 

System.out.println("ignore:"+ignore+",characterencoding:"+request.getCharacterEncoding());

 

그런데, 분명히 콘솔에 찍혀야 되는데 안 찍히길래 컴파일이 제대로 된 건가 확인하기 위해 디컴파일러로 소스를 다시 보니 아래와 같은 코드가 보이는 것이다.

 

System.out.println((new StringBuilder("ignore:")).append(ignore).append(",characterencoding:").append(request.getCharacterEncoding()).toString());

 

흠, String concatenation 때문에 하도 문제가 생기니 JDK 1.5부턴 컴파일할 때 아예 이렇게 바이트코드를 만드는 모양이군...

요 몇달동안 String concatenation해야 할 게 많아서 그때마다 StringBuffer에 append하느라고 눈 빠질 뻔 했는데, 이게 언제 바뀐 거야.

바꾸면 나한테 전화라도 미리 해 줬어야 되는 거 아닌감? ㅋㅋ

 

2007년 8월 4일 토요일

웹개발을 위한 Power Tool - Firefox + Firebug

한동안 X-Internet 프로젝트를 하다 보니 순수 웹 개발에 대해서 잘 몰랐었는데

올해 순수 웹 개발을 하다 보니 말로만 듣던 Firefox + Firebug의 기능을 확인하게 되었다.

진작 이런 게 있었으면 웹개발 진짜 쉽게 할 수 있었는데, 왜 이제야 나온 거니? 왜 그런 거니?

 

1. Firebug 설치

Firefox만으로는 안 되고, Firebug라는 플러그인을 추가해야 강력한 무기를 완성하게 되는 것이다.

Firefox의 메뉴에서 "도구 > 부가기능"으로 들어간다.

 

사용자 삽입 이미지

 

이 다이얼로그는 이미 설치되어 있는 것이고, 없다면 아래의 "유용한 확장 기능 찾기"로 들어가 Firebug를 찾아 설치해야 한다.

설치되면 위와 같은 다이얼로그를 볼 수 있다.

설치된 후에 Firebug와 관련된 설정은 "도구 > Firebug"에서 조정할 수 있는데, Firefox를 오직 개발용으로 사용한다면 문제가 없지만 웹서핑용으로도 사용한다면 자신이 디버그를 원하는 주소를 등록하는 것이 좋다. 아무래도 디버깅툴이다 보니 Firebug가 동작하면 사이트가 뜨고 동작하는데 시간이 좀 걸린다.

 

 

2. Inspect Element

나를 반하게 한 기능 중의 하나가 Inspect Element이다. 이건 특정 element의 현재 속성을 HTML로 표현해 준다. 중요한 건 자바스크립트 등으로 변경되거나 추가된 각종 속성을 모두 보여 준다는 것이다. 그러니까, 서버에서 받은 코드가 아닌 현재 웹브라우저가 갖고 있는 실제 내용을 직접 확인할 수 있다는 얘기다.

 

이것은 화면상의 특정 부분에 오른쪽 클릭을 하고 메뉴에서 "Inspect Element"를 선택한다.

 

사용자 삽입 이미지

 

여기서는 맨 위의 플러스 이미지에서 오른쪽 클릭을 했다.

그러면, Firefox 하단에 아래와 같은 내용이 나타난다.

 

사용자 삽입 이미지

 

왼쪽 부분에는 현재 메모리상의 HTML 코드가 나오고, 오른쪽에는 이 element에 적용된 스타일이 표시된다.

HTML 코드에 마우스를 올려 놓으면 그 코드가 화면에서 어떤 부분인지 화면에 하늘색으로 표시가 되니 코드가 실제 화면에서 어떻게 나타나는지 확인하는 데도 유용하다.

 

 

3. 자바스크립트 디버그

이리저리 Firebug를 사용해 보다가 가장 놀란 기능이다. 자바스크립트를 디버그하다니...

먼저 위의 그림에서 Script 탭을 선택하고, 바로 위에서 디버그할 js나 자바스크립트를 포함한 html을 선택하면 아래에 코드가 나타난다.

코드에서 실행을 멈출 설정할 라인을 골라 클릭하면 breakpoint가 표시된다.

여기서 화면의 버튼을 클릭해서 자바스크립트를 실행시키거나, 화면을 다시 로딩하거나 하면 설정해 놓은 breakpoint에서 멈춰서 다음과 같은 화면이 나타난다.

 

사용자 삽입 이미지

 

여기부터는 이클립스에서 디버그를 해 본 사람이라면 편하게 사용할 수 있다.

오른쪽에 변수의 값들을 확인할 수 있고, New watch expression...에서 표현식을 입력하고 중간중간 확인해 볼 수도 있다.

프로그램 진행은 오른쪽 위의 각종 화살표를 누르면서 진행해 볼 수 있다. 단, 이클립스와 모양은 같지만 기능이 다르니 잘 확인해서 눌러야 한다.

 

 

이 포스트에선 내가 가장 유용하다고 생각되는 기능만을 다뤘는데 그 외의 버튼을 눌러보다 보면 정말 강력한 플러그인이라는 걸 느끼게 될 것이다.

단, Firefox는 IE에서 사용하는 비표준 태그나 자바스크립트 함수, ActiveX 등이 동작하지 않으므로 제한이 있다고 할 수도 있는데, 요즘 세상의 흐름이 표준을 준수하는 모든 브라우저를 사용할 수 있도록 사이트를 구성하는 것이기 때문에 이 기회에 이런 흐름을 따르는 것도 좋을 것 같다.

2007년 6월 14일 목요일

프린트 관련 CSS 속성

화면을 개발하다 보면 출력해야 하는 페이지가 꼭 있기 마련이다.

그런데, 통프레임이거나 프레임이 분리되는 경우라도 화면에는 보여야 하지만 출력할 때는 빼고 싶은 내용이 있다.

이거 찾는 데 시간이 걸리긴 했는데, 막상 적용하기는 무척 간단하다.

 

아래의 내용을 HTML의 style 태그 내에 넣거나, include하는 CSS 파일에 넣는다.

@media print
{

  .noprint { display:none; }

}

 

설명 : @media print 는 print되는 결과물에만 적용되는 스타일이라는 뜻이다.

        .noprint { display:none; } 잘 아는 바와 같이 display:none은 영역을 차지하지 않고, 보여주지도 않는다.

        결과적으로 noprint라는 스타일을 적용한 객체는 프린트할 때 제외된다는 뜻이다.

 

이렇게 선언이 되었으니 적용만 하면 된다.

table, tr, td, div, input 등 어떤 객체든 일반 스타일 적용하듯class="noprint"속성만 붙이면 출력할 때 제외된다.

만약에 그 객체에 이미 화면용 스타일이 적용되어 있다면,

적용된 화면용 스타일이 "input_text"라면 그냥 그 옆에 noprint만 추가해 주면 된다.

다음과 같이class="input_text noprint"하면 된다.

그리고, 자바스크립트로 window.print()만 실행하면 noprint 속성이 적용 안 된 내용만 프린터로 출력된다.

이것을 응용하면 @media print 내에 프린트용 폰트나 속성을 적용해서, 화면과 출력물의 모양을 달리 할 수도 있다.

하지만, 이런 귀찮은 작업을 누가 하겠는가? 하라고 하면 짜증날 것 같다. ^^;

 

 

참고로 아래에는 window.print()로 인쇄 다이얼로그가 떴을 때 기본 종이 방향이 가로가 되도록 하는 CSS이다.

화면 내용의 폭이 커서 가로 출력이 필요할 때 유용하다.

(그런데, IE6에선 동작하고, FireFox2에선 동작 안 한다. FireFox는 세로로 해도 알아서 넘어가지 않게 자동축소출력해 주니 문제없다.)

이것도 마찬가지로 HTML의 style 태그 내에나, include하는 CSS 파일 내에 추가시켜 주면 된다.

@page { size: landscape; }

 

2007년 5월 8일 화요일

중복 클래스 확인 프로그램

WAS에 jar 파일과 class 파일들을 만들어 올려서 사용하다 보면, 개발할 땐 잘 돌아갔는데 서버에서 에러가 나는 경우가 많다.

클래스로더의 상하구조 때문일 경우도 있고, 동일한 패키지의 동일한 클래스가 여러 버전으로 중복되어 올라가 있어 발생하는 경우도 있다.

그래서, jar 파일과 class 파일이 있는 디렉토리만 입력해 주면 포함된 모든 클래스 파일을 뒤져서 중복여부를 체크해 주는 프로그램을 만들어 보았다.

 

사용법 :

1. 첨부된 zip 파일의 압축을 푼다.

2. lib.properties에 WAS 동작시 로딩되는 jar 파일 디렉토리(lib)와 class 파일 디렉토리(classes)를 모두 입력한다.

   jar를 포함한 디렉토리는 jar로 시작해서 일련번호를 붙이고, class파일을 포함한 디렉토리는 class로 시작해서 일련번호를 붙인다.

   단, 절대경로로 입력하며 경로구분자는 반드시 "/"로 해야 한다. "\"일 경우는 바꿔 주어야 한다.(이건 귀차니즘 때문에.. ^^;)

3. runChecker.bat를 실행한다.

4. 생성되는 result.txt 파일을 열어 중복 클래스와 클래스들의 파일크기, 생성일자를 비교해 어떤 걸 빼야 할지 결정한다.

 

아무쪼록 많은 도움이 되길...

 

추가>

기존에 올렸던 프로그램이 JDK1.5에서만 돌아가기 때문에

추가로 JDK1.4를 사용하는 분들을 위한 프로그램을 첨부합니다.

 

2007년 4월 14일 토요일

JVM Monitoring

J2SE 5.0부터 JVM 상태를 모니터링할 수 있는 기능이 제공된다.

대강 보면 JMX 방식으로 처리되는 것 같고, 메모리를 비롯해 쓰레드, 클래스 로딩까지 볼 수 있어 문제를 찾아내야 할 경우에 꽤 유용하게 사용될 수 있을 것 같다.

WebLogic 같은 경우 8.1에선 콘솔에서 Heap Memory 모니터링 기능이 있어서 사용했는데, 9.0에서는 없어진 것인지 찾을 수가 없었다.

있다 하더라도 지금부터 설명하는 걸로 하면 더 많은 정보를 세세히 살필 수 있으니 신경 안 쓰려고 한다. ㅋㅋ

 

1. JVM에 자바 옵션 추가

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port={포트번호}
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

☞ 여기서 {port번호}는 외부에서 이 WAS에 접속하기 위한 포트로 보이고, netstat으로 쳐 봐서 사용하지 않는 포트번호를 골라서 사용하면 될듯하다. 대강 10000~15000번에서 고르면 되겠고, 참고로 나는 12000번을 사용했다.

 

이 옵션을 적용시키려면 이클립스 같은 데서 디버그모드로 WAS를 띄운다면 Server정보의 start탭에 VM Arguments 부분에 붙여 넣으면 되고, 스크립트 방식으로 구동한다면 한 줄로 몰아서 %JAVA_OPTION 변수에 추가시켜 주면 되겠다.

set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

-> 위는 jBoss에서 사용한 예

 

2. 1.에서 적용한 옵션을 적용한 WAS 기동

 

3. {JDK_Home_Directory}/bin/jconsole.exe를 실행

사용자 삽입 이미지

나는 WAS를 로컬에서 띄워서 그런지 Local탭에 자동으로 인식이 되었고 Connect 버튼을 클릭하면 바로 연결된다.

Remote 탭이 있는 걸 보니 원격의 WAS에도 연결이 가능한 것으로 보이나 테스트를 못 해 봤으니 일단 패스~(나중에 해 보고 추가하겠음)

 

4. 연결 후 JVM 정보 모니터링

사용자 삽입 이미지

일단 전체적인 내용을 간추려서 보여 준다.

 

사용자 삽입 이미지

Heap, Non-Heap 별로 모니터링이 가능하고, 오른쪽 아래의 이미지를 클릭하면 그 중에서도 eden, survivors, perm 등등의 영역별로 모니터링을 할 수 있다. Perform GC를 클릭하면 GC도 한 번 시켜 볼 수 있다.

 

사용자 삽입 이미지

쓰레드 정보도 모니터링이 가능하다.

 

사용자 삽입 이미지

로딩된 클래스의 수도 확인이 가능하다.

 

사용자 삽입 이미지

Mbean 정보도 볼 수 있다.

 

사용자 삽입 이미지

JVM 및 시스템에 관한 정보까지 쭉~ 확인시켜 준다.

 

돈 주고 비싼 툴 사서 보면 더 좋겠지만, 여건이 안 된다면 이런 것도 도움이 되지 않을까 싶다.

 

2007년 1월 30일 화요일

Query Generator




항상 SQL 쿼리를 만드는 일은 단순반복적인 일이다.
그래서, 간단한 프로그램을 만들어 보았다.
위에 첨부한 querygen.war만 deploy하면 되고, 아래의 사용법대로 사용하기만 하면 된다.
단, Oracle 전용이고, 포함된 JDBC 드라이버(ojdbc14.jar)는 10g 버전용이므로 8i, 9i 까지 모두 이상 없을 것이나, 이후에 나오는 버전에서는 안 될 수도 있으니 그 때는 오라클 홈페이지에서 새로운 버전의 드라이버를 다운로드해 사용하길 바란다.
 
 
사용자 삽입 이미지

querygen이라는 context path로 deploy하면 위와 같이 입력하면 화면이 뜬다.

그리고 ,'커넥션정보 표시' 부분을 클릭하면 위와 같이 커넥션 정보가 나타난다.

여기서 IP, Port, SID, ID, Password 등을 입력하면 연결준비가 끝나는 것이다.

단, 이렇게 입력한 정보는 쿠키에 저장되니 다음에 접속해도 이전에 사용했던 정보가 나타난다. 혹시 ID, PW가 저장되지 않길 원한다면 쿠키 부분 코드를 지워서 사용하면 된다.
 

사용자 삽입 이미지


1. 테이블명 일부를 입력하고 '검색' 버튼을 클릭하거나, '전체테이블검색' 버튼을 클릭하면 아래쪽 프레임(②)에 테이블 및 테이블주석 리스트가 나타난다.

2. ②에서 테이블을 선택하고 '컬럼정보' 버튼을 클릭하면 오른쪽 아래와 같은 팝업창에 테이블에 관한 상세한 정보가 나타난다.

3. ②에서 테이블을 선택하고 'SQL 생성' 버튼을 클릭하면 오른쪽 프레임(⑤)에 해당 테이블의 CRUD 쿼리가 생성되어 나타난다.


필요에 따라 적당히 고쳐서 쓰시길...