객체 지향 개념 중 다형성을 기반으로 ControllerV1을 인터페이스로 구현하고, 각각의 기능을 하는 컨트롤러는 상속받도록 한다!
그러면 프론트 컨트롤러는 이 인터페이스를 호출해서 구현과 관계없이 로직의 일관성을 가져갈 수 있다!
정말 중요⭐️❤️
URL 맵핑 정보는 HashMap으로 만든다.
key : 요청 URL, value : 호출할 컨트롤러
request.getRequestURI()로 요청 URL 정보를 가져올 수 있다. 이값이 Map의 key가 되기 때문에 key로 value(호출할 컨트롤러)를 찾는다!
2번의 value는 key에 따라 MemberFormController, MemberSaveController, MemberListController일 수 있다. 이 3가지는 모두 ControllerV1 인터페이스를 상속받은 구현체들이기 때문에 key를 인터페이스로 담는다!
key에 따른 value가 null이 아니면 key에 해당하는 controller를 실행한다!
인터페이스 Controller의 process 메서드가 있다. 구현체들은 이 메서드들을 똑같이 상속받고, 오버라이딩했으므로, 해당하는 controller에 따라 다른 메서드가 실행된다!
packagehello.servlet.web.frontcontroller.v1;importhello.servlet.web.frontcontroller.v1.controller.MemberFormControllerV1;importhello.servlet.web.frontcontroller.v1.controller.MemberListControllerV1;importhello.servlet.web.frontcontroller.v1.controller.MemberSaveControllerV1;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.util.HashMap;importjava.util.Map;@WebServlet(name="frontControllerServletV1",urlPatterns ="/front-controller/v1/*")publicclassFrontControllerServletV1extendsHttpServlet {//맵핑privateMap<String,ControllerV1> controllerMap =newHashMap<>();publicFrontControllerServletV1() {controllerMap.put("/front-controller/v1/members/new-form",newMemberFormControllerV1());controllerMap.put("/front-controller/v1/members/save",newMemberSaveControllerV1());controllerMap.put("/front-controller/v1/members",newMemberListControllerV1()); } @Overrideprotectedvoidservice(HttpServletRequest req,HttpServletResponse resp) throwsServletException,IOException {System.out.println("FrontControllerServletV1.service");String requestURI =req.getRequestURI();// 이것은 /front-controller/v1/members/new-form와 같다//요청 URI가 key가 되고 우리가 정의한 URI라면 맵핑했던 value(웹페이지)를 리턴한다!//다형성으로 인해 부모인 ControllerV1으로 받을 수 있다!//왜냐하면 아래 Controller변수인 controller는 사실 MemberSaveControllerV1 또는 MemberListControllerV1이기 때문이다!ControllerV1 controller =controllerMap.get(requestURI);if(controller ==null){resp.setStatus(HttpServletResponse.SC_NOT_FOUND);return; }//잘 조회됐다면 컨트롤러 인터페이스의 process 메서드 실행한다!//다형성에 의해 오버라이드된 메서드가 호출된다! 소름~! 그래서 같은 process 이름으로 메서드를 호출했구나! 대박controller.process(req,resp); }}