프로젝트 후기

2009/10/05 11:49

난항의 프로젝트

앞선 포스트에서도 몇차례 언급했었지만 지난 프로젝트는 이런저런 요인들로 난항의 연속이었다. SI에 몸담고 개발자로서의 첫발을 디딘 후로 꽤나 많은 시간들을 보내면서 그동안 적지않은 프로젝트를 경험했지만, 스트레스의 강도로 따지자면 손가락 안에 꼽을 정도로 힘든 프로젝트가 진행되었다.

그래도 PM을 비롯하여 말단 개발자까지 합심하여, 프로젝트 기간내내 대부분의 주말도 반납하고 하루하루 밤늦도록 열성을 다하여 전력질주한 끝에 다소 불안정한 상태였지만 그럭저럭 서비스를 오픈할 수 있었다. 덕분에 지난 7월 오픈을 전후하여 나를 포함해 대부분의 투입 인력이 철수하였다. 하지만 아직까지도 몇몇 SM 인력들이 주어진 숙제를 안은채 서비스를 안정화하고 품질을 높이기 위해 불철주야 노력하고 있다.

난항을 겪는 프로젝트가 흔히 그렇듯이 상대적으로 할 일은 많은데 절대적인 시간이 부족했다. 어느정도의 리스크를 이미 전제조건으로 떠안고 시작한 프로젝트. 끊임없는 강행군으로 심신은 지쳐가고 다가오는 데드라인에 중압감은 쌓일대로 쌓여 프로젝트룸의 공기가 어느덧 숨이 턱턱 막힐 정도로 무거워진 무렵의 어는날엔, 말그대로 드라마에서 나올법한 "드라마틱한 사건"이 벌어지기도 했다. 돌이켜보건데, 다 사람 사는 일이라 벌이진 해프닝으로 치부할 수도 있으련만 프로젝트가 중후반에 이르면서 그만큼 다들 극도의 스트레스를 받고 있었다는 반증이 아닐 수 없다.

어려웠던 프로젝트는 이유가 있기 마련이다. 하지만 현재 시점에서 업무며 설계며, 커뮤니케이션니 협업이니 기타등등의 원초적인 부분에 대해 언급하고 싶지는 않다. 또 이들의 비중이 막대하지만 프로젝트의 성패를 좌우하는 전부가 되지는 못한다. 실제로 보다 복잡한 요인과 설명하기 어려운 요소들이 얼기설기 얽혀있기 마련이다.

단편적 회고

다만 기술적인 관점에 있어서 하나의 단편적인 부분을 언급해보고자 한다. 그러기 전에 먼저 프로젝트의 개발 환경에 대해 짧게 소개하자면, 시스템은 크게 Spring2.5을 기반으로 하여 Struts2iBATIS의 오픈소스 프레임워크의 조합과 기타 라이브러리들을 사용하여 구축되었다. 그리고 AJAX(Prototype 기반)와 DWR(Direct Web Remoting)을 사용하여 UI에서 발생하는 사용자 액션(이벤트)들을 처리하였다.

대강의 환경과 툴, 주요한 라이브러리를 정리해보았다.

Environments

  • JAVA: JSDK 1.5, J2EE 1.4+(Servlet 2.4, JavaServer Pages 2.0 JSTL 1.0 이상 지원 환경)
  • WAS: JEUS 6.0 (개발: Tomcat 6.0.18)
  • WEB: WebtoB 4.1
  • DB: Oracle 10g

IDE & Tools

  • IDE: Eclipse Ganymede 3.4.1
  • Reporting Tool: Report Designer
  • Version Control: Subversion 1.5.5
  • Code Generator: 단위업무에 필요한 JSPs(코드 템플릿), Java(Action/DAO/Model), 설정(Struts/iBATIS) 등의 파일 목록 자동 생성.

Open Source - Framework & Library

  • Java Libraries
    • Spring 2.5.6 (Base)
    • Spring Security 2.0.4 (Security)
    • Struts 2 (MVC)
    • iBATIS 2.3.4.726 (SQL Mapper)
    • Direct Web Remoting 2.0.5 (DWR)
    • SiteMesh 2.4 (Layout)
    • Quartz 1.6.4 (Scheduler)
    • JExcelApi 2.6.9 (MS Excel)
    • Log4J 1.2.15 + Jakarta Commons Logging(JCL) 1.1.1 (Logging)
    • Apache Commons - DBCP, BeanUtils, Collections, etc…
    • FCKeditor 2.4.1 (Rich Text Editor)
  • AJAX & Javascript Libs
    • Prototype JavaScript framework, version 1.6.0.2
    • The Yahoo! User Interface Library (YUI)

