반응형

*Jeus Remote Debugging 방법

1. JEUS에서 Remote Debugging을 수행하기 위해서 JEUS JVM의 WAS Port를 Open해야 한다.


2. WAS JVM의 Port를 Open하기 위해서는 JEUSMain.xml에 다음과 같은 설정을 추가해야 한다.

<engine-container>
            <name>container1</name>
            <command-option>-Xms1024m -Xmx1024m -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8888,suspend=n,server=y -server</command-option>
            <sequential-start>true</sequential-start>
   ......
   
3. 설정을 저장하고 JEUS를 구동하면 콘솔 로그에 Remote Debugging을 위한 8888 port가 Listening 하고 있다는 메시지를 확인할 수 있다.


4. Run > Dialog...(eclipse 3.2)/ Run > Open Debug Dialog...(eclipse 3.3)에서 Remote Java Application > Debug창에서 다음 그림과 같이 내용을 설정한 후 Debug 버튼 클릭한다.

사용자 삽입 이미지

5. Debug perspective 에서 정상적으로 연결되었는지 확인(정상 연결되었을 경우 Jeus Thread 리스트를 Debug View에서 볼 수 있다.)


6. 한번 실행 이후엔 Run History, Debug History에서 간단하게 실행이 가능하다.


7. Debugging할 파일에 Break Point 설정 후 Debugging 한다.

반응형
0. 지혜롭게 살자
많은 개발자가 전통적(?)인 방법인 System.out....로 디버깅을 많이 하고 있다. 물론 이것처럼 확실한 방법도 없지만 eclipse나 다른 IDE의 디버그 기능을 이용하면 훨씬 빨리 문제를 찾을 수 있다.
특히 WAS에 배포된 환경에서 이런 방법으로 하려면 확인하기 위한 System.out...을 고칠 때마다 배포해야 하는데 이건 너무 고통스러운 작업이다.

단위 테스트시 에러가 발생했을 때는 eclipse등을 이용해서 디버깅하기가 수월하다.
그러나 WAS에 배포된 후에 에러가 발생했을 때는 약간의 작업이 필요하다. WAS를 eclipse에 embeded한 플러그인을 이용하는 방법도 있지만 WAS와 이클립스를 따로 띄워 원격으로 버그를 찾는 방법을 정리한다.
이럴 경우 서버환경에서 돌아가는 자바 코드의 문제점도 쉽게 잡을 수 있다. (물론 절대! 운영서버에서 하면 안되겠지만)

여기서는 tomcat 6와 eclipse 3.3 그리고 java6 환경을 가정하고 설명한다. (그 하위 버전도 방법은 동일하다)

1. 문제지점 찾기
WAS에서 애플리케이션을 배포하고 돌려보니 에러가 발생하고 아래와 같은 예외스택을 출력했다.
java.lang.NullPointerException
  kr.nextree.common.nexuser.spi.jdbc.JDBCCredentialsSPI.authenticate(JDBCCredentialsSPI.java:32)
  kr.nextree.common.nexuser.impl.NexUserImpl.authenticate(NexUserImpl.java:13)
  kr.nextree.bcf.user.impl.UserServiceImpl.authenticate(UserServiceImpl.java:79)
  kr.nextree.bcf.ui.authentication.BcfAuthenticationProvider.authenticate(BcfAuthenticationProvider.java:26)
  org.acegisecurity.providers.ProviderManager.doAuthentication(ProviderManager.java:195)
  org.acegisecurity.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:43)
  ...

이걸보면 JDBCCredentialsSPI.java 소스의 32 라인에서 null 객체를 참조하여 뭔가를 했다는 것을 짐작할 수 있다. 그럼 그 소스를 볼까?

   conn = JDBCSPIEnv.getInstance().getDataSource().getConnection();
   ps = conn.prepareStatement(JDBCSPIEnv.getInstance().getAuthenticateSql());
   ps.setString(1, id);

   rs = ps.executeQuery();

   if (rs.next()) {
    return rs.getString(1).equals(NexUserEnv.getInstance().getPasswordEncoder().encode(password));
   }

아~ 한 줄에 많은 것들이 있네 ㅠㅠ. 이중 어떤 객체가 null 인지 알 수가 있나. 좀 고생하겠는데...

2. 디버깅을 걸자 (가장 중요)
다음과 같은 JVM 옵션을 사용하면 JVM을 기동할 때 디버그 모드로 기동되고 원격에서 그 디버그 세션으로 접속할 수 있다.

-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n

이는 8000 소켓으로 디버그 세션을 열어두겠다는 뜻이다.

내 경우 Tomcat을 사용하기에 다음과 같이 JAVA_OPTS의 환경변수에 저 옵션을 설정했다. Tomcat은 JAVA_OPTS 환경변수를 이용하여 JVM을 기동한다.

>set JAVA_OPTS=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n

>catalina.bat run

시작쯤에 다음과 같은 라인이 출력되면서 기동되면 성공한 것이다.

...
Using JRE_HOME:        C:\java\jdk1.6.0_01
Listening for transport dt_socket at address: 8000
...

각 WAS에 -Xdebug ... 옵션을 설정하는 것은 조금씩 다르다. 각 WAS의 shell 스크립트를 살펴보고 적당한 환경변수를 주거나 직접 java 실행하는 부분에서 저 옵션을 추가하면 된다.
참고로 Maven 2로 개발할 경우 mvn jetty:run으로 WAS를 띄울 경우가 있는데 이런 경우는 다음과 같은 환경변수를 설정하고 띄우면 된다.

set MAVEN_OPTS= -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n


3. JVM 디버깅 세션에 연결
이클립스에서 디버깅 세션을 열기 위해서는 다음 단계를 따라하면 된다. 물론 디버깅하기 위한 소스는 이클립스 프로젝트에 있다고 가정한다. 프로젝트를 선택한 상태에서 디버그를 시작하는 것을 있지 말라.

"Run > Open Debug Dialog..." 메뉴를 선택하면 아래와 같은 Debug 다이얼로그가 나타난다.

사용자 삽입 이미지
여기서 "Remote Java Application"을 선택하고 마우스 오른쪽 버튼을 클릭해 팝업 메뉴에서 "New"를 선택하면

사용자 삽입 이미지

위와 같이 새로운 디버그 연결을 위한 설정이 나타난다. 여기서 위와 같이 선택하고(Host와 Port는 변경할 수 있다. 위의 예에서 Port를 8000으로 설정했다.) "Debug 버튼"를 클릭한다.
그 후 "Debug" Perspective로 가면 (Window > Open Perspective를 통해 이동할 수 있음) 아래 그림과 같은 WAS의 쓰레드가 보이면 연결에 성공한 것이다.
사용자 삽입 이미지


3. Breakpoint 설정하기
이전 에러 스택을 통해 JDBCCredentialsSPI.java 소스의 32라인에서 무언가 null이라고 했다. 이 자바 소스를 열고 편집창 맨 앞에서 더블 클릭을 하거나 팝업 메뉴로 해당 라인에 breakpoint를 걸어두자.
사용자 삽입 이미지


4. 실행하고 상태 살펴보기(Inspect)
이제 에러가 난 부분을 실행하면 breakpoint에서 실행이 멈추고 대기할 것이다. 그럼 이제 어떤 부분이 null인지 살펴보자. Debug perspective에서 Variable 뷰에서 보면 rs는 nul로 나오지 않았다. 따라서 rs.getString(1) 부분이 null인지 살펴볼 것이다. 아래와 같이 rs.getString(1)을 선택하고 팝업메뉴로 "Inspect"를 선택한다.
사용자 삽입 이미지

그러면 위와 같이 현재의 rs.getStrng(1)을 평가하고 그 값을 보여준다. 이런 벌써 이 부분이 null인 것이 판명이 났다. 도대체 어떤 SQL을 실행했는데 첫번째 컬럼마저 null일까.

위의 소스에서 SQL 문장을 보려고 했다. 아 이것도 상수가 아니구나. 마찬가지 방법으로 inspect해서 SQL 문장을 확인한다. 소스 윗줄의 JDBCSPIEnv.getInstance().getAuthenticateSql()를 선택하여 살펴보았다. (팝업메뉴나 ctl+shift+i)
사용자 삽입 이미지

확인한 결과 실행한 SQL은 "select password from users where user_id = ?" 이고 넘어가는 파라메터는 "dykim"이었다.
DB의 테이블 내용을 살펴보니 dykim의 password 컬럼 값이 null 이었다.
사용자 삽입 이미지
아... rs.getString()이 null을 던질 수도 있는데... 단위 테스트하나 더 추가하고 고쳐야겠다.
반응형
이클립스 최신버전을 설치해 사용하다가 갑자기 아래와 같은 화면이 뜨면서 실행되지 않는다

사용자 삽입 이미지

eclipse.ini 파일을 열고 -vmargs 윗줄에
-vm
C:\Program Files\Java\jdk1.6.0_16\bin\javaw.exe     <== JDK 설치 경로

위 두 줄을 추가하고 실행해 보도록 하자 (위에 색칠된 부분은 자신의 환경에 맞게 경로설정 해야 한다.)

실행이 잘 되는지 확인하고.. 문제를 해결 했다면 리플을 하나 달도록 하자.^^ 
반응형

https://glassfishplugins.dev.java.net/eclipse33/

 

1. GlassFish V2를 받는다.

