http://live.eclipse.org/
사용자 삽입 이미지

이클립스 홈페이지 우측 상단의 아이콘 중에 라이브 이클립스 사이트로 이동하도록 되어있습니다.

웹 세미나를 줄여서 웨비나라고 부르는데, 동영상, pt, 채팅이 고스란히 재현되는군요. 제품은 adobe사의 breeze를 이용했습니다만 컨텐츠가 장난이 아니게 쌓여있습니다. 계속 쌓이고, 또 앞으로 있을 웨비나에 대한 스케줄도 공시하고 있습니다.

mylyn2.2 에 대한 전세계 이클립스를 사용하는 개발자들의 관심이 뜨거운 것도 알 수 있습니다.

자주 가 봐야겠습니다.

OKJSP소스를 집과 회사에서 관리를 합니다. CVS update 후 에러가 보여서 확인해봤더니 모처럼만에 CVS Conflict가 났습니다.
아이콘이 이상하게 표시됩니다.

사용자 삽입 이미지



파일을 열어보면 <<<<<<< 표시와 >>>>>>> 표시가 보입니다.
사용자 삽입 이미지

의미상 ======= 을 기준으로 상단부분이 CVS update 이전 로컬에서 고쳐진 부분이고, 아랫부분에 >>>>>>> 1.2 위 까지 CVS 저장소에서 받아온 소스의 변경된 부분입니다. 같은 라인이네요. ^^; 아마도 로컬에서 작업하고 올리지 않고, 퇴근 후 작업해서 올렸기 때문에 회사에서 소스를 다시 동기화하니 발생한 문제 같습니다. null로 작업했는데, 그냥 writer로 굳혀버렸죠.


수정하는 방법은 다음과 같이 불필요한 부분을 다 지워주고, 에러가 없도록 정리해 줍니다. 그리고 커밋을 하면 됩니다.
사용자 삽입 이미지


만약 커밋이 필요없고, 로컬에 있는 내용을 모두 포기하려면 파일의 컨텍스트 메뉴에서 Replace With > Latest from HEAD 메뉴로 확 덮어씌우면 됩니다. 로컬에서 작업한 예전 내용은 대개의 경우 Compare With > History... 로 확인 가능합니다.
사용자 삽입 이미지

소스의 수정한 부분이 겹치지 않고 다른 부분이라면 Update할 때 eclipse에서 자동으로 Merge를 시켜줍니다.
겹치는 부분이 있다면 사람이 해결해야 되는 것이 맞죠.

이클립스로 쉽게 웹서비스 시작하기에 이어지는 글입니다.
simplews 프로젝트 하나에서 3개의 프로젝트가 더 늘어났습니다.
일단 기존 simplews의 변화부터 살펴 보겠습니다.
svn에 최초 버전을 기록해 놓았기 때문에 Synchronize 뷰를 통해서 파일의 변경내역을 확인할 수 있습니다.

사용자 삽입 이미지


web.xml 파일만 변경이 되었고, 나머지 디렉토리와 파일들은 새롭게 생성되었습니다.
파일 확장자의 변화를 보면 *.wsdd, *.jar, *.wsdl 이렇게 생성이 되었습니다.

디렉토리의 변경도 볼 필요가 있는데, WebContent/WEB-INF/ 아래 생긴 것과 WebContent 으로 나눠 볼 수 있습니다. WebContent/ 디렉토리는 컨텍스트 루트이고, WebContent/WEB-INF/ 디렉토리는 브라우저를 통해서 접근할 수 없는 서버 내부적 디렉토리입니다. 결국 WebContent/wsdl/ 디렉토리가 외부로 공개되는 자원이라고 생각할 수 있습니다. 파일이 하나 있는데, 이름이 자바파일 이름과 같고, 확장자가 wsdl 이네요.

WEB-INF/lib 디렉토리에 추가된 jar 파일을 살펴보겠습니다.
axis.jar : 웹서비스용 컴포넌트입니다.
http://axis.apache.org/
commons-discovery-0.2.jar : 서비스 발견 컴포넌트입니다.
http://commons.apache.org/discovery/
commons-logging.jar : 로깅에 관련된 컴포넌트.
http://commons.apache.org/logging/
jaxrpc.jar : 자바 xml rpc 컴포넌트
https://jax-rpc.dev.java.net/
saaj.jar : SOAP with Attachments API for Java (SAAJ)
http://java.sun.com/webservices/saaj/docs.html
wsdl4j-1.5.1.jar : Web Services Description Language for Java
http://sourceforge.net/projects/wsdl4j

이러한 컴포넌트들이 자동으로 붙게 됩니다.
java와 utf8 환경에서 한글 깨지는 현상에 대한 gruter님 질문 관련 포스팅입니다. 제한적인 상황이라는 것은 참고해주시면 좋겠습니다.

