웹 애플리케이션을 만들기 위한 일종의 아키텍처, 혹은 SW Model이다. 궁극적으로 가자고 하는것은 Model2 (MVC모델)이지만 Model1 형태대로 웹 애플리케이션을 구성했을 때 특징과 구조, 장단점을 살펴본다.
학습목표
Model 1의 구조를 이해하고 장단점을 설명할 수 있다.
Model 2의 구조를 이해하고 개발 방법을 설명할 수 있다.
Model 1
JSP가 Presentation Layer에서 일어나는 모든 일을 담당함
Model 1에선 JSP가 상당히 중요한 역할을 처리함
JSP 페이지 내에 많은 Java 코드가 포함됨
- 입력값 처리
- 페이지 네비게이션
Model 1은 JSP와 자바 클래스(JavaBeans)로 구성되어 역할을 나눠 처리함
Model 1의 장단점
- 장점 : 간단하고 빠르게 프로그램을 작성할 수 있음
- 단점
- 개발자들 사이의 역할 분담이 적절히 안 됨
- 구현할 기능이 많을수록 중복된 코드를 가지고 있는 페이지의 수가 많아지고 결국 구현된 기능들끼리의 연관관계를 파악하는 가독성은 저하됨
- 개발된 후 새로운 로직 추가나 페이지 분산과 같은 변경이 생겼을 경우 수정이 어려움
- 많은 개발자들이 참여한 프로젝트일수록 소스에는 각각 개발자의 개성이 담겨져 있어서 더욱 유지보수가 어려움
JSP Beans
public class ModelBeans {
private String id;
private String password;
private boolean logon;
public ModelBeans(){}
// ................
public boolean dbCheck(){
boolean check = false;
if(id.equals("guest") && password.equals("1234"))
check = true;
SetLogon(check);
return check;
}
}
JSP
<%@ page contentType="text/html;charset=euc-kr"%>
<HTML>
<TITLE>Model1</TITLE>
<BODY>
<jsp:useBean id="login" class="ch16.ModelBeans"/>
<jsp:setProperty name="login" property="id"/>
<jsp:setProperty name="login" property="password"/>
<%if(login.dbCheck()){%>
<jsp:getProperty name="login" property="id"/>님 login 되셨습니다 *^^*
<%} else {%>
<jsp:forward page="loginBeans.html"/>
<%}%>
</BODY>
</HTML>
Model 1은 JSP와 Beans class로 개발함
Model 2
- Model 1을 비판하며 등장한 것이 Model 2로, Model 2는 View에서 모든 자바 코드들을 제거함
- View : 화면에 출력되는 부분(JSP)
- Model 1에서 JSP가 처리하던 부분을 JSP에서 빼고자 함
- MVC(Model-View-Control) 구조로 Servlet과 JSP페아지의 역할이 명확하게 분리됨
- 하나의 업무 처리를 하나에서 하는게 아니라 역할을 분리시켜 각 역할 파일이 나눠 처리함
- 화면 디자이너와 자바 프로그래머가 같이 작업하는 프로젝트 팀인 경우 Model 2의 효과는 극대화됨
응용프로그램 로직 레이어 : Model 부분으로 응용프로그램의 데이터를 관리하거나 비즈니스 로직을 처리함
프레젠테이션(화면) 레이어 : View에 해당되는 부분으로 웹 페이지의 형태 및 디자인을 결정함
컨트롤 레이어 : Control에 해당되는 부분으로 응용프로그램의 제어를 관리함
Model 2의 장점
- 개발자 간의 역할 분담을 명확하게 가져갈 수 있음
- 로직과 프레젠테이션의 분리로 인해 유지보수가 용이함
Model 2의 단점
- Model 2는 기능별로 여러 파일이 생성되므로 복잡성이 높아질 수 있음
- Control의 역할이 증대되어 복잡성 증대 가능성 --> Framework을 쓰는 경우로 진화
Model
- MVC에서 Model의 기능
- 화면과 전혀 상관 없음
- 응용프로그램의 데이터를 관리하거나 비즈니스 로직을 처리함
- Model은 JSP Beans의 형태로 작성함
- 정보의 구조와 서로 간의 관계를 표현함
- DB에서 관리하는 정보와 직접 관련되어 있는 경우가 많음
- 비즈니스 객체들로 구성됨
- 애플리케이션 기능의 중요한 부분을 포함
- 애플리케이션의 상태를 가지고 있음
- 비즈니스 로직을 제어하는 규칙을 가짐
- DB의 데이터 지속성을 관리함
package beans;
public class ModelBeans{
private String id;
public ModelBeans(){}
public void setId(String id){ this.id=id; }
public String getId(){ return id; }
public boolean dbCheck(){ return; }
}
개발자 순수 Class이기 때문에 특별한 작성 규칙은 없음
View
- MVC에서 View의 기능
- Model에 의해 처리된 데이터를 적절한 모양으로 디스플레이 함
- 단순히 디스플레이 기능만을 제공하고 로직 처리에 관련된 부분은 Model에 위임함
- HTML 표현에 적합한 JSP로 작성됨
- Model 객체의 데이터를 디스플레이 하기 위해 useBean 액션과 setProperty, getProperty 액션을 이용함
- 정보를 사용자에게 보여줌
- 개발자와 별개로 디자이너가 View를 디자인
- 서버에 있는 컴포넌트들과 서로 역할을 주고받지 않고 UI 수정이 가능함
<%@ page contentType="text/html;charset=euc-kr"%>
...
<jsp:useBean id="login" class="beans.ModelBeans" scope="session"/>
<center>
<%if(login.dbCheck())}%>
<jsp.getProperty name="login" property="id"/>님 login 되셨습니다 *^^*
<%} else {%>
<jsp:forward page="/mvc.html"/>
<%}%>
Controller
- MVC 패턴 전체의 연결 고리
- 클라이언트의 요청은 Controller를 통해 애플리케이션에 제출됨
- Controller는 비즈니스 로직과 화면 요소가 없음
- Model과 View의 중재자 기능을 제공하므로 Servlet 클래스로 작성함
- 최초로 사용자의 요청을 받아들여 사용자 입력정보나 이벤트를 처리함
- Model 객체를 이용하여 Business 로직을 처리함
- Model 객체에 들어있는 데이터를 출력할 적절한 View(JSP)를 연결함
public class MvcControl extends HttpSetvlet {
protected void doPost(...) throws ServletException, IOException {
String id = request.getParameter("id");
...
beans.ModelBeans login = new beans.ModelBeans();
login.setId(id);
login.setPassword(pass);
HttpSession session = request.getSession();
session.setAttribute("login", login);
RequestDispatcher rd = getServletContext().getRequestDispatcher("/mvcView.jsp");
re.forward(request, response);
}
}
extends HttpServlet --> Servlet으로 작성된다.
실습
ModelBeans.java
model이 실행이 되고, 그 실행 결과 값을 저장하기 위한 클래스
package ch16;
public class ModelBeans {
private String id;
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Controller 역할을 할 수 있는 Servlet 생성
MvcControl.java
@WebServlet("/control.do")
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("id");
String pw = request.getParameter("password");
ModelBeans beans = new ModelBeans();
beans.setId(id);
beans.setPassword(pw);
HttpSession session = request.getSession();
session.setAttribute("login", beans);
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/ch16/mvcView.jsp");
dispatcher.forward(request, response);
}
클라이언트한테 받은 데이터를 Bean에 등록하여 Bean에서 유지되도록 작업함
View로 Dispatch 시키기 위해 RequestDispatcher 객체 준비
최종 결과 값을 확인하기 위한 JSP가 mvcView 라는 가정
dispatch 시킴
로그인 화면을 위한 HTML 파일 생성
login.html
<body>
<form method="post" action="/WebLab/control.do">
id : <input type="text" name="id"/><br/>
pw : <input type="password" name="password"/></br>
<input type="submit"/>
</form>
</body>
유저와 아이디와 패스워드를 입력한 다음에 submit을 눌렀을 때 servlet controller가 실행됨
컨트롤러에 의해서 model이 이용됨
View 파일 만들기 위해 동일 폴더에 'mvcView' JSP 파일 생성
mvcView.jsp
<body>
<jsp:useBean id="login" class="ch16.ModelBeans" scope="session"></jsp:useBean>
<center>
<jsp:getProperty name="login" property="id"/>님 환영합니다.
</center>
</body>
컨트롤러가 저장한 model 데이터를 추출하여 출력함
테스트를 위해 HTML 실행
id, pw를 입력하고 제출 버튼을 누르면 controller가 실행되고(Servlet), Servlet에 의해서 데이터가 Model 객체에 담기고, JSP View가 실행되면서 결과 출력
--
Beans와 Controller는 Java 쪽에, 화면 구현을 위한 html과 View는 webapp 쪽에 만들었다.
처음에 돌렸을때는 인강처럼 View 코드에서 Login으로 쓰고 했는데 "null님 환영합니다." 나와서 엥? 하다가 어제 오류났던거랑 비슷한 결인것 같아서 Login -> login 으로 고쳤더니 잘 작동됐다. 이유는 모른다 ㅎ; 고쳤으니 일단 넘어가..
둘 다 소문자로 바꿔야한다. 하나만 바꾸면 500 에러남~~!
'온라인 강좌 > JSP & Servlet 활용' 카테고리의 다른 글
18차시 Project - 환경 구축 (0) | 2023.07.04 |
---|---|
17차시 Spring Boot (0) | 2023.07.04 |
15차시 Custom Tag (0) | 2023.07.03 |
14차시 JSTL - Formatting (0) | 2023.07.03 |
13차시 JSTL - Core (0) | 2023.07.02 |