스프링/3. 스프링 MVC

25. 프론트 컨트롤러 공통로직(뷰 추가)

sdafdq 2023. 8. 6. 17:27
        String viewPath = "/WEB-INF/views/new-form.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request, response);

기존의 공통로직

 

 

view에 관한 내용이었다.

 

이거는 먼저 요청의 uri로 Map에서 조회하고, 컨트롤러를 호출하면 그게 viewPath 정보를 가진 MyView라는 객체를 반환하게 할거다.

그러면 MyView.render()해주면 JSP로 forward 해주게끔 할거다.

어차피 request, response에다가 SetAttribute()로 정보까지 저장 가능해서 그거 다 넘겨버리면 된다. 

 

 

@WebServlet(name = "frontControllerServletV2", urlPatterns = "/front-controller/v2/*")
public class FrontControllerServletV2 extends HttpServlet {
    private Map<String, ControllerV2> controllerMap = new HashMap<>();

    public FrontControllerServletV2(){
        controllerMap.put("/front-controller/v2/members/new-form",new MemberFormControllerV2());
        controllerMap.put("/front-controller/v2/members/save",new MemberSaveControllerV2());
        controllerMap.put("/front-controller/v2/members",new MemberListControllerV2());
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ControllerV2 controller = controllerMap.get(request.getRequestURI());
        if(controller ==null){
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        MyView view = controller.process(request, response);
        view.render(request, response);
    }
}

같고, 다른 점은 이제 컨트롤러가 process를 실행하면 MyView를 반환하도록 하고, 

 

public class MyView {
    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);
    }
}

기존의 forward를 얘가 처리하도록 한다.

 

 

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");
    }
}

코드 보면 이렇게

 

 

public class MemberSaveControllerV2 implements ControllerV2 {
    MemberRepository memberRepository = MemberRepository.getInstance();
    @Override
    public MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Member member = new Member(request.getParameter("username"), Integer.parseInt(request.getParameter("age")));
        Member savedMember = memberRepository.save(member);

        request.setAttribute("member", savedMember);
        return new MyView("/WEB-INF/views/save-result.jsp");
    }
}

굉장히 비즈니스로직과 뷰에 관한 로직이 나뉘게 된다.

'스프링 > 3. 스프링 MVC' 카테고리의 다른 글

27. 단순화  (0) 2023.08.06
26. 모델 추가  (0) 2023.08.06
24. 프론트 컨트롤러 도입.  (0) 2023.08.06
23. 프론트 컨트롤러  (0) 2023.08.06
22. MVC 패턴 단점.  (0) 2023.08.06