스프링강의 3일차 MVC강의 Model 추가, 논리 view name 반환

정병웅·2023년 3월 5일
0

Spring 강의

목록 보기
3/3

우선 이건 인프런의 김영한 강사님의 강의를 들으면서 본인이 스터디하고, 복습하기 위해 작성되는 글입니당,,,

목표

기존 controllerV3에서 Controller들은 return 시 modelView 객체를 반환하였지만, 이번 controllerv4에서는 controller가 view의 논리 이름만 반환한다.
그리고 frontcontroller에서 paramMap만 넘겨줬지만, contorollerV4에서는 model도 함께 넘겨준다.
따라서 controller 구현 객체들은 model에 값만 넣고, return은 view 논리 이름만 반환하면 되는 간단한 구조를 가지게 된다.

구현 과정

1. ControllerV4 인터페이스

  /**
     * @param paramMap
     * @param model
     * @return viewName
     */
    //컨트롤러에서 view의 이름만 반환해줄 것이기 때문에 string 타입 선택
    public String process(Map<String, String> paramMap, Map<String, Object> model);

2. 구현 MemberSaveControllerV4

 public String process(Map<String, String> paramMap, Map<String, Object> model) {
        String name = paramMap.get("username");
        int age = Integer.parseInt(paramMap.get("age"));

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

        model.put("member", member);
        return "save-result";
    }

-> model.put("member", member) 코드를 보면 파라미터로 넘어온 model에 member만 저장하고 return 값으로 view의 논리적인 이름만 반환하는 것을 알 수 있다.

3. FrontControllerServiceV4

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;
        }
        //request 요청이 왔을 때 요청하는 값들을 저장하는 map
        Map<String, String> paramMap = createParamMap(request);
        //request 요청이 왔을 때 model도 넘겨줘야하기 때문에 model 생성
        Map<String, Object> model = new HashMap<>();

        //컨트롤러에서 처리한 process에서 paramMap과 model을 받은 후 viewName으로 저장
        String viewName = controller.process(paramMap, model);
        MyView mv = viewResolver(viewName);

        mv.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;
    }
코드 설명
 //request 요청이 왔을 때 요청하는 값들을 저장하는 map
Map<String, String> paramMap = createParamMap(request);
//request 요청이 왔을 때 model도 넘겨줘야하기 때문에 model 생성
Map<String, Object> model = new HashMap<>();

controller에 넘겨줄 파라미터에서 model 을 추가했기 때문에 model을 생성하는 코드를 추가했다.

//컨트롤러에서 처리한 process에서 paramMap과 model을 받은 후 viewName으로 저장
String viewName = controller.process(paramMap, model);
MyView mv = viewResolver(viewName);

mv.render(model,request,response);

controller에서 return 값으로 전달받은 viewName을 변수에 저장하고, Myview 객체를 생성한 뒤 viewResolver 메서드로 물리적 jsp 경로로 변환 시켜주고, 최종적으로 클라이언트에 반환하는 modelview에 넘겨준다.

profile
인생은 IT 노가다

0개의 댓글