[Spring MVC] #2 프레임워크 만들기 (4) FrontController에서 Model 생성

Jaeyoo (유재형)·2022년 2월 7일
0

SpringMVC

목록 보기
5/12
post-thumbnail
post-custom-banner

이전 구조에서는 각 컨트롤러에서 ModelView를 생성해 반환해야하는 번거로움이 있었다. FrontController에서 Model을 생성해 개발자가 좀더 편하게 구조를 개선해보자


실용적인 컨트롤러


구조

  • 이전과 구조는 동일
  • ModelView를 반환하지않고 ViewName만 반환

ControllerV4

public interface ControllerV4 {
    
    String process(Map<String, String> paramMap, Map<String, Object> model);
}
  • front에서 model을 만들어서 넘겨주므로 리턴값은 뷰의 이름만 리턴하면된다.

회원 등록 컨트롤러

public class MemberFormControllerV4 implements ControllerV4 {
    @Override
    public String process(Map<String, String> paramMap, Map<String, Object> model) {
        return ("new-form");
    }
}
  • viewName만 반환

회원 저장 컨트롤러

public class MemberSaveControllerV4 implements ControllerV4 {

    private MemberRepository memberRepository = MemberRepository.getInstance();
    @Override
    public String process(Map<String, String> paramMap, Map<String, Object> model) {
        String username = paramMap.get("username");
        int age = Integer.parseInt(paramMap.get("age"));

        Member member = new Member(username, age);
        memberRepository.save(member);

        model.put("member", member);
        return ("save-result");
    }
}
  • frontController에서 받은 model에 데이터 넣기

회원 목록 컨트롤러

public class MemberListControllerV4 implements ControllerV4 {

    private MemberRepository memberRepository = MemberRepository.getInstance();
    @Override
    public String process(Map<String, String> paramMap, Map<String, Object> model) {
        List<Member> members = memberRepository.findAll();

        model.put("members", members);
        return "members";
    }
}

프론트 컨트롤러 V4

@WebServlet(name = "frontControllerServletV4", urlPatterns = "/front-controller/v4/*")
public class FrontControllerServletV4 extends HttpServlet {

    private Map<String, ControllerV4> controllerMap = new HashMap<>();

    public FrontControllerServletV4() {
        controllerMap.put("/front-controller/v4/members/new-form", new MemberFormControllerV4());
        controllerMap.put("/front-controller/v4/members/save", new MemberSaveControllerV4());
        controllerMap.put("/front-controller/v4/members", new MemberListControllerV4());
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String requestURI = request.getRequestURI();

        ControllerV4 controller = controllerMap.get(requestURI);
        if (controller == null){
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        //paramMap을 넣어주어야함
        Map<String, String> paramMap = createParamMap(request);
        Map<String, Object> model = new HashMap<>();
        String viewName = controller.process(paramMap, model);

        MyView view = viewResolver(viewName);
        view.render(model, request, response);
    }

    private MyView viewResolver(String viewName) {
        return new MyView("/WEB-INF/views/" + viewName + ".jsp");
    }

    private Map<String, String> createParamMap(HttpServletRequest request) {
        Map<String, String> paramMap = new HashMap<>();
        request.getParameterNames().asIterator()
                .forEachRemaining(paramName -> paramMap.put(paramName, request.getParameter(paramName)));
        return paramMap;
    }
}
  • frontController에서 model 생성해서 넘겨주기
  • 이전과 동일하고 model을 생성해서 넘겨주는것만 다름
profile
기록과 반복
post-custom-banner

0개의 댓글