https://glassfish.dev.java.net/public/downloadsindex.html

(GlassFIsh 중 최근에 나온 안정버전)

 

2. Eclipse 3.3을 받는다.

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

 

3. GlassFIsh V2를 설치한다.

다운 받은 glassfish-installer-v2ur1-b09d-windows.jar 를 설치하려면
시스템에
자바가 설치되어 있어야 한다.

(JDK5 나 그 이상의 버전)

 

그리고 자바가 설치된 곳이 JAVA_HOME으로 설정되어 있어야 한다.

예) E:\java\jdk1.6.0_05\

 

실행에서 cmd로 콘솔을 띄운 후

jar파일이 있는 곳에서 다음을 실행한다.

java -Xmx256m -jar glassfish-installer-v2ur1-b09d-windows.jar 
cd glassfish
lib\ant\bin\ant -f setup-cluster.xml 
(다운 받은 GlassFish V2 UR1 버전이 Clustering 지원 버전일 때)
4. 이클립스 플러그인을 받는다.
다운 받은 이클립스는 압축을 풀면 설치가 끝난다.
자세한 그림과 영문으로 된 설명이 아래 주소에 있다.
https://glassfishplugins.dev.java.net/eclipse33/index.html
1) perspective를 "Java EE"로 바꾼다.
2) Server Tab에서 오른쪽 단추로 "New Server"마법사를 실행한다.
3) "Download addtional server adapters" 링크를 클릭한다.
4) GlassFish Java EE 5 Server를 선택한다.
5) License에 동의하고 GlassFish Adaptor를 받는다.
6) OK를 눌러 다운받는다.
7) 다 받은 후에 이클립스를 재시작한다.
8) 재시작후에 "New Server"마법사에서 GlassFish를 찾을 수 있다.
9) 자신의 원하는 GlassFIsh버전을 선택한다.
GlassFish V2를 선택해보겠다.
10) "Browse..." 버튼을 클릭해서 GlassFish가 설치된 곳을 정해준다.
11) 서버설정을 해 준다.
기본값은 다음과 같다. 나중에 자기가 원하는 값으로 바꿔준다.
Address : localhost
Server port Number : 8080
Admin Server Port Number : 4848
Domain Name : domain1
Administrator Id : admin
Administrator Password : adminadmin
12) new Server (GlassFish V2) 가 Servers 탭에 생겼다.
팝업메뉴에서 서버를 실행시킬 수 있다.
13) 서버를 실행하면 Started로 status가 바뀐다.
Console 탭에서 server log를 볼 수 있다.
14) 이제 Java EE5 Web Application을 만들어보자.
"Dynamic Web Project"를 만들자.
15) 프로젝트 이름을 쓰고,  Target runtime 을 GlassFish V2 Java EE 5로 정한다.
16) 다음단계에서 Web Application을 위한 Servelt 2.5(java EE 5 호환가능) 버전을 확인할 수 있다.
그리고 기본적으로 sun-web.xml을 배치 기술자로 사용하고 싶으면, 선택해라.(기본값이다)
17) 아주 간단한 index.jsp를 만들자.(이클립스에서 기본적으로 만들어주지 않는다.)
18) "Run on Server"를 클릭하면 Web Application이 deploy된다.
그리고 index.jsp 페이지를 브라우저에서 볼 수 있다.
 
만약 다음과 같은 에러가 난다면 eclipse plug-in을 업데이트 해야한다.
--------------------------------------------------------------------------------------------
Publishing to GlassFish V2...(Time of error: March 2, 2008 7:19:57 AM EST)
Reason:
java.lang.NullPointerException.
--------------------------------------------------------------------------------------------
관련 Forum
http://forums.java.net/jive/thread.jspa?messageID=265331&tstart=0
https://bugs.eclipse.org/bugs/show_bug.cgi?id=219627
wst 2.0.2 플러그인이 문제가 있다고 한다.
[Software Updates]-[Find and Install] - [Search for Updates of the currently installed features]
에서 업데이트 하면 자연스럽게 문제가 해결된다.
[출처] 이클립스 3.3으로 GlassFIsh 구동하기|작성자 노키
반응형

Jad Decompiler 사용법

Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
Copyright 2000 Pavel Kouznetsov (kpdus@yahoo.com). 


[ 사용방법 ]


1. 클래스 하나만 디컴파일시

           example1.class   를 디컴파일시 

           jad.exe 를 디컴파일할 파일과 동일한 폴더에 놓는다.

         

           Command 창에   jad -o -sjava example1.class   

       

   결과물 : 'example1.java' 

   

2. Package 를 디컴파일시   

         tree  폴더 아래의 모든 클래스파일을 디컴파일시 

         폴더와 같은 폴더에 jad.exe  를 위치하고


          Command 창에    jad -o -r -sjava -dsrc tree/**/*.class 

          

          결과물 : 폴더내에 [src] 폴더가 생성된다. 

=============================================================================================================

윈도우버전(for Windows 9x/NT/2000 on Intel platform)


jad -r -d .\src -s java .\ifxjdbc\**\*.class