라이브러리와 여타 종속성이 있는 라이브러리들을 포함하다 보니, lib 디렉토리가 적잖게 비대해진 면이 있다.

이슈

라이브러리의 조합은 무척 일반적인데 비해, 구현 일정에 있어서 개개인의 노력도와 투자한 시간에 반하여 전반적으로 개발 퍼포먼스가 나지않는 것이 큰 이슈가 되었다. 표준과 개발 가이드가 미비하고 공통 관련 구현체 및 개발 구조의 완성도가 미흡한 상태에서 급하게 개발에 착수한 것이 역시 독이 되었다. 여기서 비롯된 구조적인 결함과 취약점들이 원인이 되어 개발자들에게 혼란을 초래하고 기술적인 진입장벽을 형성하였고 결국 개발 생산성과 효율이 극도로 저하되었다.

주목할 만한 것은 Spring 기반 위에서 Struts의 Action, 비즈니스를 수행하는 Service, DAO 및 iBATIS SqlMap, 그리고 Model을 아우르는 구현부와 설정들에 있어서는 비교적 손쉽고 안정적으로 개발이 진행된 반면, 상대적으로 UI 단을 개발함에 있어서 단연 부하가 심했다는 사실이다. 계층화된 아키텍처로 Presentation(UI) Layer, Service(Business Logic) Layer, Persistence(Data Access) Layer 등 크게 세 계층으로 구분할 때 개인적으로 판단해보건데, P/T Layer을 개발하는데 60% 이상의 공수가 걸리지 않았을까 싶을 정도다. 웹 개발의 특성상 UI에 잔손이 많이 가는 것은 어쩔 수 없는 부분이지만 이클립스에 업무 핵심인 비즈니스 로직과 관련 쿼리를 작성하기 위해 자바 소스나 XML 파일을 열어놓기 보다는 UI 코드를 작성하기 위해 JSP나 JS 파일을 띄워놓는 시간이 단연 많았다.

대부분의 UI 이벤트를 처리하기 위해서 Ajax 및 DWR이 사용되어 javascript에 대한 의존도가 높아진 반면, 개발자 대부분이 상대적으로 Ajax 및 객체지향적인 스크립트에 대한 경험이 취약한 상태였다. 게다가 개발 템플릿으로 만들어진 개별 페이지의 구조가 다소 일반적이지 않은 모양새였는데, 페이지 구조에 일관성을 부여하고 페이지에서 발생할 수 있는 대부분의 기능(script)를 공통화하여 개발 편의를 증대하고자 한 것이 결과적으로 득보다는 실을 가져다 준 셈이었다.

페이지의 구조에 대해서 좀더 자세히 얘기를 하자면 먼저 구현한 페이지의 형태에 대한 이해가 필요하다.

사용자 삽입 이미지

충분히 응용될 수 있지만 일반적이지는 않은 페이지 구조이다. Main이 되는 JSP에는 검색, 목록, 상세, 등록, 수정, 삭제 등과 관련한 각각의 UI 요소 및 Form들을 포함하기 위한 영역으로 정의된 Place Holder(DIV)들이 위치한다. 각 영역에는 목록, 상세, 등록, 수정 등의 JSP Fragment(*.jspf)들이 템플릿화 되어 삽입(include)되어진다. 이 형태를 기본 페이지 레이아웃으로 하여 각각의 단위업무 기능에 따라 첨삭이 가해졌다.

쉽게 얘기해서 목록 페이지 따로, 등록(수정) 페이지 따로가 아니라 메인 페이지가 검색, 목록, 상세, 등록, 수정, 삭제 등 각 기능별 템플릿들을 모두 미리 포함(로드)한 상태에서 사용자 액션(이벤트)에 따라 Place Holder 들에 대한 visible 속성 및 필요한 제어 로직을 갖는 구조이다. 사용자 액션에 의해 Request가 발생하면 비동기 방식으로 서비스를 호출(Ajax call)하게 되고, 서비스(Struts Action 및 비즈니스 수행부, DAO 등을 포괄)를 수행 후 result에 따라 XML 형태의 뷰(view) 페이지를 Ajax의 callback method에서 전달받아 jspf 템플릿에 데이터를 주입(치환)하는 방식이다. 완전히 일치하지는 않지만 기본적인 흐름은 다음 그림과 유사하다.

사용자 삽입 이미지