테스트는 다음과 같이 했습니다.
XP, jdk1.6.03, eclipse 3.3.1 JEE 환경
새로운 workspace 만들고 java project 하나 만들었습니다.
기본 설정에서 "한글UTF8" 문자열을 콘솔뷰에 찍는 프로그램을 만듭니다.
설정에서 java 소스파일의 인코딩타입을 utf8로 변경합니다.
사용자 삽입 이미지

사용자 삽입 이미지


콘솔에서 확인합니다.
사용자 삽입 이미지


인코딩 변환으로 소스의 한글이 깨어져 보이기 때문에 한글부분을 수정했습니다.
사용자 삽입 이미지

콘솔에서 확인합니다.
사용자 삽입 이미지


이 테스트에서 내릴 수 있는 결론은 파일 인코딩 타입 변환에 따른 한글이 깨어질 수 있다 정도입니다.

설정을 모두 해제하시고, 인코딩 변환 부분을 최소화 시켜서 작업하는 것이 좋을 것 같습니다.
개인적으로 2003년부터 철저히 외면했던 기술이었습니다. 허나 옥션의 openapi를 하다보니 지나칠 수 없는 기술이었습니다. 웹서비스가 어려웠던 이유 중 하나는 xml 봉투를 만드는 일과 이렇게 만들어진 봉투를 post방식으로 요청하는 것이 쉽지 않아서였습니다.

이클립스에는 이런 복잡 다단한 작업을 WTP에서 편하게 할 수 있는 기능을 제공합니다.
http://www.eclipse.org/webtools/jst/components/ws/1.5/tutorials/BottomUpWebService/BottomUpWebService.html
문서를 기본으로 웹서비스를 쉽게 이용하는 방법을 알아보겠습니다. webtools 플러그인이 장착된 이클립스에서 가능합니다. JEE 패키지나 WTP all-in-one 이클립스를 받아서 사용하시면 됩니다.


새로운 프로젝트를 만듭니다. web으로 필터링해서 보이는 Dynamic Web Project 를 선택합니다. 자바를 사용하기 때문에 Dynamic Web Project 를 이용합니다.
사용자 삽입 이미지


프로젝트 이름은 simplews 로 정했습니다. Apache Tomcat 5.5를 기준으로 했습니다. Target Runtime으로 설치된 톰캣을 지정해줍니다.
사용자 삽입 이미지


Axis2 Web Services는 선택하지 않습니다.
사용자 삽입 이미지


프로젝트가 만들어지면 src 아래 wtp 폴더를 만들고 Converter.java 파일을 복사해 넣습니다. 섭씨, 화씨 온도 변환 프로그램입니다. 아주 간단하죠. 이러면 일단 웹서비스를 만들 준비가 끝난 것입니다.


사용자 삽입 이미지


이제 웹서비스 서비스를 만드는 작업을 해보겠습니다. 웹서비스의 프로바이더와 클라이언트를 동시에 만들게 됩니다. File > New 에서 web으로 필터링하면 아까와 다르게 Web Service 항목이 보입니다. 이것을 선택합니다.
사용자 삽입 이미지


wtp.Converter 서비스 구현체를 선택합니다. 그리고 아래에 눈금게이지를 Test client까지 올립니다. 그리고 아래에 Monitor the Web service 항목을 체크합니다. Finish 버튼을 클릭하면 1분 정도의 작업이 진행될 것입니다.
사용자 삽입 이미지


관련된 프로젝트가 3개가 더 생겼습니다. 웹서비스를 지원하는 Servers, simplews client 프로젝트 그리고 JSR-109 Web Services 라는 듣보잡 프로젝트가 생성됩니다. 톰캣이 기동되고 서비스를 테스트할 수 있는 클라이언트 페이지가 에디터 영역에 뜹니다.
사용자 삽입 이미지


celsiusToFarenheit(float)를 클릭해서 값을 넣어 테스트해봅니다. 36.5 를 입력하면 화씨온도가 Result영역에 보이게 됩니다.
사용자 삽입 이미지


하단의 뷰에 TCP/IP Monitor 가 뜹니다. 보는 옵션을 Byte에서 XML로 바꿔주면 조금 더 가독성이 높일 수 있습니다. 왼쪽이 Envelope이고 오른쪽이 응답된 서비스 데이터입니다.
사용자 삽입 이미지


생성된 파일에 대해서 다음 글로 분석해보겠습니다.
이클립스의 대표적인 뷰입니다. 프로젝트와 파일들을 표시하는 뷰입니다.

Package Explorer
자바의 패키지 형태로 구분해서 보여주는 뷰입니다. Dynamic Web Project 일 경우 src 디렉토리가 주로 자바소스의 기준디렉토리가 됩니다. 파일을 패키지별 리스트로 보는 방법과 트리구조형태로 보는 방법이 있습니다. 툴바 메뉴중 제일 우측의 역삼각형을 클릭해서 보는 방법을 조정할 수 있습니다.
사용자 삽입 이미지