참고 : jad -r [-d<directory_for_sources>] [<other_options>] <directory_with_classes>**/*.class



설명 :


-r : 해당 패키지 형태로 디렉토리 구조를 만듬( restore package directory structure)

-d : 디컴파일될 디렉토리(-d <dir> - directory for output files)

 -s java : 디컴파일된 파일의 확장자를 java로 하라


.\ifxjdbc\**\*.class : ifxjdbc 디렉토리 아래의 모든 클래스들 지정



-----------------------------------------------------------------------------------------


이클립스 디컴파일러인 JAD를 설치하는 방법입니다.


이클립스로 개발을하다보면 F3버튼으로 열심히 따라가는 경우가생깁니다.


그러다 라이브러리로 묶여있는 클래스파일들을 로딩하게되면 읽긴읽되 내용을 분석하지못하죠~


그래서 디컴파일러 ~ 컴파일한클래스파일을 다시 자바파일로 보여주는 도구를 설치하게되면


클래스파일도 자바파일처럼 열수있게됩니다^^~



우선 jad.exe, jadclipse_3.1.0.jar를 다운로드 합니다.


jad.exe파일은 이클립스 폴더에 jadclipse_3.1.0.jar파일은 플러그인 폴더에 카피합니다.


window->preference->general->editors->file assosiationsd에서 *.class선택후


하단의 JadClipse Class File Viewr 를 선택후 default 를 선택합니다.


window->preference->java->JadClipse를 선택한후 ignore existing source를 체크해줍니다.


이렇게하시고 이클립스를 실행시키시면 *.class파일을 찾아갈경우 자동으로 디컴파일해줍니다~

http://sourceforge.net/projects/jadclipse



반응형

Mocha - http://www.brouhaha.com/~eric/computers/mocha.html 
Hanpeter van Vliet's first Java Decompiler. Orphaned at Java 1.02, so crashes on inner classes. [Freeware]

WingDis 2.15 - http://www.wingsoft.com/wingdis.shtml 
Command line Java decompiler. [Commercial]

SourceAgain - http://www.ahpah.com/product.html 
Java Decompiler for Win95/NT, Unix, web-based trial version from Ahpah Software. [Commercial]

Jad - http://www.geocities.com/SiliconValley/Bridge/8617/jad.html 
the fast Java decompiler. Separate versions for Win32, OS/2, most Unixen. [Freeware].

SourceTec Java decompiler - http://www.srctec.com/decompiler.htm 
Patch to Mocha which defeats Crema. [Shareware]

NMI's Java Code Viewer - http://njcv.htmlplanet.com 
The "user-friendly, visual" Java decompiler and disassembler for Win32 platform. [Shareware]

Java Code Engineering - http://www.meurrens.org/ip-Links/Java/codeEngineering/ 
Marc Meurrens' page on engineering & reverse engineering Java class files. Review of books and on line resources on: the Java Virtual Marchine (JVM); code engineering & reverse engineering; class browsers, viewers & editors; assemblers; compilers; disassemblers & decompilers; obfuscators & unobfuscators. Comprehensive, well organized site.

Decafe Pro - http://decafe.hypermart.net/ 
Java Decompiler for Win32 platform. [Commercial]

 Kimera - http://kimera.cs.washington.edu/disassembler.html 
Online Java Disassembler. Just enter an URL of a .class file and it will be disassembled into a form suitable for re-assembly by Jasmin. [Freeware] 

Dumping Class Files - http://professionals.com/~cmcmanis/java/dump/index.html 
Chuck McManis's code to parse class files. [Free for non-commercial].

ClassCracker - http://www.pcug.org.au/~mayon/ 
Visual Java decompiler from Mayon Software Research. [Commercial]

Java Optimize and Decompile Environment (JODE) - http://jode.sourceforge.net/ 
Java decompiler with full source code. Supports inner/anonymous classes. Also contains a small, but extensible bytecode obfuscator/optimizer. [Open Source, GPL]

CafeBabe - http://jfa.javalobby.org/projects/CafeBabe.html 
Graphical disassembler and editor of Java bytecodes. Part of the JFA. [Open Source]

RIIS: Decompiling Java - http://www.riis.com/depile.html 
Godfrey Nolan's book on writing your own Java decompiler may never be published, so early chapters are online in PDF format.

dis - http://www.cs.princeton.edu/~benjasik/dis/index.html 
A functional, fast and simple disassembler that is written in C. Like javap, produces bytecode. Download Solaris, Win95/NT versions. Mac or other Unixen or source code by email request. [Freeware]

BackToJava (BTJ) - http://www.backtojava.org/ 
General tool for manipulation of Java bytecode (disassembly, assembly, statistics, decompilation, debug information...), written in Java. In progress. [Open Source, LPGL]

JReveal.Org - http://www.jreveal.org 
Online decompiler and obfuscator. Also has a resource directory. [Freeware]

IceBreaker - http://www.suddendischarge.com/cgi-bin/antileech.cgi?icebreak10.zip 
(Zip-file) A 'Visual' Java decompiler/disassembler. Allows side-by-side comparison of disassembled byte code from class files, for easier decompilation. "Replete with bugs" and dependent on command-line decompiler, such as Mocha or Javap. [Freeware] 

반응형

1. WTP 구하기
http://www.eclipse.org/webtools/

2. WTP 선택
최신 jdk를 사용하다면 1번에 나온 download페이지를 이용하면 될것이고
만약 jdk1.4를 이용한다면 구버전이 들어있는 download를 이용하면 된다.

사용자 삽입 이미지

WTP 다운로드 페이지


압축만 풀면 바로 eclipse에 WTP가 적용된  wtp-all-in-one 파일을 다운로드 받아서 사용하길 권장한다. 아니면 수동으로 WTP가 필요한 기타등등의 plugin 파일을 설치해야된다.

3. WTP 기능 활용하기.
글쓴이는 dynamic web project만 사용한다. 나머지도 많은데 차차알게되면 써볼것이다.
준비물: jdk 1.4.x
           tomcat 5.5(1.4버전 사용가능한것)
           wtp-all-in-one-sdk-R-1.5.5-200708291442-win32.zip

이클립스 실행
메뉴에서
file -> new -> project -> web -> dynamic web project -> NEXT 클릭
-> Project Name을 넣고 -> New 버튼 클릭
사용자 삽입 이미지

- 톰켓서버 잡아주기.
Apache 트리를 열어 5.5 버전을 선택한다. Next 클릭
사용자 삽입 이미지

톰켓서버 잡아주기


- 톰켓이 설치된 경로를 잡아주고, JRE 선택.
본인이 원하는 jre 선택한다. 1.4대를 사용하고자 하니 default말고 명확하게 1.4버전을 선택하자.
사용자 삽입 이미지

톰켓경로설정, JRE선택


그리고 Finish 클릭 -> Finish 또 클릭 하면 J2EE Perspective 화면 이동 하겠냐고 물어보는 NO를 하고 Java Perspective 화면을 이용한다.

사용자 삽입 이미지

Dynamic Web Project 완성

왼쪽에보면 JRE도 보이고 톰켓 관련 라이브러들도 연결된게 보일것이다.
EAR, Web App Libraries는 아무것도 들어있지않다. 자세한 사항은 J2EE 공부를해야할꺼 같다.
src 폴더는 java 파일이 위치하고 build폴더에 class들이 쌓인다.
WebContents 폴더는 jsp 파일이 위치할 것이다.
WebContents 폴더에 우클릭 -> New -> Other -> Web -> JSP 파일을 선택 Next
file name을  적고 finish 클릭.
<body></body> 테그 사이에 Hello World! 적고 저장한다.

그럼 이제 실행을 해보자 톰켓을 이용해 jsp를 브라우저에서 봐야된다.
메뉴 -> Run -> Run on Server 클릭.
톰켓 5.5환경으로 세팅이 되었는지 확인하고 Next 클릭.

사용자 삽입 이미지

Run on Server


아래 마지막으로 우측에 프로젝트가 존재하는지 확인하고 Finish 클릭.
사용자 삽입 이미지

그럼 브라우저에 Hello World! 가 나타나는것을 확인할 수 있다.
eclipse 안에서 브라우저가 나타날땐 메뉴 -> Windows -> Web Browser -> Default System Web Browser 를 선택하면 된다.
사용자 삽입 이미지


* 디버그 활용하기 *
System.out.println(); 으로 디버깅도 하지만 더 편하게 할 수 있는 방법이 있다.
Run on Server 말고 Debug on Server를 이용하는것이다.

먼저 간단한 debug를 위해 사전에 준비해야 할 작업이 있다. 아래 그림처림
1. test 페키지를 생성하고 첨부된 TEST.java 파일을 넣는다.
2. WebContent 밑에 첨부된 debug.jsp 파일을 넣는다.
사용자 삽입 이미지

debug 연습



3. BreakPoint 찍기
프로그램은 간단하다 10번 카운트 세면서 10번째에 발사! 하는 프로그램이다.
값이 어떻게 변화하는지 debug 를 이용해서 추적할 수 있다면 기초적인 디버그는 완료.
참고로 jsp debug는 톰켓 5.x 이상부터 지원된다고 한다. 4.1 대로 jsp debug를 시도했으나 실패하고 5.5를 설치하고 나서 jsp 디버깅에 성공하였다. (JSP 디버깅은 5.5를 이용하자)

본격적으로 디버깅을 해보자.
디버깅을 하는 이유는 우리가 원하는 값을 변수가 제대로 가지고 있는지 맞게 변화하는지 예외는 어떤 시점에서 발생하는지에 대한 수정을 좀더 쉽고 빠르게 접근하기 위함이다.

다음은 cnt 값의 변화를 살펴보기 위해 BreakPoint를 찍는 화면이다. 찍는 방법은 화면에 표시된 위치 즉 cnt += 1; 구문이 있는 라인에 빨간박스 안을 더블 클릭 하는 방법이다. 그럼 포인트가 찍히게 된다.
사용자 삽입 이미지

BreakPoint


다음은 서버를 디버그 모드로 실행 시키는 것이다.
메뉴 -> Run -> Debug As -> Debug on Server 클릭.
서브창에서 Finish 클릭. 브라우저가 실행되며 이클립스에서 디버그 모드 전환을 물어보는 메시지 박스가 나타나며 Ok 눌러서 디버그 모드로 전환한다.
사용자 삽입 이미지

디버그 모드 전환


화면 우측 상단에 Variables 텝을 보면 cnt 값이 0으로 들어있는게 확인이된다.
하단의 jsp 에디터에는 아까 찍어놓은 BreakPoint에 화살표가 되어있는게 보인다.
마지막으로 브라우저를 살펴보면 연결중 상태로 응답을 기다리는 상태가된다.

위의 화면에서 F6 키를 눌러보도록 하자 그럼 jsp 에디터에서 화살표가 아래로 한줄 내려온다. 그리고 Variables 탭을 살펴보면 값이 1증가되어 Value는 1이 되어 있는게 확인된다.

cnt 값이 10 될때까지 F6을 여러번 눌러면서 cnt 값의 변화와 jsp 에디터에서 화살표의 이동을 살펴보도록 하자. 아래와 같은 화면이 나오면 jsp페이지에서 처리해야할 작업들은 완료되고 서버로 브라우저에서 오는 요청에 대한 응답을 하기위한 작업이라 보면되겠다.
화면 상단의 Resume 버튼을 눌러 프로세스를 진행시킨다.
사용자 삽입 이미지
마지막으로 브라우저를 살펴보면 세상아 안녕! 이란 글자가 나타날 것이다.

지금까지 디버깅의 가장 기초적인 기능을 해봤다고 생각한다. 다른 기능들은 여기저기 BreakPoint를 찍어가며 (java 소스에도 물론) 값이 어떻게 변화하는지 확인해보기 바란다.


반응형

애플(Apple)의 아이폰(iPhone) 플랫폼은 개발자들에게 흥미로운 기회를 제공하고 있다. 소형 데스크톱과 터치스크린으로 아이폰과 아이팟 터치(iPod Touch)는 짧은 기간에 100만 명이 넘는 사용자들을 가지게 되었다. 하지만 이런 고품격 디자인과 사유화된(proprietary) 플랫폼은 애플리케이션 개발자들에게 새로운 종류의 도전을 만들어 내고 있다. 애플이 소프트웨어 개발 키트(SDK)를 배포할 때까지는, 아이폰 플랫폼을 목표로 하는 개발자들은 아이폰의 룩앤필(look and feel)을 따르는 웹 애플리케이션을 만들어야만 한다.

운이 좋게도 그 일을 쉽게 할 수 있는 새로운 오픈 소스 도구들을 사용할 수 있다. Aptana의 이클립스용 아이폰 개발 플러그인은 아이폰에 특화된 프로젝트를 생성하고 회전시켜 볼 수 있는 미리 보기 화면을 제공한다. Joe Hewitt의 iUi는 CSS와 자바스크립트 프레임워크인데 아이폰 스타일의 위젯과 페이지를 가지고 있다.

본 기사에서는, Apatana와 iUi를 사용해 새로운 애플리케이션을 만들 것이다. 바로 아이폰에서 사용할 수 있는 간단한 자바독(Javadoc) 뷰어다. 먼저 아이폰에서 자바독을 브라우징할 수 있는 사용자 인터페이스(UI)를 만들겠다. 그런 다음 소스 코드에서 자바독 페이지를 만들어 내는 커스텀 doclet을 만든다. 그 뒤를 이어 아이폰을 목표로 했을 때 생기는 UI 문제를 살펴보고 이 오픈 소스 도구들을 사용해 개발과 디버깅을 간단하게 할 수 있는지, 그리고 앞으로의 아이폰 개발 방향에 대해 설명하겠다.

도구 빠르게 살펴보기

Aptana를 설치하고 iUi를 다운로드하는 것부터 시작한다.

  1. 이클립스 V3.2에서 다음을 선택한다. Help > Software Updates > Find and Install.
  2. Search for new features to install을 선택한다. 이 창에서는 여러분이 다운로드한 플러그인과 이클립스가 미리 정의해둔 플러그인 사이트의 목록을 보여준다.
  3. New Remote Site를 클릭해 Aptana를 추가하고 URL을 다음과 같이 설정한다. http://update.aptana.com/update/3.2/.
  4. 목록에서 새로 추가한 Aptana를 선택하고 Next를 클릭해 이용할 수 있는 모든 기능을 선택한다. 창을 닫고 기본 Aptana 편집기로 돌아온다.
  5. 이클립스를 재시작한다.
  6. Window > Open Perspective > Other를 선택하고 Aptana를 창에서 클릭한다. 툴바에 새로운 아이콘이 나타날 것이다.
  7. Home 아이콘을 클릭한다. Aptana 기능에 대한 소개 페이지가 보일 것이다.
  8. Apple iPhone Development에서 Download and Install을 선택한다.
  9. 기능들을 설치하고, 창을 닫고 아이폰에 특화된 기능들을 Aptana에 설정한다.
  10. 이클립스를 다시 시작한다.
  11. 최신 버전의 iUi를 다운로드한다(참고자료 참조).

모든 준비가 끝났다면, 이클립스를 사용해 그림 1에 보이는 것처럼 iDoc이라는 새로운 아이폰 프로젝트를 생성한다.


그림 1. 새로운 아이폰 프로젝트 만들기
새 아이폰 프로젝트 만들기

그림 2는 간단한 아이폰 애플리케이션을 담고 있는 프로젝트를 보여준다.


그림 2. 이클립스에 생성된 아이폰 프로젝트
이클립스에 생성된 아이폰 프로젝트

HTML, CSS, 그리고 자바스크립트를 지원하는 Aptana의 기본 편집기가 제공하는 문법 하이라이팅을 확인할 수 있다.

아이폰 미리보기 모드와 애플리케이션 서버

텍스트 편집기 아래 부분에 Source, iPhone Preview, 그리고 시스템에 설치된 각종 브라우저(예를 들어 Safari Preview, Firefox Preview) 탭들을 볼 수 있다. iPhone Preview를 클릭하여 아이폰에서 보이는 샘플 애플리케이션을 보자. 폰을 돌리려면 브라우저의 바깥을 클릭하고, 네비게이션 막대를 숨기려면 폰 제목을 클릭하라. 가로로 보는 아이폰 미리보기 모드는 아래와 같다.


그림 3. 아이폰 미리보기 모드에서 가로 보기
아이폰 미리보기 모드에서 가로 보기

아이폰 미리보기 모드는 시간을 매우 많이 절약할 수 있게 하는 장치다. 새로운 디자인 아이디어를 빠르게 테스트할 수 있고 컴퓨터에서 벗어나지 않고도 점진적으로 개발할 수 있다. 애플리케이션을 실제 아이폰에서 테스트해야 할 때가 오면, Aptana에 내장된 애플리케이션 서버가 매우 유용할 것이다. 이클립스 툴바에 있는 Run 아이콘을 클릭하여 서버를 실행한다. 그림 4는 이클립스에서 동작하는 애플리케이션 서버를 보여준다.


그림 4. Aptana의 아이폰 애플리케이션 서버가 페이지를 호스트하고 그 URL을 가지고 있는 email을 생성한다.
Aptana의 아이폰 애플리케이션 서버가 페이지를 호스트하고 그 URL을 가지고 있는 email을 생성한다.

만약 아이폰이 와이파이(WiFi) 연결을 통해 로컬 네트워크에 연결되어 있다면, 서버 창에 보이는 URL에 접속할 수 있다. E-mail this url을 클릭하여 한 단계를 생략하고 여러분 아이폰에 있는 이메일 계정으로 메시지를 보낼 수 있다. 이메일에 있는 링크를 탭(화면을 툭 치는 것)하면, 아이폰의 웹 브라우저에서 애플리케이션을 실행한다.

iUi 데모: 극장 목록 웹 애플리케이션

Aptana의 기본 애플리케이션이 아이폰에 특화된 HTML과 CSS를 포함하고 있더라도 그 기능은 매우 제한적이다. 좀 더 나은 대안책은 iUi 프레임워크다. iUi는 다양한 아이폰 인터페이스 스타일의 커스텀 위젯과 자바스크립트 효과를 가지고 있다.

다운로드한 iUi 파일 iui-0.13.tar의 압축을 풀고, 파일을 이클립스에 있는 iDoc 프로젝트로 복사한다. 그림 5는 iUi를 가지고 있는 프로젝트를 보여준다.


그림 5. iUi 프레임워크와 예제 프로젝트가 들어 있는 iDoc 프로젝트
iUi 프레임워크와 예제 프로젝트가 들어 있는 iDoc 프로젝트

iUi를 사용한 데모 웹 애플리케이션은 위에서 펼쳐진 샘플 폴더에서 찾을 수 있다. 음악 브라우저, 극장 목록 그리고 Digg와 비슷한 사이트를 포함하고 있다. Aptana의 아이폰 미리보기 모드를 사용해 이클립스에서 그것들을 확인할 수 있다. 그림 6은 극장 목록 웹 애플리케이션(samples/theaters/index.html)의 검색 페이지를 보여준다.


그림 6. iUi의 예제 극장 목록 웹 애플리케이션
iUi의 예제 극장 목록 웹 애플리케이션

진짜 아이폰의 룩앤필과 얼마나 비슷한지 보기 바란다. 이렇게 미리 만들어둔 위젯은 아이폰 웹 애플리케이션을 빠르게 개발할 수 있도록 해준다.




위로


UI 디자인하기

이번 예제에서는 iDoc이라는 자바독 뷰어를 만들 것이다. 썬(Sun Microsystems)의 표준 자바독 생성기에 의해 만들어진 방대한 양의 HTML 문서들을 데스크톱에서는 잘 볼 수 있다. 하지만 아이폰에서 읽고 네비게이션하기에는 불편하다. iDoc은 아이폰에 적합한 자바독을 생성한다. — 지하철이나 짝 프로그래밍 팀에서 관찰자가 도움을 줄 수 있도록 하기에 완벽한 브라우징 애플리케이션 프로그램 인터페이스(API)를 제공할 것이다.

아이폰 휴먼 인터페이스 가이드라인

iDoc에 필요한 UI를 디자인하기 전에 아이폰 개발과 일반적인 웹 애플리케이션의 다른 점을 이해하는 것이 중요하다. 애플의 iPhone Dev Center(참고자료 참조)에서 인용한 그림 7을 보면 이를 매우 멋지게 요약했다. 손가락은 마우스가 아니다. 데스크톱에서 볼 수 있는 픽셀 선택을 없애고 그 대신 탭(툭 치는 것), 플릭(화면을 가볍고 빠르게 휙 스치는 모션) 그리고 핀치(두 손가락으로 화면을 꼬집는 듯한 모션)와 같은 풍부한 사용자 상호작용 모델을 사용했다. 게다가 아이폰은 사용자가 들고 다니면서 시급한 상황에서 자주 쓰기 때문에 애플리케이션에서 원하는 정보를 빠르고 쉽게 제공할 필요가 있다.


그림 7. 손가락은 마우스가 아니다.
손가락은 마우스가 아니다.

애플의 iPhone Human Interface Guidelines(참고자료 참조)는 아이폰 웹 컨텐츠의 세 가지 타입을 정의하고 있다.

아이폰에 있는 사파리(Safari)와 호환
비록 페이지의 일부분이 어도비 플래시(Adobe Flash)나 Java™ 애플릿처럼 지원되지 않는 플러그인에 의존하더라도 정확하게 보여줄 수 있는 모든 타입의 웹 페이지
아이폰에 있는 사파리에 최적화
아이폰에 맞게 내용의 크기를 조정했으며, 지원되지 않는 플러그인에 의존하지 않는 웹 페이지
아이폰 애플리케이션
웹 페이지가 아이폰의 룩앤필을 따르는 애플리케이션처럼 보이고, 가능하다면 전화, 이메일, 구글맵과 같은 아이폰의 서비스와 연동된다.

표준 자바독 페이지는 첫 번째 범주에 해당된다. 아이폰에 있는 사파리와 호환되는 형태다. 정확하게 보이긴 하지만 관련된 정보를 찾으려면 핀칭과 플릭을 매우 잘 해야 한다. iDoc은 완전한 아이폰 애플리케이션을 목표로 하고 있다. 비록 다른 서비스와 연동할 일은 없지만 iDoc의 인터페이스는 마치 아이폰 애플리케이션처럼 느껴질 것이다.

iDoc UI

아이폰을 목표로 할 때는 포커스를 유지하는 것이 중요하다. 애플리케이션은 특정 작업을 빠르게 수행해야 한다. 모든 가용한 기능을 포함시키려고 하면 안 된다. iDoc에서 사용자들은 클래스 이름, 메서드 이름, 메서드 시그너처 그리고 주석 등과 같은 자바 클래스에 대한 기본 정보를 찾아내야 한다. 이런 정보를 목적지인 구체적인 페이지로 안내하는 세 개로 나눈 네비게이션을 통해 제공할 것이다.

패키지 네비게이션
최상위 패키지
클래스 네비게이션
패키지 안에 있는 클래스, 인터페이스, 예외와 에러
자세한 클래스 네비게이션
클래스 안에 있는 설명, 필드, 상수, 그리고 메서드
세부 페이지
주석, 시그너처 그리고 매개변수

iDoc을 산만하지 않고 태스크에 집중된 상태로 유지하기 위해 기존의 자바독 기능을 몇 가지 제거했다. 예를 들어 패지키 설명 주석은 보여주지 않는다. 이것들은 대개 정보가 유익하지 않거나(예를 들어 acme.client에는 클라이언트 코드가 들어 있다.) 보통 존재하지 않으므로 그것들을 iDoc에서 빼고 인터페이스를 간단하게 만드는 것이 더 나은 선택이다.

세 부분으로 나눈 네비게이션을 위해 edge-to-edge 리스트를 사용한다. 이것은 전형적인 아이폰 애플리케이션에 익숙한 구조로 연락처, 이메일 그리고 음악을 브라우징할 때 사용된다. Edge-to-edge 리스트는 아이템을 44픽셀 높이의 같은 크기로 보여준다. 그리고 많은 양의 정보를 스크롤할 때 유용하다. 애플의 iPhone Human Interface Guidelines는 글꼴, 글자 크기 그리고 경계선 공간 수치를 제공한다. iUi 프레임워크는 CSS와 자바스크립트 언어로 이러한 수치에 맞게 구현해두었다. 따라서 아이폰 컴포넌트처럼 보이는 HTML 목록을 간단하게 만들 수 있다.

Listing 1은 페이지 헤더와 java.applet과 java.rmi 패키지의 첫 번째 2단계 네비게이션을 보여준다.


Listing 1. 페이지 헤더와 첫 번째 2단계 네비게이션 HTML 문서
                
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>iDoc</title>
<meta name="viewport" content="width=320; initial-scale=1.0;
   maximum-scale=1.0;
   user-scalable=0;"/>
<style type="text/css" media="screen">@import
   "iui/iui.css";</style>
<style type="text/css" media="screen">@import
   "iDoc.css";</style>
<script type="application/x-javascript"
   src="iui/iui.js"></script>
</head>

<body onclick="console.log('Hello', event.target);">
   <div class="toolbar">
     <h1 id="pageTitle"></h1>
     <a id="backButton" class="button"
        href="#"></a>
   </div>
  <ul id="home" title="Packages" selected="true">
      <li><a href="#java.applet">java.applet</a></li>
      <!-- more packages...-->
      <li><a href="#java.rmi">java.rmi</a></li>
  </ul>
  <ul id="java.applet" title="java.applet">
      <li class="group">Interfaces</li>
      <li><a href="java.applet.AppletContext.html">
         AppletContext</a></li>
      <li><a href="java.applet.AppletStub.html">
         AppletStub</a></li>
      <li><a href="java.applet.AudioClip.html">
         AudioClip</a></li>
      <li class="group">Classes</li>
      <li><a href="java.applet.Applet.html">Applet
         </a></li>
      <li><a href="java.applet.Applet.AccessibleApplet.html">
         AccessibleApplet</a></li>
  </ul>
  <ul id="java.rmi" title="java.rmi">
      <li class="group">Interfaces</li>
      <li><a href="java.rmi.Remote.html">
         Remote</a></li>
      <li class="group">Classes</li>
      <li><a href="java.rmi.MarshalledObject.html">
         MarshalledObject</a></li>
      <li><a href="java.rmi.Naming.html">
         Naming</a></li>
      <li><a href="java.rmi.RMISecurityManager.html">
         RMISecurityManager</a></li>
      <li class="group">Exceptions</li>
      <li><a href="java.rmi.AccessException.html">
         AccessException</a></li>
      <li><a href="java.rmi.AlreadyBoundException.html">
         AlreadyBoundException</a></li>
      <li><a href="java.rmi.ConnectException.html">
         ConnectException</a></li>
      <li><a href="java.rmi.ConnectIOException.html">
         ConnectIOException</a></li>
      <li><a href="java.rmi.MarshalException.html">
         MarshalException</a></li>
      <li><a href="java.rmi.NoSuchObjectException.html">
         NoSuchObjectException</a></li>
      <li><a href="java.rmi.NotBoundException.html">
         NotBoundException</a></li>
      <li><a href="java.rmi.RemoteException.html">
         RemoteException</a></li>
      <li><a href="java.rmi.RMISecurityException.html">
         RMISecurityException</a></li>
      <li><a href="java.rmi.ServerError.html">
         ServerError</a></li>
      <li><a href="java.rmi.ServerException.html">
         ServerException</a></li>
      <li><a href="java.rmi.ServerRuntimeException.html">
         ServerRuntimeException</a></li>
      <li><a href="java.rmi.StubNotFoundException.html">
         StubNotFoundException</a></li>
      <li><a href="java.rmi.UnexpectedException.html">
         UnexpectedException</a></li>
      <li><a href="java.rmi.UnknownHostException.html">
         UnknownHostException</a></li>
      <li><a href="java.rmi.UnmarshalException.html">
         UnmarshalException</a></li>
  </ul>
				

그림 8은 edge-to-edge 리스트를 사용하여 패키지를 선택할 수 있는 최상위 레벨 네비게이션을 보여준다.


그림 8. 진짜 아이폰 애플리케이션처럼 자바독 패지키 네비게이션하기
진짜 아이폰 애플리케이션처럼 자바독 패지키 네비게이션하기

그림 9는 아이폰 미리보기 모드로 java.rmi 패지키의 결과를 보여준다.


그림 9. Java.rmi 패키지에 있는 인터페이스, 클래스, 예외 네비게이션하기
Java.rmi 패키지에 있는 인터페이스, 클래스, 예외 네비게이션하기

iDoc의 세부 페이지에서는 아이폰의 또 다른 구조를 사용한다. 바로 둥근 사각형 리스트다. 이 리스트는 정보를 그룹핑할 때 유용한데 아이폰의 설정 창에서 볼 수 있다. 둥근 사각형 리스트를 사용해 메서드 시그너처와 매개변수 목록 그리고 예외를 구분할 것이다. V0.13에서 iUi는 둥근 사각형 리스트를 오직 폼 입력 용도로만 사용하도록 지원하고 있다. 따라서 정적인 텍스트를 출력할 때 이들 엘리먼트를 그냥 사용하면 틀에 맞지 않은 블록을 만들어 낸다. 그것들의 CSS를 확장하여 (Listing 2에 보이는) iDoc.css 파일을 만들고 정적인 텍스트를 둥근 사각형 리스트로 보여줄 textRow 엘리먼트를 추가한다.


Listing 2. 정적인 텍스트를 정확하게 보여주기 위한 커스텀 textRow CSS 확장
                
/* Adding a new row CSS style to iUi for displaying blocks of text */
.textRow  {
    position: relative;
    border-bottom: 1px solid #999999;
    -webkit-border-radius: 0;
    text-align: right;
}