어쨌든 이러한 페이지 구조는 정형화되고 일반적인 패턴의 화면은 아주 쉽고 빠르게 구현할 수 있었지만, 화면의 복잡도가 증가하고 예외적인(다소 일반적이지 못한) UI 유형을 포함하게 될 때에는 처리가 복잡해지고 더불어 몇가지 제약사항을 야기시켰다. 결과적으로 개발자들은 주로 UI의 요소를 컨트롤하고 이벤트를 처리하기 위한 script block과 씨름하는 것에 대부분의 시간을 할애하게 되었다. 또한 Ajax 결과로 Struts에서 View로 넘어온 XML 데이터를 UI 템플릿의 대응하는 위치에 치환하는 작업도 개발자들이 어려워한 부분이었다. 특히 단건의 데이터가 아닌 복합적인 Collection의 형태로 넘어온 목록 데이터를 반복하여 보여주는 처리를 난감해 하였다. 이것은 XML 데이터를 템플릿상의 동일 ID항목으로 치환해주는 공통 script가 갖는 한계점도 있었고, Service, Action, Dao 등의 Base class들과 기타 관련 class 들의 구조, 그리고 Struts Value Stack에 대한 개발자들의 이해가 부족했던 것이 주요한 원인으로 작용하였다.

정리

최근 몇년간의 프로젝트에서는 직접 제반 개발 환경을 세팅하고, 프레임워크를 구현하고, 개발 구조를 정의하고, 개발을 가이드하는 등의 역할을 수행해왔다(프레임워크는 주로 오픈소스를 조합하여 구성). 그런데 이 프로젝트의 경우, 구현 일정이 워낙 촉박한 데다 업무의 특성을 고려하다보니 해당 업무를 전문으로 하는 업체에서 노하우가 녹아있는 완성도 있는 컴포넌트와 솔루션을 들고 들어와서 함께 구축하는 방향으로 급선회하게되었다.

그런데 이것이 애초의 기대한 바와는 다른 부분이 적지 않았다. 개발 사상적인 시각에서도 협력사의 개발자와 약간의 차이가 있었다. 이러한 부분을 극복하기 위해 개발과 병행하여 기본이 되는 코드와 구조를 꾸준히 리뷰하면서 개선할 점을 논의하고 반영해 나갔다. 그렇지만 근본 틀을 바꿀 수는 없는 상황이라 여전히 한계가 있었다. 문제가 된 페이지의 구조와 Ajax 위주의 개발 패턴 역시, 이미 많은 것들이 이들을 기반으로 맞물려 돌아가는 상황이라 들어낼 수는 없는지라 대안으로 복잡한 화면 처리를 위한 유형을 하나 더 패턴화시키는 정도로 처리하였다.

정리하자면, 필요에 따라 응용할 수 있는 페이지의 구조를 오히려 전체 페이지에 대한 표준으로 일반화시킨 것과 지나치게 Ajax 기반으로 처리하는 개발 패턴이 구현상의 가장 큰 오류가 아니었나 싶다. 프로젝트에서 철수하고 더더욱 확신이 드는 생각이 두가지 있다. 하나는 "일반적인 것이 좋은 개발 구조"라는 것이다. "일반적"이라는 것에 대한 정의가 모호해질 수 있겠지만, 어떤 개발자들이 붙더라도 쉽게 적응하고 응용할 수 있도록 진입장벽을 낮추고 잘 구조화 시켜야한다. 덧붙여 일반적이라는 것이 품질 또한 일반적일 것을 보장할 것이라 생각하지는 않는다. 확신의 또다른 한가지는 "과유불급". 지나친 것은 좋지 않다는 것이다. 이를테면 Ajax가 UI의 가능성과 유연성을 높이는데 도움이 되는 것은 사실이지만 이것이 전체 이벤트를 제어하는 메인 기술이 되어서는 안된다는 생각이 든다. 필요한 부분에 적절히 사용되어야 한다.

대강 정리를 해보았지만 한편으로는 프레임워크와 스트럭처를 조금더 보완하고, 개발 전에 아키텍처의 컨셉과 개발 절차 및 응용 단계에 대해서 개발자들과 충분히 공유할 수 있었다면, 몇가지 단점들을 충분히 상쇄(trade-off)할 수 있는 장점도 있지 않을까 싶기도 하다(이를 설명하자면 전체 개발 구조에 대해서 좀더 이해해야 할 내용들이 많아진다). 협력사의 인력들도 중고급 이상으로 구성된 상당한 고수들이었고, 고심해서 작업한 흔적이 전체적으로 역력했다. 적용한 프레임워크와 개발 구조에 대해서는 쉽게 평가하기 전에 좀더 고민해볼 부분 많을 것으로 생각한다. 다만 한가지 확실한 것은 시도는 좋았지만, 실험정신을 발휘하기엔 시기가 적절하지 않았다는 것이다.

