Free Lines Arrow
본문 바로가기
Spring/spring framework 구현 스터디

[Spring] 프론트 컨트롤러 4 : 개선편

by skahn1215 2021. 10. 26.
728x90
반응형

프론트 컨트롤러 4

앞서 만들어 둔 프론트컨트롤러를 개선한다.

 

 

개선방안

  • 우리는 앞에 프로젝트에서 모델뷰를 만들었다.
  • 이번에는 모델뷰를 제거한다.
  • 대신 컨트롤러에 Map 을 넘겨 필요한 데이터를 저장한다.

 

Controller interface

  • 모델 뷰가 없어지고 파라미터들이 Map 으로 변경되었다.
package hello.servlet.web.frontcontroller.v4;

import java.util.Map;

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

 

 

 

FrontContorller

  • Map 으로 model 을 만들고 하위 컨트롤러에게 모델을 넘겨 데이터를 가져온다.
// /front-controller/v4/* 주소의 * 때문에 어떤 url이 들어와도 일단 해당 컨트롤러가호출된다.
@WebServlet(name = "frontControllerServletV4", urlPatterns = "/front-controller/v4/*")
public class FrontControllerServletV4 extends HttpServlet {
    private Map<String, ControllerV4> controllerMap = new HashMap<>();

    // 프론트 컨트롤러 map 셋팅
    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 req, HttpServletResponse resp) throws ServletException, IOException {
        String requestURI = req.getRequestURI();
        ControllerV4 controllerV4 = controllerMap.get(requestURI);
        if (controllerV4 == null) {
            resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        // 모델 뷰를 가져오는 부분
        Map<String, String> paramMap = createParamMap(req);
        Map<String, Object> model = new HashMap<>();  // 추가됨.
        String viewName = controllerV4.process(paramMap, model);

        MyView view = viewResolver(viewName);
        view.render(model, req, resp);
    }

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

    // 레벨을 맞춰주기 위해 메서드로 뽑아준다.
    private Map<String, String> createParamMap(HttpServletRequest req) {
        // paramMap을 넘겨줘야한다.
        Map<String, String> paramMap = new HashMap<>();
        req.getParameterNames().asIterator()
                .forEachRemaining(paramName -> paramMap.put(paramName, req.getParameter(paramName)));
        return paramMap;
    }
}

 

 

MemberSaveController

  • 모델뷰를 만들어 넘기는 대신 view 이름만 넘긴다.
  • map 으로 model 을 대체 했다.
public class MemberSaveControllerV4 implements ControllerV4 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

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

 

 

 

결론

  • 모델뷰를 생성을 했던 이전 버전과 다르게
    프론트 컨트롤러에서 맵만 넘겨 주면 해당 맵에 필요한 데이터를 담는다.
  • 그렇기 때문에 코드가 더 간결해 졌고 사용하기 쉬워 졌다.

 

 

 

 

 

 

참고

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/lecture/71192?tab=curriculum 

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

728x90
반응형

댓글