.textRow > p {
    text-align: left;
    margin: 5px 8px 5px 10px;
    padding: 0px 0px 0px 0px;
}


fieldset > .textRow:last-child {
    border-bottom: none !important;
}
				

Listing 3은 java.math.BigDecimal의 생성자 중 하나를 보여준다.


Listing 3. textRow 엘리먼트를 사용한 세부 페이지 HTML
                
<div id="java.math.BigDecimal(long,java.math.MathContext)" title="BigDecimal"
        class="panel">
    <fieldset>
        <div class="textRow"><p><b>
           public BigDecimal(long, MathContext)</b></p></div>
        <div class="textRow"><p>Translates a
           <code>long</code> into a
        <code>BigDecimal</code>,with rounding according to the contextsettings.
        The scale of the <code>BigDecimal</code>, before any rounding,is zero.
      </p></div>
    </fieldset>
    <h2>Parameters</h2>
    <fieldset>
        <div class="textRow"><p><b>long val
           </b>: <code>long</code> value to be converted
         to <code>BigDecimal</code>.</p></div>
        <div class="textRow"><p><b>MathContext mc
           </b>: the context to use.</p></div>
    </fieldset>
    <h2>Throws</h2>
    <fieldset>
        <div class="textRow"><p><b>ArithmeticException
           </b>: if the result is inexact but
    the rounding mode is <code>UNNECESSARY</code>.</p></div>
    </fieldset>
