ABOUT ME

Today
Yesterday
Total
  • [스프링MVC - 1편] MVC 프레임워크 만들기 (3)
    스프링&스프링부트 2025. 1. 12. 18:28

    단순하고 실용적인 컨트롤러 - V4

    v3 컨트롤러는 서블릿 종속성을 제거하고 경로의 중복을 제거하는 , 설계된 컨트롤러이다

    그런데 실제 컨트톨러 인터페이스를 구현하는 개발자 입장에서 보면, 항상 ModelView 객체를 생성하고 반환해야 하는 부분이

    조금은 번거롭다

    좋은 프레임워크는 아키텍처도 중요하지만, 그와 더불어 실제 개발하는 개발자가 단순하고 편리하게 사용할 수있어야 한다

    소위 실용성이 있어야 한다

    이번에는 v3 조금 변경해서 실제 구현하는 개발자들이 매우 편리하게 개발할 있는 v4 버전을 개발한다

     

     

    V4 구조

     

     

    1. ControllerV4

    public interface ControllerV4 {
        String process(Map<String, String> paramMap, Map<String, Object> model);
    }

     

     

    2. MemberFormControllerV4

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

     

     

    3. MemberSaveControllerV4

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

     

     

    4. MemberListControllerV4

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

     

     

    5. FrontControllerServletV4

    @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 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;
        }
    
        private MyView viewResolver(String viewName) {
            return new MyView("/WEB-INF/views/" + viewName + ".jsp");
        }
    }

    728x90
Designed by Tistory.