Navigator
윈도우의 탐색기와 가장 유사합니다. Package Explorer에서 안 보였던 디렉토리들도 다 확인할 수 있습니다. 윈도우 탐색기의 모양에 익숙해진 분들이 선호하는 뷰입니다만, 단점이 있다면 에러가 난 자바파일의 아이콘 표시가 안 되기 때문에 깔끔한 코딩이 어렵습니다.
자바 파일의 복사와 이동이 비교적 자유롭습니다.
사용자 삽입 이미지

Project Explorer
패키지 익스플로러와 유사하지만 JEE 개발에 맞춰져 있습니다. 제일 상단에 2.4를 포함한 아이콘은 web.xml 의 구성을 보여주는 곳입니다. Java Resources: src로 표시된 부분이 자바 소스의 기준 디렉토리입니다. 웹개발에 최적화된 뷰입니다.
사용자 삽입 이미지


마우스 오른 버튼을 클릭하면 나오는 메뉴를 컨텍스트 메뉴하고 합니다. 컨텍스트는 text와 text를 연결한다(con-)는 어원을 갖고 있는데 문맥이라고 번역합니다. 보이지 않는 의미를 갖고 있지요. 그래서 컨텍스트는 마우스가 가르키는 곳의 상황에 따라 다르게 메뉴 항목이 꾸려집니다. 이 세 가지 뷰에서도 확인할 수 있습니다.

WebContent 디렉토리에서의 컨텍스트 메뉴는 JSP와 같은 파일들을 생성할 수 있도록 되어있습니다.
사용자 삽입 이미지

프로젝트 익스플로러에서 src 디렉토리는 Class 생성 항목이 있습니다.
사용자 삽입 이미지

패키지 익스플로러로 포커스를 옮겨서 같은 src 디렉토리의 컨텍스트 메뉴를 나타나게 했습니다. 그런데 항목에 Class는 보이지 않는군요. 좀 난감합니다. Others.. 에서 Class를 선택할 수 있겠지만, 난감한 컨텍스트임에는 틀림이 없습니다. 그런데...
사용자 삽입 이미지

이번에는 src 디렉토리의 컨텍스트 메뉴에 Class 항목이 보입니다. 왜 일까요? 퍼스펙티브를 바꾸었습니다. 이클립스 우측 상단의 퍼스펙티브 목록에서 JEE를 Java로 변경한 후에 나타난 컨텍스트 메뉴입니다.
사용자 삽입 이미지

같은 뷰라 하더라도 퍼스펙티브에 따라서 컨텍스트 메뉴는 달라집니다.
사용자 삽입 이미지

eclipse panels

eclipse panels

이클립스의 각 부분 명칭입니다.

가운데 프로그래머의 핵심 공간인 에디터(Editor)를 중심으로 보좌하는 뷰(View)들이 둘러싸고 있습니다. 에디터의 상태에 따라 뷰에서 보여지는 내용들이 변하게 됩니다. 뷰와 에디터는 연결되어 있다고 생각하시면 됩니다.
각 패널들(에디터, 뷰)은 이동이 가능합니다. 그리고 탭으로 여러 개의 뷰끼리 또는 편집파일끼리 겹쳐놓을 수 있습니다.


제일 상단에 메뉴바가 위치하고 그 아래 아이콘 집합인 툴바가 있습니다. 그 오른쪽에는 퍼스펙티브(Perspective)를 선택할 수 있는 퍼스펙티브 아이콘들이 있구요. 퍼스펙티브는 작업의 종류에 따른 레이아웃 구성이라고 생각하시면 됩니다.

그리고 제일 아래 상태표시줄(Status Bar)이 있습니다.

이클립스를 사용해서 개발을 하는 것은 기존 텍스트 에디터를 이용해서 작업하는 것과 많은 차이를 갖고 있다. 특히 웹 애플리케이션 개발에서는 더 많은 차이가 있게 되는데, 우선 언급해 볼 것이 서비스에 구성된 디렉토리와 개발에 사용되는 디렉토리의 차이점이다.

웹 애플리케이션은 서블릿 스펙에 따라서 디렉토리가 정해진 규칙을 갖고 있다.

/WEB-INF/ 브라우저를 통해서 접근이 불가능한 웹 애플리케이션 핵심정보들을 포함하고 있는 디렉토리
/WEB-INF/classes/ 패키지에 따른 디렉토리별 class파일과 properties 파일이 위치하는 곳
/WEB-INF/lib/ 웹 애플리케이션에서 사용되는 jar 파일이 존재하는 곳
/META-INF/context.xml 톰캣에서 사용되는 manager를 통한 배포용 웹 애플리케이션 Context정보 파일
브라우저를 통해서 접근 가능한 리소스들은 그 외의 디렉토리에 놓으면 된다.
특히 브라우저의 JVM 위에서 돌아가는 애플릿 class와 관련 jar 들은 /WEB-INF/ 밖에 위치해야 한다.
이 디렉토리들을 묶어서 Context 라고 얘기한다.