</div>
				

<fieldset> 태그에 있는 모든 것들이 textRow <div>를 사용해 둥근 사각형 안으로 들어갔다. <h2> 헤드 태그는 목록 위에서 그룹 제목을 보여준다. 그림 10은 결과 페이지를 보여준다.


그림 10. java.math.BigDecimal의 생성자 자세히 보기 화면
java.math.BigDecimal의 생성자 자세히 보기 화면

3단계 네비게이션과 세부 페이지 UI를 모두 끝냈다. iDoc은 사용자들이 특정 작업에 집중할 수 있게 해준다. iUi 프레임워크의 도움과 약간의 커스텀 CSS를 사용해 마치 진짜 아이폰 애플리케이션처럼 보이게 만들었다.





iDoc 개발하기

자, UI 디자인을 만들었고 이제 HTML 파일을 생성하는 코드를 만들어야 한다. 썬의 javadoc 명령어를 끼워 넣은 간단한 Doclet를 만들어보자. 이 예제는 자바 표준 java.* 패키지를 사용하지만 iDoc은 어떤 소스 코드로부터든지 자바독을 생성할 수 있다. OpenJDK(참고자료 참조)라, 공개적으로 사용 가능하며 GPL V2 라이선스를 사용하는 소스 코드를 사용해 자바독을 만들고 배포할 수 있다.