P.S.

지난 프로젝트의 성패를 떠나서 여러가지 관점에서 시사하는 바가 적지않다. 경험이 쌓여가는 것과는 무관하게 여전히 배워야할 것도, 공부해야할 것들도 많다. 반성해야할 것도 많고 인간적으로도 좀더 성숙해야 되지 않을까 싶기도 하다. 개인적으로 그동안 개발 방법론적인 부분에 있어서도 부족함이 많았는데, Agile 개발 프로세스나 XP(Extreme Programming), TDD 등 연구하고 적용해볼 분야가 많음을 새삼 느껴본다.

뜨거운 청춘들과 가정이 있는 사람들이 개인사와 가족을 뒤로 하고 했던 고생들이 그저 고생으로 끝나고 남는것이 없지 않기를 바란다. 문제점이 없진 않았지만, 시행착오를 통해 나를 비롯해 다들 조금더 성숙한 개발자가 될 수 있는 계기가 될 수 있기를 진심으로 바란다.

후기랄 것도 없이 종료한 프로젝트에 대한 간단한 감상이나 적어보려고 했는데, 쓸데없이 글이 길어졌다. -_-

"Development Story" 카테고리의 다른 글

2009/10/05 11:49 2009/10/05 11:49
 
Bookmark and Share

봄의 실종!

2009/04/09 13:32

날이 좀 풀리고 봄이 왔나 했더니, 바로 여름으로 들어가는 것 같다. -_-

사용자 삽입 이미지

회사 맞은 편의 삼청각 담장 너머론 벌써부터 벗꽃이 만발하다. 몇일간 봄나들이하기에 딱이다 싶어 사무실 구석에 쳐박혀 있는 신세를 한탄하고 있었는데, 오늘 점심에 탁구 한 게임을 뛰고 올라오다 보니 산책 다녀온 사람들이 더위에 허덕이고 있다. 오늘 너무 덥다 싶어 날씨를 확인해봤는데 전국적으로 20도를 넘어서는 초여름 날씨란다. 봄, 가을이 갈수록 짧아지고 있다.

요즘 점심, 저녁 시간을 이용해 회사 식당 옆에 있는 탁구장에서 열심히 라켓을 휘둘르고 있다. 본사 들어와서 한 두번 쳐봤다가 의외로 운동이 되는 것 같아 꾸준히 쳐보려고 노력 중이다. 가뜩이나 빡신 프로젝트라 체력 관리도 필요한 터이다. 헌데, 남들보다 원래 땀이 많은 체질이라지만 요즘 같은 날씨에선 몇 게임 치고나면 아예 와이셔츠가 땀으로 범벅이 되고 만다. ^^;

사용자 삽입 이미지

어찌됐건 기분은 상쾌하다. 이왕 하는 거 실력은 없지만 라켓을 하나 구입해볼까 고민중이다. ^^

아무튼 봄이 실종되었다.
추위도 많이 타는 체질이라 어서 봄이 오길 바랬었는데, 봄은 건너뛰고 여름으로 직행하는지라 그리 달갑지 않다. 10년 20년 후가 두려워진다. -_-

P.S. 사진은 직찍이 아니다. 전에 벗꽃 촬영해둔 사진들이 있는데, 지금 갖고 있질 않아 출처를 알 수 없는 사진을 한장 올렸다. 왠지 사진 없는 포스트는 앙꼬 없는 붕어빵이라는 강박관념에 시달리고 있는 것 같다. ㅋ~

"Scent of Life" 카테고리의 다른 글

2009/04/09 13:32 2009/04/09 13:32
 
Bookmark and Share
TAG ,

JPetStore 데모 설치 - Spring 샘플

2007/08/08 13:50

Spring의 포함 예제 중 JPetStore를 설치한다. 

JPetStore 웹 어플리케이션을 배포하기 위해서는 Apache Ant를 사용하여 빌드하여야 한다. 이때, JDK는 1.3 버전 이상, Ant는 1.5 버전 이상이어야 한다.

순서는 다음과 같다.


1 Java 설치

