Model 2 아키텍처
- –주로 복잡한 요구사항을 처리하는 웹 애플리케이션에서 MVC(Model-View-Controller pattern) 패턴을 사용한다. MVC 패턴은 코딩과 유지보수를 쉽게 하고, Model 2 아키텍처라고도 불린다.
- –MVC 패턴에서의 모델(model)은 자바빈즈로 구성되고, 뷰(view)는 JSP, 그리고 컨트롤러(controller)는 서블릿으로 구성된다.
- –DAO 클래스와 같은 데이터 클래스의 메소드는 데이터 저장소의 데이터를 조회하거나 저장하는데 사용된다.
- –MVC 패턴을 사용할 때는 가능한 한 각 레이어를 독립적으로 구성해야 한다. 그래야만 하나의 레이어를 수정하더라도 다른 레이어에 미치는 영향을 최소화 할 수 있다.
이론
요청 리다이렉트
– 문법
response.sendRedirect("url");
– 사용 예
response.sendRedirect("http://www.naver.com");
response.sendRedirect("/guestbook?a\=deletefrom&id\=10");
- 요청 디스패치 (Forward) vs 리다이렉트
- RequestDispatcher 객체의 forward 메소드는 동일 서버의 다른 자원(JSP, 서블릿 등)에게 제어를 넘긴다. 동일한 서버에서 요청이 처리되고, 지정된 자원에서 request 객체와 response 객체에 접근한다.
- ServletContext 객체의 getReqestDispatcher 메소드를 사용해서 RequestDispatcher 객체를 얻는다.
- ServletContext 객체를 얻기 위해서는 HttpServlet 클래스의 getReqestDispatcher 메소드를 사용한다.
- 다른 서버의 자원에 제어를 넘길 때는 response 객체의 sendRedirect 메소드를 사용한다.
- sendRedirect 메소드를 사용하면 지정된 자원에서 request 객체와 response 객체에 접근할 수 없다.
- 공통점
- 둘 다 다른 페이지를 호출하는 방법으로 사용된다.
- 차이점
- 유저는 하나 이상의 페이지가 연관 된 것을 알 수 없다.
- 포워드 - 새로운 페이지는 이전 페이지에서 처리하던 것과 같은 요청을 처리하게 하고 응답하여 브라우저는 하나 이상의 페이지가 연관 된 것을 알 수 없다.
- 리다렉트 - 첫번째 페이지는 브라우저에게 새로운 페이지로 다시 요청해야 한다는 내용의 응답을 보낸다. 브라우저는 이 응답을 받으면 즉시 새로운 페이지로 다시 요청을 보낸다.
ex)
응답코드 : 302, 301
location : 새 페이지 URL
서블릿 또는 jsp코드에서 실제사용)
response.sendRedirect( url )
실습
emaillist02
먼저
Dao와 Vo는 똑같은거 쓰겠다.
하지만 하나 바뀐게 있다.
보면 controller가 추가된 것 을 볼수있다.
Controller 를 서블릿으로 쓰는게 model1 정말 많이 다르게 보인다...
컨트롤러는 클라이언트에서 받아오는 리퀘스트를 들을 요청에 맞게 알맞은 URL로 보내주거나 포워딩 하거나, 응답한다.
코드로 한번 살펴보자
// EmaillistController.java (servlet)
public class EmaillistController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// post 방식으로 전달받는 파라미터 값의 엔코딩 처리
request.setCharacterEncoding("utf-8");
String action = request.getParameter("a");
if ("form".equals(action)) {
// 3. view로 포워딩
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/form.jsp");
rd.forward(request, response);
} else if ("add".equals(action)) {
String firstName = request.getParameter("fn");
String lastName = request.getParameter("ln");
String email = request.getParameter("email");
EmaillistVo vo = new EmaillistVo();
vo.setFirstName(firstName);
vo.setLastName(lastName);
vo.setEmail(email);
new EmaillistDao().insert(vo);
// 2 redirect 응답
response.sendRedirect(request.getContextPath() + "/el");
} else if ("delete".equals(action)) {
String firstName = request.getParameter("fn");
String lastName = request.getParameter("ln");
String email = request.getParameter("email");
EmaillistVo vo = new EmaillistVo();
vo.setFirstName(firstName);
vo.setLastName(lastName);
vo.setEmail(email);
new EmaillistDao().insert(vo);
// 2 redirect 응답
response.sendRedirect(request.getContextPath() + "/el");
} else {
/* default request(action) */
// 1. 요청처리
List<EmaillistVo> list = new EmaillistDao().findAll();
// 2. request범위에 데이터(객체) 저장
request.setAttribute("list", list);
// 3. view로 포워딩
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/index.jsp");
rd.forward(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response); // Post를 구분 안하고 처리 하겠다.
}
}
위의 코드를 보면 일딴 모든 리스트를 request에 객체를 저장하고
담아서 인덱스에 보내주고
index.jsp는 그걸 받아서 보여준다.
간단하다.
자그럼 index.jsp 에서 form태그를 이용해 요청하면 어떻게 될까?
/add 인지 /delete 인지 확인후 알맞은 DAO를 실행한다.
정말 쉽다.
model 1과 다른건 단지 컨트롤러가 있냐 없냐의 차이다.
큰 차이지만 별거 없다.
코드를 모두 올리기에는 복잡하니
mvc 1 로 만든 emaillist01
https://github.com/stpn94/servlet-practices/tree/master/emaillist01
mvc 2 로 만든 emaillist02
https://github.com/stpn94/servlet-practices/tree/master/emaillist02
코드를 둘다 켜서 뭐가 다른지 확이하면서 잘 이해하길 바란다.
참고로 xml 설정이나 의존설정은 생략했다.
하지만 설정코드는 복사붙여넣기하고 혼자 이해하는게 더 잘 습득될꺼같으니 이만 설명은 마치겠다.
++++++++++++++++++++
++++++++++++++++++++
'Dev > Servlet&JSP' 카테고리의 다른 글
Servlet & JSP 기초 알아가기 2 (0) | 2021.10.12 |
---|---|
Servlet & JSP 기초 와 실습(MVC 1) (0) | 2021.10.08 |
Servlet & JSP 기초 알아가기 1 (0) | 2021.10.07 |