iDoc은 간단하게 패키지와 클래스를 순회하며 위에서 만든 형식대로 정적인 HTML 페이지를 출력하기 위한 메서드를 호출한다. Listing 4는 최종 세부 페이지를 출력하기 위한 메서드다.


Listing 4. 세부 페이지를 출력하기 위한 Doclet 코드
                
private void printDetail(PrintStream p, ProgramElementDoc doc,
    String id, String name) {
    divHeader(p, id, name, "panel");
    textHeader(p, null);
    textRow(p, getSignature(doc));
    textRow(p, getCommentText(doc.commentText()));
    textFooter(p);
    if (doc instanceof ExecutableMemberDoc) {
        printMethodDetail(p, (ExecutableMemberDoc) doc);
    }
    divFooter(p);
}

private void printMethodDetail(PrintStream p, ExecutableMemberDoc field) {
    if (field.parameters().length > 0) {
        textHeader(p, "Parameters");
        for (int i=0; i<field.paramTags().length; i++) {
            textRow(p, "<b>" + field.parameters()[i].typeName() + " "
                    + field.paramTags()[i].parameterName()
                    + "</b>: "
            + getCommentText(field.paramTags()[i].parameterComment()));
        }
        textFooter(p);
    }
    if (field.throwsTags().length > 0) {
        textHeader(p, "Throws");
        for (int i=0; i<field.throwsTags().length; i++) {
            textRow(p, "<b>" +  field.throwsTags()[i].exceptionName()
                    + "</b>: "
            + getCommentText(field.throwsTags()[i].exceptionComment()));
        }
        textFooter(p);
    }
}
				

이 코드는 일반화된 메서드인데 printDetail()는 클래스 설명, 필드, 생성자 그리고 메서드를 출력한다. 나머지 두 개의 타입은 ExecutableMemberDoc의 서브 클래스로 그것들의 매개변수와 던지는 예외에 대한 정보를 추가로 출력한다.

성능 이슈

GZIP 압축

간단하지만 효율적인 성능 팁을 소개하겠다. 바로 웹 서버에서 GZIP 압축을 가능케 하는 것이다. 현재 쓰이는 웹 서버는 대부분 이 옵션을 제공하며, 이를 사용하는 클라이언트로 보내기 전에 페이지를 압축한다. 아이폰의 사파리도 그런 클라이언트 중 하나다. GZIP 압축을 자동으로 지원한다. 간단하게 GZIP 압축을 자신의 웹 서버에서 쓸 수 있게 하면, 아이폰 사용자들은 좀더 빠른 다운로드 시간을 경험하게 될 것이다.

Aptana의 아이폰 미리보기 모드는 결과 파일에 대한 디버깅에 도움을 준다. 각 주기마다 빠른 클릭을 통해 설계했던 인터페이스와의 불일치를 찾아낼 수 있다. 하지만 미리보기 모드를 사용하는 것은 성능 문제를 일으킬지도 모른다. 대부분의 컴퓨터들은 아이폰의 620MHz ARM 프로세서보다 세 배 내지 다섯 배 정도 빠르다. 또한 사용자들은 느린 휴대폰 네트워크를 통해 페이지를 다운로드할 것이다. 따라서 자신의 애플리케이션을 실제 아이폰에서 동작시켜 보는 것이 중요하다.

아이폰에서 iDoc을 시험해본 결과 매우 덩치 큰 HTML 파일을 출력할 때 흔들리는 듯한 화면과 성능 저하를 발견했다. 이것을 수정하기 위해 패키지와 클래스 이름을 네비게이션하는 메인 파일을 하나 만들고 별도의 파일로 각각의 클래스의 주석, 메서드에 대한 자세한 정보를 보여주는 페이지들을 만들었다(Listing 5). 비록 이런 과정을 통해 여러 개의 파일을 만들어 내게 되었지만, 각각의 파일 크기가 작기 때문에 애플리케이션이 매우 부드럽게 동작하게 되었다.


Listing 5. 각각의 패키지를 순회하는 Doclet 코드와 각각의 클래스마다 별도의 파일 만들기
                
out = new FileOutputStream(index);
p = new PrintStream(out);
printHeader(p);

PackageDoc[] packages = root.specifiedPackages();
Arrays.sort(packages);

printPackages(p, packages);

for (int i=0; i<packages.length; i++) {
    printPackageDetail(p, packages[i]);
}
for (int i=0; i<packages.length; i++) {
    ClassDoc[] classes = packages[i].allClasses();
    Arrays.sort(classes);
    for (int j=0; j<classes.length; j++) {
        // Creating a separate file for each class.
        PrintStream p2 = new PrintStream(new FileOutputStream(getFilename(classes[j])));
        printClassDetail(p2, classes[j]);
        p2.close();
    }
}
printFooter(p);
p.close();
				

iDoc 사용하기

성능 향상을 통해 iDoc은 이제 출시될 준비가 끝났다. OpenJDK에 있는 java.*와 javax.*에 있는 51개 패키지와 1304개 클래스에 대한 자바독을 만들, 모든 것을 웹 서버로 업로드한다. 16MB가 넘는 크기의 파일이지만 주요 네비게이션 페이지는 단지 112KB에 불과하며 각각의 클래스 자세히 보기 페이지는 평균적으로 13KB다. EDGE 네트워크를 사용하더라도 애플리케이션은 매우 잘 응답한다. 아이폰이 있다면 iDoc 사이트(참고자료 참조)에 접속해 보거나 iDoc을 다운로드하여 아이폰을 위한 자바독을 생성할 수 있다. 그림 11은 최종 애플리케이션을 보여준다.


그림 11. 아이폰을 위해 준비된 51개의 패키지 자바독
아이폰을 위해 준비된 51개의 패키지 자바독

iDoc의 잠재적인 확장기능으로는 자바 5 제네릭과 자바독 주석에 포함된 페이지 사이의 링크를 위한 태그를 더 잘 파악하는 것이다. iDoc의 기능 추가에 관심이 있다면 모든 소스 코드는 온라인에서 받을 수 있다(참고자료 참조).




위로


아이폰 개발의 미래

소셜 북마크

mar.gar.in mar.gar.in
digg Digg
del.icio.us del.icio.us
Slashdot Slashdot

2007년 10월 Steve Jobs는 애플이 아이폰 SDK를 2008년 2월에 공개할 것을 발표했다. 글을 쓰고 있는 시점이 2007년 12월이기 때문에 아직 구체적인 것은 미지수이지만 SDK를 통해 사파리의 도움 없이 아이폰 바로 위에서 동작하는 애플리케이션을 작성할 수 있게 될 것이다. 아이폰 아키텍처 기반을 얻는 것은 Mac OS X과 비슷하게 개발 플랫폼이 코코아(Cocoa)와 오브젝티브-C가 된다는 것이다. 최근 소식에 의하면 애플의 한 중역은 서드파티 애플리케이션이 몇 가지 인증 절차를 거치도록 하는 것을 제안하기도 했다.

발전된 애니메이션, 그래픽 그리고 네트워크 접속을 사용하는 애플리케이션이 네이티브로 동작할 수 있는 이점을 얻을 것이다. 하지만 SDK가 배포되더라도 아이폰을 위한 웹 개발은 여전히 매력적인 위치에 있을 것이다. 웹 애플리케이션은 쉽게 만들고 간단하게 배포할 수 있다. Aptana와 iUi 같은 도구는 개발을 간편하게 해주며 웹 애플리케이션을 빨리 만들 수 있도록 해준다. iDoc을 통해 보았듯이 SDK를 기다릴 필요도 없다. 오늘 배운 도구를 사용해 아이폰 기능을 완전히 사용하며 진짜 같은 룩앤필을 가진 웹 애플리케이션을 만들 수 있다.



참고자료

교육
  • iPhone Dev Center에는 Apple Developer Center에 있는 아이폰 웹 개발과 관련된 유용한 참조 문서들이 있다.

  • iPhone Human Interface Guidelines 는 UI 개발 기준과 가이드라인 모음이다.

  • OpenJDK는 썬의 오픈 소스 자바 개발 키트다.

  • iDoc 시연 —OpenJDK Javadoc—를 여러분의 아이폰에서 참조하라.

  • "Eclipse 추천 도서 리스트 (한글)"를 확인하라.

  • developerWorks의 모든 이클립스 기사를 확인하라.

  • 이클립스가 처음이라면 developerWorks의 기사 "Eclipse Platform 시작하기 (한글)"를 읽고 이클립스의 탄생과 아키텍처 그리고 플러그인을 사용하여 어떻게 이클립스를 확장할 수 있는지 공부하라.

  • IBM developerWorks의 Eclipse 프로젝트 리소스를 참조하고 여러분의 이클립스 기술을 확장하라.

  • 소프트웨어 개발에 관한 흥미로운 인터뷰와 논의 소식을 듣기 원한다면 developerWorks 포드캐스트를 확인하라.

  • developerWorks의 기술 행사와 웹 캐스트에서 최신 정보를 접하라.

  • developerWorks On demand demos에서 IBM과 오픈 소스 기술 그리고 제품에 대한 정보를 무료로 보고 익힐 수 있다.

  • IBM 오픈 소스 개발과 관련하여 앞으로 개최될 컨퍼런스, 트레이드 쇼, 웹 캐스트 그리고 다른 행사들을 확인하라.

  • 한국 developerWorks 오픈 소스 존을 방문하여 방대한 how-to 정보, 도구, 프로젝트 업데이트를 확인하여 오픈 소스 기술을 활용한 개발에 도움을 얻고 IBM의 제품들을 활용하라.