jdk-1_5_0_12 버전이 설치되어 있다. 1.3 버전 이상을 다운로드하여 설치하도록 한다. 설치가 완료되면 환경 변수에 JAVA_HOME으로 C:\Program Files\Java\jdk1.5.0_12 를 등록한다. 그리고 필요한 경우 PATHC:\Program Files\Java\jdk1.5.0_12\bin\ 를 추가한다.


2 Ant 설치

apache-ant-1.7.0 버전이 설치되어 있다. 최신 버전을 다운로드하여 설치한다. 설치 후 PATHC:\Dev\apache-ant-1.7.0\bin\ 를 추가한다.


3 Tomcat 설치

apache-tomcat-5.5.23 버전이 설치되어 있다. 최신 버전을 다운로드하여 설치하도록 한다. 설치 후, 시스템 환경 변수에 CATALINA_HOME으로 C:\Program Files\Apache Software Foundation\Tomcat 5.5을 등록한다.

설치가 완료된 후 Tomcat 서버를 시작해야 한다. 시작되어 있지 않다면 시스템 트레이에서 Apache Service Manager를 사용하여 "Start Service" 한다.

http://localhost:8080 및 http://localhost:8080/jsp-examples 으로 접속하여 제대로 동작하는 지 확인한다.


4 MySql 설치

mysql-5.0.41 버전이 설치되어 있다. 최신 버전을 다운로드하여 설치하도록 한다. 설치 후 PATHC:\Program Files\MySQL\MySQL Server 5.0\bin 를 추가한다.

설치가 완료되었다면 MySQL 서비스를 시작한다. 제어판의 서비스에서 MySQL Service를 더블클릭하여 시작하거나 종료할 수 있다. 서비스에 등록되지 않았다면 C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld-nt -install 하여 등록하면 된다.

커맨드 프롬프트를 열고 mysql -uroot -p를 입력한다. 패스워드를 입력하고 "mysql> "이란 프롬프트가 뜨면 "show databases;"를 입력하여 아래와 같이 나온다면 제대로 설치한 것이다.

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
5 rows in set (0.09 sec)


5 MySql JDBC Driver(MySQL Connector/J) 설치


mysql-connector-java-5.1.0가 설치되어 있다. 다운로드 받은 후, mysql-connector-java-5.1.0-bin.jar 파일을 CATALINA_HOME/common/lib 로 복사하도록 한다.


6 Spirng - Download

Spring Framework 2.0.6 버전을 다운로드한 후 임시 디렉토리에 압축을 해제한다. 아래 내용은 압축을 푼 내용이 "C:\Temp\spring-framework-2.0.6\"과 같은 경로를 갖는 것을 전제로 설명한다.


7 JPetStore Database 세팅

C:\Temp\spring-framework-2.0.6\samples\jpetstore\db\mysql 디렉토리로 이동한다.
텍스트 에디터를 열고 아래와 같이 편집한 후 현재 디렉토리에 "jpetstore-mysql-create-user.sql" 이름으로 저장한다.

-- Create a new user, grant her rights, and set her password.
grant select, insert, update, delete
on jpetstore.*
to jpetstore@localhost identified by 'ibatis9977';

현재 파일 목록은 다음과 같다.

C:\Temp\spring-framework-2.0.6\samples\jpetstore\db\mysql>ls -asCF
total 16
   0 ./      1 jpetstore-mysql-create-user.sql     5 jpetstore-mysql-schema.sql
   0 ../    10 jpetstore-mysql-dataload.sql

아래와 같이 명령을 실행한다. 이때,  jpetstore-mysql-dataload.sql 파일을 편집하여 제일 상단에 "USE JPETSTORE;"라고 편집하도록 한다.

C:\Temp\spring-framework-2.0.6\samples\jpetstore\db\mysql>mysql -uroot -p < jpetstore-mysql-schema.sql
Enter password: ********

C:\Temp\spring-framework-2.0.6\samples\jpetstore\db\mysql>mysql -uroot -p < jpetstore-mysql-dataload.sql
Enter password: ********

C:\Temp\spring-framework-2.0.6\samples\jpetstore\db\mysql>mysql -uroot -p < jpetstore-mysql-create-user.sql
Enter password: ********


8 JPetStore 배포


C:\Temp\spring-framework-2.0.6\samples\jpetstore\dist\jpetstore.warCATALINA_HOME\webapps 하위에 복사한다. 이때, Tomcat이 자동으로 jpetstore를 배포하게 된다.


9 JPetStore - Driver 설정

CATALINA_HOME\webapps\jpetstore\WEB-INF\jdbc.properties 파일을 편집하기 위해 열도록 한다.  다음과 같이 수정한 후 저장한다.

