|
Space Map
|
1장. 사용자 관리 프로젝트로 알아본 스트럿츠 탄생 배경Summary : 스트럿츠 프레임워크 워크북의 1장 원고를 통하여 스트럿츠 탄생 배경에 대하여 총 5번의 강좌를 통하여 알아본다. 이번 강좌에서는 앞의 강좌에서만든 모델을 바탕으로 사용자 관리 프로젝트를 완성하겠다. 단, 개발 방법은 기존에 많은 개발자들이 개발해온 모델 1 방식으로 구현해보도록 하겠다. 3. 모델1 개발방식으로 개발.모델 1개발 방식은 현재 국내에서 가장 많이 사용되고 있는 개발 방식으로 대부분의 개발자들이 이 방법으로 웹 애플리케이션을 개발하고 있다. 물론 모델 2를 이용하는 경우도 있지만, 아직까지는 드물게 사용하고 있는 것으로 보인다. 이 책을 읽는 대부분의 개발자들이 웹 애플리케이션을 주로 개발하는 개발자들이라고 볼 때 모델1 방식으로 개발을 진행해 보았을 것이라 생각한다. 이 절에서는 앞절에서 만든 모델을 이용하여 모델 1개발 방식으로 사용자 관리 프로젝트를 완성할 것이다. 사용자 관리 프로젝트를 완성하면서 모델 1 개발 방식이 무엇이며, 모델 1 개발 방식으로 개발할 경우 장점과 단점에 대해서도 살펴보도록 하겠다. 국내 개발 환경이 점진적으로 모델 2 개발 방식으로 변화해가고 있다. 하지만 모델 1 개발방식으로 개발해야하는 경우에도 모델 2를 적용하는 우를 범하지 말기를 바란다. 3.1 모델1 개발방식이란? 모델 1 개발방식(이하 모델 1)이라고 이름만 거창하지 실상을 알고나면 대부분의 개발자들이 현재 개발하고 있는 개발 방식이라는 것을 알 수 있을 것이다. 모델 1 을 이해하기 위해 다음 그림을 먼저 살펴보자. ![]() [그림 1-10]에서 보는 바와 같이 모델 1 은 JSP 페이지가 요청을 받아 처리한 다음 클라이언트의 응답까지 담당한다. 클라이언트로부터의 요청은 제일 먼저 JSP에게로 전달된다. 작업 요청을 받은 JSP는 자바빈을 이용하여 데이터베이스, 레거시 시스템과 통신하거나, 자신이 직접 자바빈 역할을 수행할 수도 있다. 모든 작업을 수행한 다음 작업 결과물을 클라이언트에게 보여주는 역할까지 한다. 결과물을 보여줄 페이지는 결과물의 상태와 클라이언트로부터 전달된 인자에 따라 결정된다. 이상의 과정을 통해 알 수 있듯이 모델 1에서는 JSP 하나만으로 클라이언트가 요청한 모든 작업을 처리할 수 있다. 사용자 관리 프로젝트를 통하여 모델 1에 대하여 더 구체적으로 살펴보도록 하겠다. 예제 소스를 보면 알겠지만 기존에 자신이 개발하던 방식과 차이가 없다는 것을 느낄 수 있을 것이다. 3.2 모델1 개발방식으로 사용자 관리 프로젝트 완성. 사용자 관리 프로젝트의 모든 예제 소스를 살펴보고 싶지만 지면상 제한이 있기 때문에 사용자 리스트 페이지와 로그인 과정을 통하여 모델 1에 대하여 살펴보도록 하겠다. 각각의 예제 소스들이 개발 방식이 달라짐에 따라 어떻게 달라지는지 보기 위하여 다음 절의 모델2, 스트러츠에서 보게될 예제 소스 또한 같은 것으로 진행할 것이다. 앞절에서 개발한 모델을 이용하여 사용자 리스트를 개발한다면 많은 개발자들은 다음 예제와 같이 개발할 것이다. <%@page contentType="text/html; charset=euc-kr" %> <%@page import="java.util.*" %> <%@page import="net.javajigi.user.*" %> <%@ include file="loginCheck.jsp" %> <% String currentPageStr = request.getParameter("currentPage"); int currentPage = 1; if ( (currentPageStr != null) && (!currentPageStr.equals("")) ) { currentPage = Integer.parseInt(currentPageStr); } int countPerPage = 10; //모델을 이용하여 사용자 리스트를 가져온다. UserManager manager = UserManager.instance(); List userList = manager.findUserList(currentPage, countPerPage); %> <html> <head> <title>Chapter1 사용자 관리</title> <meta http-equiv="Content-Type" content="text/html; charset=euc-kr"> <link rel=stylesheet href="../css/user.css" type="text/css"> </head> <body bgcolor=#FFFFFF text=#000000 leftmargin=0 topmargin=0 marginwidth=0 marginheight=0> <br> <form name="f" method="post" action="user_write.jsp"> <table width=780 border=0 cellpadding=0 cellspacing=0> <tr> <td width="20"></td> <td> <!--contents--> <table width=590 border=0 cellpadding=0 cellspacing=0> <tr> <td bgcolor="f4f4f4" height="22"> <b>사용자 관리 - 리스트</b></td> </tr> </table> <br> <!-- list --> <table border="0" cellpadding="0" cellspacing="1" width="590" bgcolor="BBBBBB"> <tr> <td width=190 align=center bgcolor="E6ECDE" height="22">사용자 아이디</td> <td width=200 align=center bgcolor="E6ECDE">이름</td> <td width=200 align=center bgcolor="E6ECDE">이메일</td> </tr> <% Iterator userIter = userList.iterator(); //사용자 리스트를 클라이언트에게 보여주기 위하여 출력. while ( userIter.hasNext() ) { User user = (User)userIter.next(); %> <tr> <td width=190 align=center bgcolor="ffffff" height="20"> <%= user.getUserId() %> </td> <td width=200 bgcolor="ffffff" style="padding-left:10"> <a href="user_view.jsp?userId=<%= user.getUserId() %>" class="user"> <%= user.getName() %> </a> </td> <td width=200 align=center bgcolor="ffffff"> <%= user.getEmail() %> </td> </tr> <% } %> </table> <!-- /list --> <br> <!-- button --> <table border="0" cellpadding="0" cellspacing="1" width="590"> <tr> <td align="right"> <input type="submit" value="사용자 추가"/> </td> </tr> </table> </td> </tr> </table> </form> </body> </html> [예제 1-4]는 클라이언트에게 사용자 리스트를 보여주는 JSP이다. 먼저 JSP에 전달되는 인자들을 처리한다. 인자의 값에 따라 앞절에서 개발한 모델에 접근하여 사용자 리스트를 가져온 다음, 사용자의 리스트를 클라이언트에 보여주는 방식이다. [예제 1-4]에서 JSP가 처리한 작업은 인자에 대한 처리, 모델과의 통신, 클라이언트에 결과값을 보여주는 작업을 하였다. [예제 1-4]가 모델 1 방식으로 모델로부터 사용자 리스트 정보를 얻어와 클라이언트에게 보여주는 과정을 시퀀스 다이어그램으로 보면 다음과 같다. ![]() [그림 1-11]을 보면 사용자 리스트 화면을 클라이언트에게 서비스하기 위하여 user_list.jsp가 모델파트의 인터페이스를 담당하고 있는 UserManager클래스에 직접 접근하는 것을 확인할 수 있다. [예제 1-4]에서 사용한 모델은 모델2, 스트러츠에서도 공통적으로 사용하기 때문에 위와 같이 생성할 수 밖에 없었다. 하지만, 현업에서 모델 1 으로 개발할 경우에는 자바빈을 만들어 개발하는 경우가 더 많다. 아마도 많은 JSP개발자들은 >jsp:useBean /<, >jsp:setProperty/<, >jsp:getProperty/< 태그들의 사용이 더 친숙할 것이다. 경우에 따라서는 JSP에 앞절에서 개발했던 데이터베이스와의 작업까지 모두 포함되어 있는 경우도 종종본다. 다음은 로그인 페이지에서 사용자 아이디와 비밀번호를 받아 로그인 과정을 처리하는 JSP예제이다. <%@page contentType="text/html; charset=euc-kr" %> <%@page import="net.javajigi.user.*" %> <% try { String userId = request.getParameter("userId"); String password = request.getParameter("password"); //모델에 로그인 작업을 위임한다. UserManager manager = UserManager.instance(); manager.login(userId, password); //정상적으로 로그인 되었을 경우 세션에 사용자 아이디 저장. session = request.getSession(); session.setAttribute("userId", userId); //모든 작업 완료후 이동할 페이지를 결정. response.sendRedirect("user_list.jsp"); } catch (Exception e) { %> <!-- 에러가 발생할 경우 이전 페이지로 이동. --> <script language="javascript"> alert("<%= e.getMessage() %>"); history.back(); </script> <% } %> [예제 1-5]은 로그인 페이지에서 사용자 아이디와 비밀번호를 받아 모델에 로그인 작업을 위임한 다음 로그인 과정이 정상적으로 처리되면 사용자 아이디를 세션에 저장하는 작업을 수행한다. 또한 모든 작업이 완료한 다음 이동할 페이지에 대한 결정도 한다. 만약 에러가 발생할 경우 이전 페이지로 이동하도록 한다. [예제 1-5]에서 JSP가 처리한 작업은 인자에 대한 처리, 모델에 로그인 과정을 위임, 로그인 결과에 따라 이동할 페이지를 결정하는 작업을 했다. [예제 1-4]와 [예제 1-5]를 보면 기존에 개발하던 방식과 같기 때문에 쉽게 이해할 수 있을 것이다. 지금까지 많은 웹 애플리케이션에서 모델 1 을 채택하여 개발해왔다. 개발자들은 자신이 개발하던 개발 방식이 모델 1인지도 모르게 모델 1 을 사용하고 있었던 것이다. 그러나 모델 1 대신 모델 2를 이용하고자 하는 움직임이 서서히 일고 있다. 모델 1의 장점과 한계점을 살펴보면서 모델 2 개발 방식이 필요한 경우를 살펴보도록 하자. 모델 1으로 개발한 사용자 관리 프로젝트는 /chapter1 디렉토리 아래의 build.xml의 model1 타겟을 이용하여 war로 묶을 수 있은 다음 디플로이까지 가능하다. 디플로이까지 자동화하기 위해서는 시스템 환경변수에 CATALINA_HOME이 추가되어 있어야 한다. ANT툴의 model1 타켓을 이용하여 빌드하는 방법은 다음과 같다. > ant model1 빌드 후 Tomcat 애플리케이션 서버를 시작한 다음 http://localhost:8080/chapter1/model1/login.jsp 로 접근하면 모델 1 방식으로 개발된 사용자 관리 프로젝트를 실행해 볼 수 있다. 초기 관리자 아이디와 비밀번호는 admin/admin 이다. 앞으로 진행되는 모든 예제는 이와 같이 war로 빌드하여 테스트가 가능하도록 구현할 것이다. 예제 소스에서 수정하고자 참고사항 이 책은 프로젝트 위주로 진행되기 때문에 무수히 많은 예제소스들이 존재한다. 하지만 모든 소스를 책에 실을 경우 책의 분량 증가, 예제 소스에 대한 설명 때문에 개념 설명의 부족등으로 인해 중요한 부분만 책에 실고 있다. 따라서 이 책을 더 효율적으로 읽기 위해서는 각 장이나 절을 읽기 전에 예제소스를 빌드해보고 한번씩 실행해보는 것이 좋다. 각 소스는 미리 볼 수는 없지만 미리 테스트를 함으로서 책의 내용을 더 쉽게 이해할 수 있을 것이다. 3.3 모델 1 개발 방식의 장,단점 모델 1 의 가장 큰 장점은 모델 2 개발 방식에 비하여 배우기 쉽다는 것이다. 클라이언트가 요청한 대부분의 작업을 JSP에서 처리하기 때문에(대부분의 경우 자바빈을 같이 이용하는 경우가 더 많다.) JSP에 대해서만 공부해도 쉽게 구현할 수 있다. 국내 IT가 급격히 성장하면서 수 많은 사람들이 웹 개발자가 되기 위하여 프로그램에 대한 지식이 없는 상태에서 웹 애플리케이션을 개발하게 되었다. 웹 개발을 처음 접한 개발자들에게 모델 1 은 모델 2에 비하여 쉽게 접근할 수 있는 개발 방식이였다. 두번째 장점은 개발 속도가 빠르다는 것이다. 계속되는 절에서 살펴보겠지만 모델2 개발 방식은 개념적으로 이해하기도 어려울 뿐만 아니라, JSP외에 수많은 클래스를 생성해야 하기 때문에 모델 2로 개발한 경험이 없는 개발자들일 경우 모델 1보다 더 많은 개발 시간을 요하게 된다. 국내에서 폭발적으로 증가하는 웹 애플리케이션을 감당하기 위하여 지금까지 모델 1의 웹 개발이 주류가 된 것이 당연한 것인지도 모르겠다. 하지만 위와 같은 장점에도 불구하고 모델 1은 서서히 한계점을 드러내고 있다. 주요 원인은 웹 애플리케이션의 규모가 점점 커지고 모델 1 이 유지보수가 어려운 이유는 다음과 같다. 첫째, JSP의 목적은 클라이언트에게 보여줄 뷰를 생성하는 것이 목적임에도 불구하고 너무 많은 작업을 담당하고 있다. 이는 결과적으로 JSP 소스코드가 길어질 수 밖에 없으며, 프리젠테이션 로직과 비즈니스 로직이 혼재되어 있기 때문에 JSP가 복잡해 질 수 밖에 없다. 둘째, JSP가 복잡해지면 복잡해 질수록 개발자와 디자이너의 분리된 작업은 힘들어 진다. 초기개발시에는 분리 작업이 가능하겠지만 유지보수시에는 개발자없이 디자이너 혼자 JSP를 수정하기란 거의 불가능하다. 셋째, 웹 애플리케이션에 대한 기대치가 높아지면서 사용자들의 증가되는 요구사항을 모델 1으로 감당하기 힘들다. 가끔 복잡한 JSP를 보면 1000라인이 넘는 JSP파일도 종종 볼 수 있다. 클래스의 경우에는 1000라인이 넘더라도 메소드별로 구분되어 있기 때문에 수정할 부분을 찾기란 어렵지 않다. 하지만 JSP의 경우에는 1000라인이 넘을 경우 수정해야할 부분을 찾는데만도 상당한 시간을 소비하게 된다. 따라서 JSP는 뷰를 위한 프리젠테이션 로직만을 담당하도록 구현할 필요가 있다. 이를 위한 방법으로 모델 2 개발 방식이 대안으로 떠오르고 있는 것이다. 하지만 모델 1으로 개발하지 말아야되는 것은 아니다. 모든 작업을 위해서는 가장 알맞은 연장이 필요하다. 삽이 필요한 곳에 포크레인으로 작업할 필요는 없는 것이다. 다음과 같은 경우에는 모델 1을 적용하는 것에 대하여 고려해 보아야 할 것이다. 첫째, 개발 기간이 짧은 프로젝트이다. 둘째, 개발자가 소규모인 경우이다. 분업화가 필요없이 모델에서 뷰까지 한명의 개발자가 모두 개발하는 모든 프로젝트가 다 그렇겠지만 적재적소에 가장 적합한 도구를 적용할 때 개발 효율도 증가하며, 성공하는 프로젝트를 만드는 밑거름이 된다. 강좌에 대하여작성자 : 박재성 문서이력 :
참고 자료
|
|



Add Comment