제품 및 기술 얻기
반응형

Eclipse 디버거와 Debug 뷰

Eclipse SDK -- 특히, Java™ Development Tools (JDT) 프로젝트-는 단계별 실행을 수행하는 기능, 중단점과 값을 설정하는 기능, 변수와 값을 검사하는 기능, 쓰레드를 중지하고 재시작 하는 기능을 포함하여 표준의 모든 디버깅 기능들을 제공하는 빌트인 자바 디버거들로 구성되어 있다. 게다가, 원격 머신에서 실행되는 애플리케이션들을 디버깅 할 수도 있다. Eclipse 플랫폼은 다른 프로그래밍 언어들도 각각의 언어 런타임에 이 디버그 장치들을 사용할 수 있다는 강점을 갖고 있다. 앞으로 알게 되겠지만, 같은 Eclipse Debug 뷰 역시 C/C++ 프로그래밍 언어에도 적용될 수 있다.

Eclipse Platform Workbench와 툴은 JDT 컴포넌트에 구현되어 다음과 같은 기능들을 Eclipse에 제공한다.

  • 프로젝트 관리 툴
  • 퍼스펙티브와 뷰
  • 빌더, 에디터, 검색, 빌드 함수
  • 디버거

Eclipse 디버거는 그 자체로 표준 플러그인 세트이다. Eclipse에는 또한 특별한 Debug 뷰가 있어서, 이 뷰를 통해서 Workbench에서 프로그램의 디버깅 및 실행을 관리할 수 있다. 디버깅 하고 있는 각 대상에 대해 중지된 쓰레드에 대한 스택 프레임을 디스플레이 한다. 프로그램의 각 쓰레드는 트리에 있는 노드로서 나타나고, Debug 뷰는 여러분이 실행하고 있는 각 대상의 프로세스를 디스플레이 한다. 쓰레드가 중지되면, 스택 프레임은 자식 엘리먼트로서 보여진다.

Eclipse 디버거를 사용하기 전에 Java SDK/JRE (Java VM V1.4를 권장한다.) 와 Eclipse Platform SDK V3.3이 설치되고, 이것들이 아무런 문제 없이 실행되고 있는 것으로 간주하겠다. 일반적으로, Eclipse 샘플을 사용하여 디버깅 옵션을 테스트 하는 것도 좋은 생각이다. C/C++ 프로젝트를 개발 및 디버그 한다면, C/C++ Development Tools (CDT)를 설치해야 한다. Java SDK/JRE, Eclipse 플랫폼과 샘플, CDT에 대한 링크는 참고자료 섹션을 참조하라. 그림 1은 Debug 퍼스펙티브의 모습이다.


그림 1. Eclipse Debug 퍼스펙티브의 뷰
Eclipse Debug 퍼스펙티브의 뷰

자바 프로그램 디버깅

프로젝트를 디버깅 하기 전에, 코드가 깨끗하게 컴파일 및 실행되어야 한다. 애플리케이션에 맞게 실행 설정을 해야 하고 이것이 올바르게 시작되는지를 확인해야 한다. Run > Debug 메뉴를 사용하여 디버그 설정을 한다. 디버거에 의해서 메인 자바 클래스로서 사용될 클래스를 선택해야 한다. (그림 2) 단일 프로젝트에 원하는 만큼의 디버그 설정을 가질 수 있다. (Run > Debug에서) 디버거가 시작될 때, 새로운 창에서 열리며 이제 디버깅을 시작할 준비가 된 것이다.


그림 2. 디버거 설정 시 프로젝트의 메인 자바 클래스 설정하기
디버거 설정 시 프로젝트의 메인 자바 클래스 설정하기

이제는 Eclipse에서의 일반적인 디버깅 방법들을 설명하도록 하겠다.

중단점 설정하기

디버깅을 위해 애플리케이션을 시작할 때, Eclipse는 자동으로 Debug 퍼스펙티브로 전환한다. 가장 일반적인 디버깅 절차는 조건 문 또는 루프 내에 변수와 값을 검사할 수 있는 중단점을 설정하는 것이다. Java 퍼스펙티브의 Package Explorer 뷰에서 중단점을 설정하려면, 선택된 소스 코드를 더블 클릭하여 에디터에서 연다. 코드를 검사하고 마커 바(에디터 영역의 왼쪽 가장자리)에 있는 커서를 중지된 코드가 있는 라인에 둔다. 더블 클릭하여 중단점을 설정한다.


그림 3. 에디터의 왼쪽 부분에 있는 두 개의 중단점 마커
에디터의 왼쪽 부분에 있는 두 개의 중단점 마커

이제 Run > Debug 메뉴에서 디버깅 세션을 시작한다. 한 라인에 여러 문을 놓지 않는 것이 중요하다. 같은 라인에 있는 한 개 이상의 문에 라인 중단점을 뛰어넘거나 설정할 수 없기 때문이다.


그림 4. 왼쪽 여백에 화살표로 현재 실행되고 있는 것을 보여주고 있다.
왼쪽 여백에 화살표로 현재 실행되고 있는 것을 보여주고 있다.

모든 중단점들을 관리하는 편리한 Breakpoints 뷰도 있다.


그림 5. Breakpoints 뷰
Breakpoints 뷰

조건적 중단점

에러가 어디에서 발생했는지 알았다면 프로그램이 충돌하기 전에 올바르게 수행되었는지를 확인해야 한다. 한 가지 방법은 문제 지점에 다다를 때까지 한번에 하나씩 프로그램의 모든 문을 검사하는 것이다. 가끔은 코드의 한 섹션을 실행하고 그 지점에서 실행을 멈춰서 그 위치에 있는 데이터를 검사하는 것이 더 나을 때가 있다. 식의 값이 변할 때마다 실행되는 조건적 중단점을 선언할 수도 있다. (그림 6) 게다가, 조건 식을 타이핑할 때 Code Assist를 사용할 수 있다.


그림 6. 조건적 중단점 트리거 설정하기
조건적 중단점 트리거 설정하기

식 계산하기

Debug 퍼스펙티브에 있는 에디터에서 식을 계산하려면, 중단점이 설정된 전체 라인을 선택하고 콘텍스트 메뉴에서 Ctrl+Shift+I 또는 관심 있는 변수를 오른쪽 클릭하여 Inspect 옵션을 선택한다. 식은 현재 스택 프레임 컨텍스트에서 계산되고 결과는 Display 윈도우의 Expressions 뷰에 디스플레이 된다.


그림 7. Inspect 옵션을 이용하여 식 계산하기
Inspect 옵션을 이용하여 식 계산하기

활성 코드 스크랩북킹(Scrapbooking)

Display 뷰에서는 스크랩북 형태로 활성 코드를 조작할 수 있다. (그림 8) 변수를 처리하려면 Display 뷰에 변수 이름을 타이핑 하면 익숙한 Content Assist가 나타난다.


그림 8. Display 뷰
Display 뷰

디버거가 중단점에서 멈추면 Debug 뷰 툴바에서 Step Over 옵션을 선택하여 디버거 세션을 계속 진행할 수 있다. (그림 9) 이것은 하이라이트 된 코드 라인을 건너뛰고 같은 메소드의 다음 라인에서 실행을 계속한다.(또는 현재 메소드가 호출되었던 메소드에서 실행을 계속한다.) 마지막 단계의 결과로 변경된 변수들은 색깔로 하이라이트 된다. (기본 색은 노란색이다.) 색상은 디버그 프레퍼런스 페이지에서 변경할 수 있다.


그림 9. 색상을 변경하는 변수
색상을 변경하는 변수

Debug 뷰에서 쓰레드의 실행을 중지하기 위해, 실행 쓰레드를 선택하고 Debug 뷰 툴바에서 Suspend를 클릭한다. 이 쓰레드에 대한 현재 호출 스택이 디스플레이 되고 현재 실행 라인이 Debug 퍼스펙티브의 에디터에서 하이라이트 된다. 쓰레드가 중지되면 커서는 Java 에디터의 변수 위에 놓이고 그 변수의 작은 창으로 디스플레이 된다. 또한, 이 쓰레드의 상단 스택 프레임이 자동으로 선택되고 스택 프레임에 있는 변수들이 Variables 뷰에 디스플레이 된다. 이름을 클릭하여 Variables 뷰에 있는 해당 변수들을 검사할 수 있다.

Hotswap Bug Fixing: 코드 픽스