# Properties file with JDBC-related settings.
# Applied by PropertyPlaceholderConfigurer from "dataAccessContext-local.xml".
# Targeted at system administrators, to avoid touching the context XML files.
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jpetstore
jdbc.username=jpetstore
jdbc.password=ibatis9977


10 테스트


Tomcat을 종료 했다가 재시작 한 후 http://localhost:8080/jpetstore 로 접속해 데모를 실행한다.

사용자 삽입 이미지


끝. ^^

"Development Story" 카테고리의 다른 글

2007/08/08 13:50 2007/08/08 13:50
 
Bookmark and Share

AppFuse-light (구 Equinox) 설치

2007/07/11 14:27

몇일 전에 appfuse-light(appfuse-light-struts-ibatis-1.8-beta)를 설치해보았다. 설치 내용을 정리한다.


1 AppFuse 소개


다음은 AppFuseDefinition의 내용을 발췌한 것이다.

AppFuse is a Framework
This is sort of the 10,000 foot view of what AppFuse is. It is a structure in which web applications of a variety of types and sizes are created.

AppFuse is a Directory Structure
One of many features of AppFuse is the way it logically separates code into its appropriate locations based on function. Persistence code belongs in src/dao/, manager code in src/service/, controller code in src/web/ and of cource testing code in test/**/.

AppFuse is a Build File
The build.xml file makes for a nice way to create, build, test, package, deploy webapps. It also nicely handles changing dependancies and maintaining properties that may be different in development than in production.

AppFuse is a Sample Application
AppFuse is an example of how to use and integrate many Java technologies while following best practices. There are examples of how to do everything from performing CRUD opperations from your view all the way to the persistence layer to adding a filter to your webapp. Because the common things that are needed in basically all web applications are already in AppFuse, you will only need to figure out how to do the parts that make your webapp unique.

Figure 1 illustrates the conceptual design of a typical AppFuse application

사용자 삽입 이미지


2 설치(appfuse-light-struts2-ibatis-1.8-beta)


2.1 환경 설정

설치 전 아래의 환경이 세팅되어 있어야 한다. 내가 appfuse-light를 설치한 환경은 JPetStore 데모 설치 (iBATIS 또는 Spring 샘플)내용 중 1~5와 동일하다.

  • J2SE 1.4.2 이상을 설치하고 설치 디렉토리를 가리키는 JAVA_HOME 환경변수를 셋팅한다.
  • Ant 1.6.2 이상을 설치하고 ANT_HOME 환경변수를 셋팅한다.
  • Tomcat 4.1.x 이상(추천되는 버전은 5.0.28)을 설치하고 톰캣 설치 디렉토리를 가리키는 CATALINA_HOME 환경변수를 셋팅한다.
  • MySQL 3.23.x 이상(추천되는 버전은 4.1.7)을 설치한다.
  • junit3.8.1 이상 버전에서 junit.jar를 $ANT_HOME/lib로 복사한다.

2.2 파일 다운로드

AppFuse-light 1.8-beta 다운로드 페이지에서 전체 샘플이 포함된 appfuse-light-all-1.8-beta.zip를 다운로드 하던지 원하는 파일을 다운로드한다. 여기서는 appfuse-light-struts-ibatis-1.8-beta.zip를 다운로드하여 설치한다. 파일이 다운로드되면 압축을 푼다. 아래는 D 드라이브의 Temp 디렉토리에 압축을 푼 모습이다.

D:\Temp\appfuse-light-struts2-ibatis-1.8-beta>ls -asCF
total 54
   0 ./            12 LICENSE.txt         17 build.xml     0 src/
   0 ../            7 README.txt           0 lib/          0 target/
   0 .settings/     1 build.properties    14 pom.xml       3 tomcat.xml

2.3 MySQL 사용을 위한 몇가지 변경 사항

AppFuse는 PostgreSQL을 기본 데이터베이스로 사용한다. MySQL을 사용하기 위해서는 몇가지 변경 사항을 적용하여야 한다.

jdbc.property 변경
D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\src\main\resources\jdbc.properties 파일을 다음과 같이 편집하여 저장한다.

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/appfuse_light?createDatabaseIfNotExist=true
jdbc.username=root
jdbc.password=xxxxxxxx

create-mysql 생성
D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\src\main\java\org\appfuse\dao\ibatis\create-mysql.sql 파일을 새로 만들고 다음과 같이 편집하여 저장한다.

