-
[스프링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'스프링&스프링부트' 카테고리의 다른 글
[스프링MVC - 1편] 스프링 MVC 전체 구조 (1) 2025.01.27 [스프링MVC - 1편] MVC 프레임워크 만들기 (4) (0) 2025.01.12 [스프링MVC - 1편] MVC 프레임워크 만들기 (2) (0) 2025.01.12 [스프링MVC - 1편] MVC 프레임워크 만들기 (1) (0) 2025.01.12 [스프링MVC - 1편] MVC 패턴 적용, 한계 (0) 2025.01.12