-
Servlet-JSP MVC04(1) - FrontController and POJOWeb/Servlet-JSP 2023. 6. 16. 10:10
1. FrontController
- 지금까지는 클라이언트 요청을 처리하기 위해 여러 컨트롤러(서블릿)이 존재했다.
- 컨트롤러가 많은 것은 유지보수를 어렵게 만든다.
- 만약 컨트롤러가 클라이언트의 요청을 받을때 공통으로 처리해야하는 부분이 있다면, 모든 컨트롤러에 공통코드를 추가해야할 것이다. 이는 유지보수를 어렵게 만든다.
- 따라서, 이러한 점을 보완하기 위해 클라이언트로부터 모든 요청을 먼저 받고, 공통부분을 처리한 뒤에 요청을 넘기는 역할을 하는 것이 FrontController이다.
@WebServlet("*.do") public class FrontController extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //공통처리 ex request 인코딩 request.setCharacterEncoding("utf-8"); // fullpath String url = request.getRequestURI(); //contextpath(/PRT) String ctx = request.getContextPath(); //(/요청.do) String command = url.substring(ctx.length()); if(command.equals("/memberList.do")) { //해당 요청을 처리할 부분 }else if(command.equals("/memberInsert.do")) { }else if(command.equals("/memberContent.do")) { }else if(command.equals("/memberUpdate.do")) { }else if(command.equals("/memberDelete.do")) { }else if(command.equals("/memberRegister.do")) { } } }
예를 들면 위와 같다고 할 수 있다. (모든 요청을 처리할 수 있는 컨트롤러)
- *.do를 통해 클라이언트 요청을 받는다.
- 요청을 구분하기 위해서 url-ContextPath를 통해 해당 요청을 알아낸다.
- 분기문을 통해 요청에 따라 적절한 처리를 한다.
> 위 코드에 각 컨트롤러들이 처리했던 부분을 그대로 추가하고 사용해도 동작은 하지만,
이 또한 코드의 가독성도 떨어지고 유지보수도 힘들 것이다. 모든 요청을 받되, 세세한 구현사항은 다른곳에 위탁해야한다.
이러한 역할을 하는 것이 POJO이다.
2. POJO (plain old java object)
POJO란 특정 기술에 종속되지 않는 순수 자바 객체를 의미한다.
특정 기술이나 환경에 종속되게 되면, (ex Servlet) 코드의 가독성이 떨어져 유지보수에 어려움을 겪을 수 있고,
특정 클래스를 상속받거나, 직접 의존하게 되어 코드의 확장성이 떨어지는 단점이 있다.
따라서 본래의 자바가 가진 객체지향설계의 장점을 살리기 위해서 POJO를 사용한다.
POJO가 해야할 일은 기존에 컨트롤러가 하던 일에서 클라이언트 요청을 받는 것을 제외하고
Model연동, 객체바인딩, 처리할 view를 리턴하는 것이다.
2.1 Controller Interface
pojo가 처리해야할 일을 interface로 만들고, 이를 구현하도록 하자
이를 통해 frontcontroller에서는 요청에 따라 여러 메서드를 호출해야 할 필요없이 하나의 메서드만 호출하면된다.
인터페이스에 추가할 메서드는 Service 메서드와 매개변수 및 예외가 같다.
public interface Controller { public String requestHandler(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; }
2.2 pojo생성
순수 자바 클래스로 pojo를 생성하고, Interface를 상속한다음 아래와 같이 각 pojo의 역할에 따라 메서드를 오버라이딩한다.
@Override public String requestHandler(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int num = Integer.parseInt(request.getParameter("num")); System.out.print("num"+num); MemberDAO dao = new MemberDAO(); MemberVO member = dao.memberContent(num); request.setAttribute("member", member); String nextPage = "member/memberContent.jsp"; return nextPage; }
@Override public String requestHandler(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int num = Integer.parseInt(request.getParameter("num")); System.out.print("delete num="+num); MemberDAO dao = new MemberDAO(); int cnt = dao.memberDelete(num); String nextPage=null; if(cnt>0) { nextPage = "redirect:/PRT/memberList.do"; }else { throw new ServletException("not Delete"); } return nextPage; }
2.3 pojo와 frontController연결
frontcontroller의 분기문을 아래와 같이 채운다.
- Controller (인터페이스) 참조변수로 해당 요청을 처리할 pojo생성
- requestHandler 호출 및 nextpage return받기
- nextPage검사
>redirect: 포함시 -> response.sendRedirect(nextPage);
> 아니면 forward
String nextPage=null; if(command.equals("/memberList.do")) { Controller cr = new MemberListController(); nextPage = cr.requestHandler(request, response); //...분기문 // return값 검사 redirect 포함시 -> 해당주소 redirect if(nextPage.contains("redirect:")) { response.sendRedirect(nextPage.split(":")[1]); }else { //아닐시 forward RequestDispatcher rd = request.getRequestDispatcher(nextPage); rd.forward(request, response); }
전체적인 흐름은 다음과 같다
FrontContrller가 요청을 받고 공통부분 처리후 -> pojo로 나머지 처리 넘김(forwarding 처럼 request,response넘김)
-> nextPage return -> nextPage 검사해서 foward할지 redirect할지 결정
참고자료:
나프1탄 (인프런) 박매일
https://www.inflearn.com/course/%EB%82%98%ED%94%84-mvc-1
https://jwdeveloper.tistory.com/291
https://siyoon210.tistory.com/120
'Web > Servlet-JSP' 카테고리의 다른 글
Servlet-JSP MVC06 (1) - Session을 이용한 로그인 처리 (0) 2023.06.24 Servlet-JSP MVC04 (2) - handlerMapping and viewResolver (0) 2023.06.16 Servlet-JSP MVC05 - JDBC to Mybatis (0) 2023.06.14 Servlet-JSP MVC05 - mybatis 설치 및 기본설정 (0) 2023.06.14 Servlet - JSP MVC03 - JSTL and EL (1) 2023.06.13