Java Virtual Machine (JVM) V1.4 또는 이후 버전을 실행한다면, Eclipse는 Hotswap Bug Fixing (JVM V1.3 이하 버전에서는 실행되지 않음)이라고 하는 기능을 지원한다. 디버거 세션 중에 소스 코드를 변경할 수 있는데 이는 애플리케이션을 종료해서 코드를 수정하고 재컴파일 한 다음 또 다른 디버깅 세션을 시작하는 것 보다 낫다. 이 기능을 사용하려면 에디터에서 코드를 수정하고 디버깅을 재시작 한다. 이 기능은 JVM V1.4가 Java Platform Debugger Architecture (JPDA)와 호환되면서 사용할 수 있게 되었다. JPDA는 실행 애플리케이션에서 수정된 코드를 대체하는 기능을 구현한다. 물론 이것은 애플리케이션을 시작하거나 오류가 난 지점으로 가는데 오랜 시간이 걸릴 경우에 특히 유용하다.

디버깅을 끝냈음에도 프로그램이 완전하게 실행되지 않는다면 Debug 뷰의 콘텍스트 메뉴에서 Terminate 옵션을 선택한다. 디버거 세션에 있는 동안 Resume 대신 Debug 또는 Run을 사용하는 실수를 흔히 저지른다. 이것은 현재 세션을 지속하는 것이 아닌 또 다른 디버거 세션을 시작한다.




위로


원격 디버깅

Eclipse 디버거는 원격 애플리케이션을 디버깅 하는데도 재미있는 옵션을 제공한다. 자바 애플리케이션을 실행하는 원격 VM으로 연결하여 애플리케이션에 부착할 수 있다. 원격 디버깅 세션에서 실행하는 것은 로컬 디버깅과 비슷하다. 하지만, 원격 디버깅 설정에는 Run > Debug 윈도우에서 다른 설정을 해야 한다. 왼쪽 뷰에서 Remote Java Application 항목을 선택한 다음 New를 클릭한다. 새로운 원격 시작 설정이 이루어지면 세 개의 탭(Connect, Source, Common)이 보인다.

Connect 탭의 Project 필드에서 (소스 코드 검색용) 시작 참조용으로 사용할 프로젝트를 선택한다. Connect 탭의 Host 필드에서, 자바 프로그램이 실행되는 원격 호스트의 IP 주소나 도메인 이름을 입력한다. Connect 탭의 Port 필드에서, 원격 VM이 연결을 수락하는 포트를 입력한다. 일반적으로, 이 포트는 원격 VM이 시작될 때 지정된다. Terminate 명령어를 원격 세션에서 사용할 수 있는지 여부를 디버거가 결정하도록 하려면 Allow termination of remote VM 옵션을 선택한다. 연결된 VM을 종료하고 싶다면 이 옵션을 선택한다. 이제 여러분이 Debug 옵션을 선택하면, 디버거는 지정된 주소와 포트에 있는 원격 VM으로 연결하고 결과가 Debug 뷰에 디스플레이 된다.

런처(launcher)가 지정된 주소에 있는 VM에 연결되지 않으면 에러 메시지가 나타난다. 일반적으로, 원격 디버깅 기능의 가용성은 원격 호스트에서 실행되는 Java VM에 달려있다.


그림 10. 원격 디버깅 세션을 위한 연결 프로퍼티 설정하기
원격 디버깅 세션을 위한 연결 프로퍼티 설정하기




위로


다른 언어 디버깅 하기

자바가 Eclipse에서 가장 일반적으로 사용되지만, Eclipse는 다른 많은 언어들도 지원할 수 있는 확장성 있는 플랫폼이다. Eclipse는 C/C++ Development Tools (CDT) 프로젝트를 통해 C/C++을 지원한다. CDT는 C/C++ 코드를 디버깅하는 기능으로 표준 Eclipse Debug 뷰를 확장하고, CDT Debug 뷰에서는 워크벤치의 C/C++ 프로젝트의 디버깅을 관리할 수 있다. CDT에는 내부 디버거가 없지만 GNU GDB 디버거에 대한 프론트엔드를 제공한다. 이것은 로컬에서만 사용된다. PHP Development Tools (PDT) 같은 프로젝트도 고유의 디버거를 제공한다. (그림 11)


그림 11. PHP 디버거
PHP 디버거




위로


결론

Eclipse 플랫폼은 단계 실행을 수행하는 기능, 중단점과 값을 설정하는 기능, 변수와 값을 검사하는 기능, 쓰레드를 중지 및 시작하는 기능을 포함한, 표준 디버깅 기능들을 갖춘 자바 디버거를 제공한다. 원격 머신에서 실행되는 애플리케이션을 디버깅 하는 데에도 사용될 수 있다. Eclipse 플랫폼은 주로 자바 개발 환경이지만, 같은 Eclipse Debug 뷰가 C/C++, PHP, 기타 프로그래밍 언어에서도 사용될 수 있다.




위로


감사의 말

그림 11"을 만들어 준 Tyler Anderson에게 감사의 말을 전한다.



참고자료

교육

제품 및 기술 얻기

토론
  • Eclipse CDT newsgroups: C/C++ 디버깅 (기본 Usenet 뉴스 리더기 애플리케이션이 시작되면 eclipse.platform이 열린다.)

  • Eclipse ATF newsgroups: JavaScript 디버깅 (기본 Usenet 뉴스 리더기 애플리케이션이 시작되면 eclipse.platform이 열린다.)

  • Eclipse platform newsgroups: 디버깅 및 기타 Eclipse 플랫폼 관련 질문들 (기본 Usenet 뉴스 리더기 애플리케이션이 시작되면 eclipse.platform이 열린다.)

  • Eclipse Platform newsgroups: Eclipse 관련 기본 질문들 (기본 Usenet 뉴스 리더기 애플리케이션이 시작되면 eclipse.platform이 열린다.)

  • Eclipse newsgroups: Eclipse 사용과 확장과 관련한 자료들

  • Participate in developerWorks blogs and get involved in the developerWorks community.
반응형
Easy Eclipse WebDav라는 플러그인이 있는데,
FTP에 자신의 프로젝트를 디플로이 할 수 있게끔 해주는 이클립스 플러그인이다.
http://www.easyeclipse.org/site/plugins/eclipse-webdav-ftp.html
여기 들어가면 간단한 소개글과 다운로드 링크를 볼 수 있다. 실제 다운로드는 여기에서.

플러그인을 다운로드 하고 설치 파일을 실행시켜 다음으로 넘어가면 EasyEclipse가 먼저 설치되어야 세이프하다는 경고가 나오는데, 일단 귀찮으니 무시하기로 하고.. 깔아본다. 폴더 설정은 이클립스가 설치되어 있는(eclipse.exe 파일이 위치하고 있는) 곳으로 지정한다.


EasyEclipse 설치하려면 다운 받아야 하는데, 최소한 170MB란 말야.. -_-;; 시간 없어!! ㅋㅋ; 암튼 일단 설치를 마무리하고 이클립스를 실행하고 Show Views 메뉴를 실행하면 아래와 같이 Webdav 뷰가 추가된 것을 볼 수 있다.


뷰를 띄우면 하단에 뷰가 나타나는데, 아무튼 그쪽에 가서 오른쪽 버튼을 누르면 아래 그림과 같이 대상 사이트를 추가할 수 있는 메뉴가 생긴다. 일단 누르고 보자.

그러면 대상 사이트를 지정하는게 나오는데, 나 같은 경우는 FTP에 디플로이 할 것이므로 FTP를 선택하고 아래 그림과 비슷하게 설정해 준다. 아이피 주소와 포트, 그리고 이미 FTP 계정이 있으므로 자신의 계정을 입력한다.

이제 아래와 같이 자신의 FTP 계정의 내용이 나타난다.

일단 이렇게 추가해 놓으면 이제 거의 끝.
프로젝트로 돌아가서 File -> Export 메뉴를 실행하면, 가장 하단 Other에 아래 그림과 같이 FTP가 추가된 것을 볼 수 있다.

그리고 나서 다음으로 넘어가면 어떤 프로젝트나 폴더를 Export 할지 선택하는 창이 나오고.. 원하는 내용을 선택하면 된다. Select Site 창에서는 아까 추가해 놓은 FTP 사이트를 이용할 수도 있고, 여기서 바로 사이트를 또 추가할 수도 있다. Select Remote Folder에서는 말 그대로 FTP 계정의 어느 폴더에 디플로이할지를 선택하는 창이다.
Select Resource 창에서는 어떤 파일들을 올릴 것인가를 선택하는 것인데, 그곳에서 바로 파일의 내용을 확인할 수도 있다. 아래 그림과 같이.

그 다음 Finish 버튼을 누르게 되면 FTP 서버의 자신의 계정으로 파일들의 디플로이가 진행된다.
마지막으로 Site Explorer를 보면 파일들이 디플로이 된 것을 확인할 수 있다.

Synchronize 기능도 이용할 수 있는데, 먼저 그 기능을 이용하려면 Synchronize 뷰를 연다. 아래 그림과 같이 Synchronize 뷰가 나타나면 그림과 같이 메뉴를 눌러 Synchronize 메뉴를 선택한다.

그러면 아래 그림과 같이 Synchronize 대상에 FTP가 새로이 추가된 것을 볼 수 있다.

다음을 눌러 아까 추가해 둔 FTP 계정을 선택하고 Finish를 하면 FTP 계정에 대한 Synchronize가 수행된다. 이렇게만 해놓으면 FTP 계정에 대한 디플로이와 Synchronize가 상당히 편해질 것이다... :)

+ Recent posts