Web application을 개발하기위해 활용되는 design model(programming model)은 크게 2가지로 나뉜다.
Servlet과 JSP를 중심으로 application을 개발한다.
Browser에서 받은 요청(request)을 처리하기위해 servlet은 (process를 생성하는 대신) thread를 생성하여 request를 처리한다. 이런 방식의 장점은 요청 처리 작업을 위한 별도의 memory area를 할당하지 않아도 된다는것이다. 그래서 여러개의 request를 연이어서 쉽게 처리할 수 있다. 반면, servlet은 Java로 작성되어 designing code를 수정하면 recompile되어야한다. 그리고 presentation과 business logic이 섞여서 update 및 관리가 복잡해질 수 있는 concern을 갖고있다.
그래서 JSP를 servlet과 함께 사용한다. Presentation쪽 일은 JSP가, logic쪽은 servlet이 맡는다. JSP는 JavaBean, custom tags, JSTL을 사용해서 business logic과 browser화면 사이의 interface 역할을 수행한다.
1. Browser가 JSP page로 request를 보낸다.
(Web Server(정적 HTML) --> WAS의 JSP or Servlet --> JavaBean 이런 flow임.)
2. JSP는 JavaBean을 access해서 business logic을 invoke한다.
3. JavaBean은 DB와 연결하여 새로운 data를 저장하거나 저장했던 data를 가져온다. 여기에서 JavaBean이 model 역할을 한다. Model이 DB와 연결하여 data의 business logic을 처리한다. (e.g., CRUD 역할을 수행하는 DAO, data를 넣어 보내는 가방과 같은 역할의 DTO)
4. Request에 대한 response가 JSP로 부터 생성되어서 browser로 보내진다.
-web application 개발에 매우 용이하다. (빠르고 쉽게)
-Decentralized navigation control: 모든 page들이 각각 다음 페이지로 넘어가는 logic을 갖고있다. 그래서 만약 JSP page의 이름이 변경된다면, 모든 연관 page들의 logic에서 변경이 반영되어야한다. 관리가 복잡함.
-hard to extend: 작은 applicaition에는 적합하지만, 큰 application에는 적합하지 않음
-business logic과 presentation을 완전히 분리하기 어려움.
MVC model은 OOP based user interface에 처음 소개되어 오랫동안 GUI (graphical user interface) 개발 분야에서 사용되었던 design pattern이다. 이 design pattern이 web 응용 프로그램 개발에 적용되어서 Model1의 부족한점을 채우고 큰 scale에서도 개발과 관리가 더 쉬워지도록 만들어주고, "Model2 또는 MVC Model"로 구분된다.
MVC model은 web 응용 프로그램을 구성하는 server module을 개발할때에 사용자에게 보이는 표현인 view, 자료와 비즈니스 로직 처리인 model, 이들 상호간의 흐름을 제어하는 controller로 분리시켜서 개발한다.
아래 그림과 같이 MVC pattern은 Model,View,Controller로 구성되어있다.
Model: The model represents the state (data) and business logic of the application.
View: The view module is responsible to display data i.e. it represents the presentation.
Controller: The controller module acts as an interface between view and model. It intercepts all the requests i.e. receives input and commands to Model / View to change accordingly. (quoted from javatpoint.com)
MVC가 Model1(JSP+JavaBean)방식과 가장 큰 다른점은 MVC의 controller가 흐름을 제어한다는것이다.
Controller가 browser에서부터 모든 요청을 받고, 요청과 응답을 어떻게 처리할지를 제어한다.
흐름:
Controller가 browser로 부터 요청을 받고 --> Model(JavaBean) --> access DB (execute business logic)--> Controller가 선택한 JSP를 통해 browser에 응답을 보낸다.
더 상세하게 Controller가 동작하고 요청을 처리하는 순서를 보면:
(여기서 잠깐 review!
클래스의 멤버변수를 초기화하는 방법은 2가지:
1)생성자/constructor
2)setter()
Servlet container가 구동되는 경우에는 이 2가지 방법대신 Controller Servlet의 init()메소드를 자동호출해서 맴버 변수들을 초기화 한다. 이렇게 자동 호출되는 메소드는 "call back method"라고 부른다.)
Controller Servlet이 HTTP요청을 받으면 service()를 통해 Controller의 doGet() 또는 doPost() method가 자동호출된다.
Client가 요구하는 기능을 분석해서 (e.g., 게시판 글쓰기, 글 조회, 등등)
요청한 business logic을 처리하는 model(JavaBeans such as DAO, DTO)를 사용해서 필요한 data 작업을 처리한다. (e.g., CRUD)
처리한 결과를 request 또는 session의 setAttribute() 메소드를 사용하여 request/session 객체에 저장한다.
Controller가 알맞는 view(JSP)를 선택한다.
View(JSP)로 request/session을 전송하기위해 forward 또는 필요시 내장객체의 전송없이 page 이동만을 위해 sendRedirect한다. JSP에서 구현한 코드로 HTTP 응답을 전송하고 browser에 응답을 보여주는 결과를 render한다.
이렇게 browser로부터 요청을 들어올때마다 요청(request) 객체가 생성된다.
HTTP 규약으로, 요청이 오고, 응답처리가 되면, 연결이 끊기고 request 객체도 메모리에서 해제된다. 만약 20개의 요청이 들어오면, tomcat의 pool에 20개의 request 객체가 생긴다. 그 request 객체를 Servlet, JSP가 받아서 사용하는 것이다. 응답 전송 완료 후, 이 request 객체들을 사라진다.
Servlet이란 무엇인지 간단히 정리해보면, 중요한 특징은 2가지다:
1) Servlet은 class인데 요청을 할 수 있는 class이다.
(e.g.,browser에 주소를 넣어서 client의 요청을 받는것, 등등)
2) Servlet이 객체를 직접 생성하지 않는다.
대신 Tomcat에세 객체를 생성하라고 지시한다. (Web Dynamic Project의 경우, web.xml과 같이 WEB_INF에 있는 설정내용을 참고하여 생성하도록한다. 예를들어 web.xml에서 servlet 태그안에서 Controller로 지정할 클래스를 설정한다. servlet-name은 Controller로, servlet-class는 해당 Controller 클래스의 full name으로 지정하고, init param에는 Controller 클래스의 맴버 변수로 메모리에 올라갈 parameter 이름과 값을 지정한다.)
주의: Controller는 Servlet과 동일한것이 아니다!
MVC model에서 controller역할이 있고, 그 역할을 구현하기위해 Servlet을 활용하는 것이다. 그래서 MVC pattern의 경우에는 controller = servlet이 맞다.
MVC pattern에서 Controller는 command pattern에 기반하여 요청을 처리한다. Controller의 역할을 action이라는 것과 나누어서 수행하는 것이다. (Controller가 요청+응답 흐름을 전체적으로 다 제어하기때문에, front-controller, back-controller로 나뉜다. action의 역할은 back-controller와 model(JavaBean)사이에 있다고 보면 됨)
Controller가 처리하는 요청(client의 명령) 하나당 action handler를 만든다.
Command Handler는
-interface이고 (e.g., Action interface)
-JSP, Beans, EJB를 통해서 Command Handler interface를 구현한다. (e.g., CreateAction class, ReadAction class, DeleteAction class, etc...)
Controller와 Command Handler가 요청을 처리하는 순서:
1. Servlet(Controller)가 browser로부터 HTTP 요청을 받는다.
2. client가 요구하는 기능을 분석 (e.g., 게시판 글 쓰기)
3. logic을 처리할 명령어 handler를 생성한다. --> Command Handler class 객체를 생성한다.
Controller의 doGet() 또는 doPost() 메소드가 자동 호출되면, 그 메소드 안에서 config.properties에서 명시해둔 command=Action Class Mapping List (e.g., /create.do=action.CreateAction)에 따라 요청받은 .do에 따른 Command Handler class 객체를 생성한다. (또는 미리 생성해둔것을 불러온다?)
4. 명령어 handler를 이용해서 logic을 처리한다. (e.g., CreateAction.java, createForm.jsp, CreateProcAction.java)
5. 결과를 저장하고, View를 리턴한다.
6. Command Handler가 return한 View로 forward (또는 sendRedirect)한다.
7. JSP --> HTTP 응답 --> browser rendering으로 응답처리까지 마무리.
forward 방식으로 page이동을 하면, URL이 바뀌지 않는다. Request 객체에 attribute를 담아서 forward하는것이다. response로 응답 처리되기전까지 계속 request객체에 저장된 모든 data가 유지되는 상태로 다른 jsp page로 forward할 수 있다.
sendRedirect 방식으로는 URL이 바뀐다. 이동한 새로운 jsp에서는 이전 jsp에서 request에 담았던 attribute가 없다. 새롭게 request객체가 생성된다.
JSP에서 다른 page를 요청하는 방식은 3가지로 나뉜다.
위에서 언급한 forward, sendRedirect, 그리고 include가 있다.
include는 다른 자원을 요청 페이지에 포함시키는 것이다.
예를 들어서 template형태로 jsp page를 구성할 경우, 계속 일정한 상단메뉴를 동일하게 넣고싶다면, top.jsp파일을 따로 하나 생성해서 그 파일안에 상단메뉴를 구현 할 코드를 작성해넣는다.
<jsp:include page="./top.jsp"></jsp:include>
template.jsp 파일안에는, 위와 같이 jsp:include 태그로 이 페이지에 포함시킬 다른 자원을 명시한다.
-centralized navigation control: Controller하나가 페이지 이동을 결정하는 logic을 갖고있다.
-관리(maintain)에 용이하고, 확장(extend)이 쉽고, test하기 쉽다
-controller를 직접 작성해야하고 controller가 변경되면 class를 recompile하고 application을 다시 deploy해야 한다는 점.
JSP + JavaBeans 개발 순서
① DBMS 설정
② DTO(Data Transfer Object) Class 제작
③ DAO(Data Access Object) Class 제작
④ Service Class 제작
⑤ Service/DAO test
⑥ JSP 생성 연동
MVC Web Application 개발 순서
① DBMS 설정
② DTO(Data Transfer Object) Class 제작
③ DAO(Data Access Object) Class 제작
④ Service Class 제작
⑤ Service/DAO test
⑥ Servlet Controller 제작
⑦ Action Interface 제작
⑧ Action 구현 Class 제작
. Service Class 연동
⑨ JSP 생성 연동
References:
1. MVC(Model, View, Controller)모델, MVC 개발
2. Model 1 and Model 2 (MVC) Architecture from JavaTpoint