서비스와 관련된 디렉토리 구조가 위와 같고, 개발용 디렉토리 구조는 java 파일이라는 특징 때문에 다음과 같이 구성한다.

/src 패키지에 따른 디렉토리별 java 파일과 properties 파일이 존재하는 곳
/WebContent/ 앞에 언급한 브라우저를 통해서 접근 가능한 리소스들. 웹 애플리케이션의 컨텍스트 루트 디렉토리에 해당.
/WebContent/WEB-INF/ 앞에 언급했던 /WEB-INF/ 디렉토리와 같은 성격
/build/classes  /src 하위 자바파일의 컴파일된 class 들이 놓이는 곳. properties 파일은 자동 복사되는 곳.


개발 디렉토리와 WAS의 서비스되는 디렉토리의 매핑 즉 자연스런 연결은 빌드 툴인 ant를 통하거나 Eclipse같은 IDE에서 자동으로 해준다.

이클립스의 경우 Servers 라는 프로젝트가 웹 프로젝트와 별개로 생성이 된다. 여기에서 설정되는 서버의 세팅은 기본적으로 설치된 세팅과 별도로 운영된다. 즉 톰캣이 설치된 디렉토리의 conf 에 있는 설정과는 별개로 Servers하위의 서버별 server.xml 의 파일에 설정된 내용으로 동작이 된다는 뜻이다.
<%= request.getRealPath("/") %> 를 통해서 확인해 보면 이클립스에서 운영하는 디렉토리가 완전히 엉뚱한 곳에 존재함을 알 수 있다. 웹 프로젝트에서 파일을 변경하면 자동으로 파일이 해당 위치로 복사된다.


관련자료:
http://tomcat.apache.org/tomcat-4.1-doc/appdev/index.html 영문
http://www.apache-korea.org/tomcat/tomcat-4.1-doc/appdev/index.html 번역문

자바 설치한 디렉토리를 기억합니다. 복사하면 좋구요.
예를 들면
C:\java\jdk1.6.0_04

내 컴퓨터 클릭하고 alt+Enter를 누르면 속성창이 뜹니다.
거기서 "고급" 탭을 클릭하고 하단의 "환경 변수" 버튼을 클릭 합니다.

사용자와 시스템이 상하로 나오는데,
시스템 쪽에 하는 것이 좋습니다.
새로 만드는 환경변수는 "JAVA_HOME" 입니다.
아까 복사한 자바 디렉토리를 아래 붙여 놓습니다.
사용자 삽입 이미지

그리고 하나 더 손 봐야 됩니다.
시스템 쪽에 Path 환경변수가 보입니다.

이것 열고 Home 키를 눌러서 맨 앞으로 가서
%JAVA_HOME%\bin;
을 추가합니다.

확인은 말이죠.
cmd 창 띄우고, 까만 화면에서
echo %Path%
하면 됩니다.

그리고
java -version
하면 버전도 보이죠.
웹에 이미지 파일 업로드를 하고 썸네일을 만든 후 원본 파일을 지우는 코드입니다.
        // 임시디렉토리에 파일 저장
        File file = saveToTemp(request);
        // 파일 리사이징
        Thumbnailer tt = new Thumbnailer(file.getPath(),
                getServletContext().getRealPath(request.getContextPath())
                + "/profile/"+ id + ".jpg",
                77, 77);
        tt.createThumbnail();
        boolean delete = file.delete();

작업을 하는 중에 이미지가 삭제되지 않는 현상이 간헐적으로 나타났습니다. 디버깅하기 가장 힘든 상황이죠. 됐다 안됐다 하는 경우 원인이 무엇인지 밝혀내기 어려우니까요.
이상한 일은 디버깅 모드로 작업시에는 전혀 그런 현상이 일어나지 않았습니다.
탐색기에서 삭제하려고 해도 파일을 톰캣이 잡고 있는지 삭제가 안 되었습니다.
톰캣을 내리고 삭제를 해야 지워졌습니다.

boolean으로 반환되는 delete를 출력해보면 false인 경우가 그러했습니다. 지우지 못했으니까 false가 나오겠죠.
결과적으로 썸네일을 만들고 file이 완전히 덜 풀린 상태에서 delete() 시도를 하기 때문이 아닌가 추론해볼 수 있었습니다. 때문에 다음과 같은 시간지연코드를 삽입해서 풀었습니다.

        tt.createThumbnail();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e1) {
        }
        boolean delete = file.delete();

결과는 성공적이었습니다.

+ Recent posts