drop table IF EXISTS app_user;
drop table IF EXISTS app_user_sequence;
create table app_user (id bigint not null primary key, first_name varchar(50), last_name varchar(50), birthday timestamp);
create table app_user_sequence (id int not null) type=MYISAM;
insert into app_user_sequence values(0);

build.xml 변경
D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\build.xml 파일을 열어 데이터베이스 테이블 생성 타겟의 내용을 다음과 같이 mysql 을 사용하도록 변경한다. 여기서 mysql-connector-java-5.1.0-bin.jar의 위치는 상황에 맞게 변경하던지 해당 위치에 MySql JDBC Driver를 복사해놓도록 해야한다.

    <!-- create the database -->
    <target name="createdb" description="Create database tables">
        <sql driver="${jdbc.driverClassName}" url="${jdbc.url}"
            userid="${jdbc.username}" password="${jdbc.password}">
            <fileset dir="${basedir}">
                <include name="src/**/create-mysql.sql"/>
            </fileset>
            <classpath refid="compile.classpath"/>
            <classpath>
                <pathelement location="${basedir}/lib/mysql-connector-java-5.1.0-bin.jar" />
            </classpath>
        </sql>
    </target>

applicationContext-ibatis.xml
D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\src\main\webapp\WEB-INF\applicationContext-ibatis.xml 파일을 열어 userIncrementer 부분을 다음과 같이 변경하도록 한다.

    <bean id="userIncrementer" class="org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer">
        <property name="dataSource" ref="dataSource"/>
        <property name="incrementerName" value="app_user_sequence"/>
        <property name="columnName" value="id" />
    </bean>

2.4 어플리케이션 배포

커맨드 프롬프트에 ant deploy를 입력하여 배포한다.

D:\Temp\appfuse-light-struts2-ibatis-1.8-beta>ant deploy
Buildfile: build.xml
compile:
    [mkdir] Created dir: D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\target\classes
    [javac] Compiling 10 source files to D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\target\classes
    [javac] Note: D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\src\main\java\org\appfuse\web\UserAction.java uses unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.
    [mkdir] Created dir: D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\target\test\classes
    [javac] Compiling 6 source files to D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\target\test\classes
     [copy] Copying 3 files to D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\target\classes
copy-jars:
    [mkdir] Created dir: D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\target\jars
     [copy] Copying 23 files to D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\target\jars
deploy:
     [copy] Copying 105 files to C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\appfuse-light
     [copy] Copying 24 files to C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\appfuse-light\WEB-INF\classes
     [copy] Copying 22 files to C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\appfuse-light\WEB-INF\lib
BUILD SUCCESSFUL
Total time: 18 seconds
D:\Temp\appfuse-light-struts2-ibatis-1.8-beta>

2.5 테이블 생성

커맨드 프롬프트에 ant createdb를 입력하여 배포한다.

D:\Temp\appfuse-light-struts2-ibatis-1.8-beta>ant createdb
Buildfile: build.xml
createdb:
      [sql] Executing resource: D:\Temp\appfuse-light-struts2-ibatis-1.8-beta\src\main\java\org\appfuse\dao\ibatis\create-mysql.sql
      [sql] 5 of 5 SQL statements executed successfully
BUILD SUCCESSFUL
Total time: 3 seconds
D:\Temp\appfuse-light-struts2-ibatis-1.8-beta>

2.6 Tomcat 시작 및 테스트

톰캣을 시작한 후 http://localhost:8080/appfuse-light 로 접속한다.

사용자 삽입 이미지


3 참고 사이트

 


"Development Story" 카테고리의 다른 글

2007/07/11 14:27 2007/07/11 14:27
 
Bookmark and Share

JPetStore 데모 설치 - iBATIS 샘플

2007/07/03 19:43

iBATIS(Data Mapper와 DAO framework)의 공식 예제인 JPetStore-5.0을 설치한다. JPetStore는 J2EE의 주요한 예제 샘플 중 하나로 Spring Framework의 샘플로도 포함되어 있는데, 설치 방법은 별반 다르지 않다.

JPetStore 웹 어플리케이션을 배포하기 위해서는 Apache Ant를 사용하여 빌드하여야 한다. 이때, JDK는 1.3 버전 이상, Ant는 1.5 버전 이상이어야 한다.

순서는 다음과 같다.


1 Java 설치

