인프런의 김영한님의 mvc 기본 1편을 들으면서 정리한 내용
다형성 활용하기 위해서 인터페이스를 통해서 구현 로직을 추상화
public interface ControllerV1 {
void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}
회원 등록, 회원 저장, 회원 목록은 위의 인터페이스를 implement를 받아서 각자의 목적에 맞춰서 코드를 재정의 해줌.
FrontController에 생성자를 통해서 매핑 정보를 넣어두고 진행함.
클라이언트의 requestUrl을 가져와서 맵핑테이블안에있는 것에 맞춰서 가져옴 -> 없는경우 NOT_FOUND를 내보냄
있는 경우 -> 각자의 목적에 맞춰서 만들어둔 걸 실행함.
@WebServlet(name = "frontControllerServletV1" , urlPatterns = "/front-controller/v1/*")
public class FrontControllerServletV1 extends HttpServlet {
private Map<String,ControllerV1> controllerMap = new HashMap<>();
//미리 생성자를 통해서 맵핑을 해둠.
public FrontControllerServletV1() {
controllerMap.put("/front-controller/v1/members/new-form",new MemberFormControllerV1());
controllerMap.put("/front-controller/v1/members/save",new MemberSaveControllerV1());
controllerMap.put("/front-controller/v1/members",new MemberListControllerV1());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("FrontControllerServletV1.service");
String requestURI = request.getRequestURI();
//인터페이스로 일관성을 유지하기 때문에 가능함.
ControllerV1 controller = controllerMap.get(requestURI);
if(controller == null){
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
//각자 컨트롤러에 맞춰서 실행함.
controller.process(request,response);
}
}
구조 개선시에는 구조만 개선하고 그다음 문제가 없을 시에 세세한 부분을 개선하는게 좋은 방법이라고 얘기하심.
두개를 한번에 같이 하게되면 짬뽕되서 문제가 발생되면 짬뽕된 코드를 보고 구조의 문제인지 코드의 문제인지 두개를 체크해야되는 문제가 생김
-> 한번에 하나씩 개선을 하면 구조개선할때 문제가 발생하면 구조가 문제인거를 빠르게 체크가가능해진다.
-> 세세한 부분개선을 할때 오류가 발생하면 부분 개선이 문제인 것을 알 수 있음.
public class MemberFormControllerV2 implements ControllerV2 {
@Override
public MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
return new MyView("/WEB-INF/views/new-form.jsp");
}
}
Myview는 생성하지 않고 반환만 하는 정도
public class MyView {
private String viewPath;
public MyView(String viewPath) {
this.viewPath = viewPath;
}
public void render(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request,response);
}
}
view 도 인터페이스로 만들어서 다형성 설계가 가능함