프론트컨트롤러에 모델과 뷰 분리하기 - V3

박경현·2023년 3월 29일
0

아래 사진 처럼 뷰를 ViewResolver를 통해 부르고
Model을 따로 전달해주는 방식을 사용해보려고 한다!!

V3 방식의 코드

v3/ControllerV3 - 전에 썼던 httpServletRequest 대신에 Map을 사용한다!!
public interface ControllerV3 {
	ModelView process(Map<String,String> paramMap);
}
v3/controller/MemberFormControllerV3 -> 그냥 ModelView에 반환해주면 됨!
public class MemberFormControllerV3 implements ControllerV3 {
	@Override
    public ModelView process(Map<String,String> paramMap) {
    	return new ModelView("new-form");
    }
}
v3/controller/MemberListControllerV3

여기는 그냥 리스트를 조회! 그리고 mv에 데이터를 저장!!

public class MemberListControllerV3 implements ControllerV3 {
	private MemberRepository memberRepository = MemberRepository.getInstance();
	@Override
    public ModelView process(Map<String,String> paramMap) {
    	List<Member> members = memberRepository.findAll();
        ModelView mv = new ModelView("members");
        mv.getModel().put("members",members);
        return mv;
    }
}
v3/FrontControllerServletV3 - 여기서 url을 받으면 컨트롤러에 전달 및 뷰 리졸버로 view를 처리!
  1. 일단 생성자에 controllerV3Map.put()을 사용해서 컨트롤러에 매핑되는 url들 설정 해놓기!
  2. url이 urlPatterns에 적합하게 들어오면 service메소드가 실행되고 controllerV3Map에 이 url 들어있는지 확인하기!
  3. 적합한 url이면 createParamMap으로 req를 줘서 각각의 parameter를 Map에 저장해서 다시 준다
  4. 그리고 viewResolver함수에 viewName을 파라미터로 줘서 진짜 jsp로 바꿔줌!
  5. view.render(mv.getModel(), req,resp)를 통해 실제 view를 동적으로 보여줌!
@WebServlet(name = "frontControllerServletV3", urlPatterns = "/front-controller/v3/*")
public class FrontControllerV3 extends HttpServlet {
	private Map<String, ControllerV3> controllerV3Map = new HashMap<>();
    public FrontControllerServletV3() {
    	 controllerV3Map.put("/front-controller/v3/new-form", new MemberFormControllerV3());
        controllerV3Map.put("/front-controller/v3/save", new MemberSaveControllerV3());
        controllerV3Map.put("/front-controller/v3/members", new MemberListControllerV3());
    }
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp )throws ServletException, IOException {
    	String requestURI = req.getRequestURI();
        ControllerV3 controllerV3 = controllerV3Map.get(requestURI);
        
        if(controllerV3 ==null) {
        	resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        
        Map<String,String> paramMap = createParamMap(req);
        ModelView mv = controllerV3.process(paramMap);
        
        String viewName = mv.getViewName();
        MyView view = viewResolver(viewName);
        view.render(mv.getModel(),req,resp);
    }
    private static MyView viewResolver(String viewName) 
    {
    	return new MyView("/WEB-INF/views/" + viewName + ".jsp");
    }
    
	private static Map<String,String> createMap(HttpServletRequest req) {
    	Map<String,String> paraMap = new HashMap<>();
    	req.getParameterNames().asIterator()
        	.forEachRemaining(paramName-> paraMap.put(paramName,req.getParameter(paramName)));
        return paramMap;
    }

}
profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글