본문 바로가기

SpringMVC

[인프런 강의 복습]스프링 MVC 1편 - model 분리

■ Model 객체의 분리

앞선 버전에서는 데이터를 저장하기 위해 컨트롤러에서 ModelView 객체를 생성 후 저장할 데이터를 model 객체에 넣어 ModelView 객체를 반환하였다.
매번 컨트롤러에서 ModelView를 생성 후, 저장할 데이터를 넣기 위해 model 객체를 꺼내 데이터를 넣는 과정이 반복적으로 이루어진다.

개발자가 단순하고 편리하게 사용할 수 있도록, 프론트 컨트롤러에서 paramMap 뿐만 아니라 Model 객체를 함께 파라미터로 넘겨준 후, ModelView를 반환받는 것이 아니라 뷰의 이름만 반환해주도록 코드를 변경해 보겠다.

 

■ ControllerV4 Interface

- process() 메서드의 파라미터에 paramMap뿐만 아니라 데이터를 저장할 수 있는 model 객체도 함께 넘겨준다.
- paramMap과 model은 FrontController에서 넘겨주게 된다.
import java.util.Map;

public interface ControllerV4 {

    /**
     *
     * @param paramMap
     * @param model
     * @return viewName
     */
    String process(Map<String, String> paramMap, Map<String, Object> model);
}

 

■ MemberSaveControllerV4

- FrontController에서 넘겨받은 model 객체에 저장된 회원의 정보를 put하는 것을 확인 할 수 있다.
- 반환되는 값은 논리적인 뷰 이름이다.
- FrontController에서 viewResolver에 의해 물리적인 주소를 가진 뷰 이름으로 변경된다.
import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import hello.servlet.web.frontcontroller.v4.ControllerV4;

import java.util.Map;

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 객체에 데이터를 저장
        model.put("member", member);
        return "save-result";
    }
}

 

■ FrontControllerServletV4

import hello.servlet.web.frontcontroller.MyView;
import hello.servlet.web.frontcontroller.v3.controller.MemberFormControllerV3;
import hello.servlet.web.frontcontroller.v3.controller.MemberListControllerV3;
import hello.servlet.web.frontcontroller.v3.controller.MemberSaveControllerV3;
import hello.servlet.web.frontcontroller.v4.controller.MemberFormControllerV4;
import hello.servlet.web.frontcontroller.v4.controller.MemberListControllerV4;
import hello.servlet.web.frontcontroller.v4.controller.MemberSaveControllerV4;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@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;
        }

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


}