jdk-1_5_0_12 버전이 설치되어 있다. 1.3 버전 이상을 다운로드하여 설치하도록 한다. 설치가 완료되면 환경 변수에 JAVA_HOME으로 C:\Program Files\Java\jdk1.5.0_12 를 등록한다. 그리고 필요한 경우 PATHC:\Program Files\Java\jdk1.5.0_12\bin\ 를 추가한다.


2 Ant 설치

apache-ant-1.7.0 버전이 설치되어 있다. 최신 버전을 다운로드하여 설치한다. 설치 후 PATHC:\Dev\apache-ant-1.7.0\bin\ 를 추가한다.


3 Tomcat 설치

apache-tomcat-5.5.23 버전이 설치되어 있다. 최신 버전을 다운로드하여 설치하도록 한다. 설치 후, 시스템 환경 변수에 CATALINA_HOME으로 C:\Program Files\Apache Software Foundation\Tomcat 5.5을 등록한다.

설치가 완료된 후 Tomcat 서버를 시작해야 한다. 시작되어 있지 않다면 시스템 트레이에서 Apache Service Manager를 사용하여 "Start Service" 한다.

http://localhost:8080 및 http://localhost:8080/jsp-examples 으로 접속하여 제대로 동작하는 지 확인한다.


4 MySql 설치

mysql-5.0.41 버전이 설치되어 있다. 최신 버전을 다운로드하여 설치하도록 한다. 설치 후 PATHC:\Program Files\MySQL\MySQL Server 5.0\bin 를 추가한다.

설치가 완료되었다면 MySQL 서비스를 시작한다. 제어판의 서비스에서 MySQL Service를 더블클릭하여 시작하거나 종료할 수 있다. 서비스에 등록되지 않았다면 C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld-nt -install 하여 등록하면 된다.

커맨드 프롬프트를 열고 mysql -uroot -p를 입력한다. 패스워드를 입력하고 "mysql> "이란 프롬프트가 뜨면 "show databases;"를 입력하여 아래와 같이 나온다면 제대로 설치한 것이다.

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
5 rows in set (0.09 sec)


5 MySql JDBC Driver(MySQL Connector/J) 설치


mysql-connector-java-5.1.0가 설치되어 있다. 다운로드 받은 후, mysql-connector-java-5.1.0-bin.jar 파일을 CATALINA_HOME/common/lib 로 복사하도록 한다.


6 JPetStore - Download

JPetStore 5.0 Example Application 을 다운로드한 후 임시 디렉토리에 압축을 해제한다. 아래 내용은 압축을 푼 JPetStore가 "C:\Temp\JPetStore-5.0"과 같은 경로를 갖는 것을 전제로 설명한다.


7 JPetStore Database 세팅

C:\Temp\JPetStore-5.0\src\ddl\mysql 디렉토리로 이동한다.

C:\Temp\JPetStore-5.0\src\ddl\mysql>ls -asCF
total 16
   0 ./      1 jpetstore-mysql-create-user.sql     5 jpetstore-mysql-schema.sql
   0 ../    10 jpetstore-mysql-dataload.sql

아래와 같이 명령을 실행한다. 이때,  jpetstore-mysql-dataload.sql 파일을 편집하여 제일 상단에 "USE JPETSTORE;"라고 편집하도록 한다.

C:\Temp\JPetStore-5.0\src\ddl\mysql>mysql -uroot -p < jpetstore-mysql-schema.sql
Enter password: ********

C:\Temp\JPetStore-5.0\src\ddl\mysql>mysql -uroot -p < jpetstore-mysql-dataload.sql
Enter password: ********

C:\Temp\JPetStore-5.0\src\ddl\mysql>mysql -uroot -p < jpetstore-mysql-create-user.sql
Enter password: ********


8 JPetStore 배포


C:\Temp\JPetStore-5.0\build\wars\jpetstore.warC:\Program Files\Apache\Tomcat 5.0\webapps 하위에 복사한다. 이때, Tomcat이 자동으로 jpetstore를 배포하게 된다.


9 JPetStore - Driver 설정

CATALINA_HOME\webapps\jpetstore\WEB-INF\classes\properties\database.properties 파일을 편집하기 위해 열도록 한다.  다음과 같이 수정한한 후 저장한다.

####################################
# Database Connectivity Properties
####################################

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jpetstore
username=jpetstore
password=ibatis9977


10 테스트


Tomcat을 종료 했다가 재시작 한 후 http://localhost:8080/jpetstore 로 접속해 데모를 실행한다.

사용자 삽입 이미지

종료. ^^

"Development Story" 카테고리의 다른 글

2007/07/03 19:43 2007/07/03 19:43
 
Bookmark and Share