목록BE/Servlet (27)
오봉이와 함께하는 개발 블로그
유연한 컨트롤러2 - v5 FrontControllerServletV5에 ControllerV4 기능도 추가하자. FrontControllerServletV5 private void initHandlerMappingMap() { handlerMappingMap.put("/front-controller/v5/v3/members/new-form", new MemberFormControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members/save", new MemberSaveControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members", new MemberListControlle..
유연한 컨트롤러1 - v5 어떤 개발자는 ControllerV3, 어떤 개발자는 ControllerV4로 개발하고 싶다면 어떻게 해야 할까? 어댑터 패턴 완전히 다른 인터페이스를 구현해서 같이 개발할 때 사용할 수 있는 패턴이다. 어탭터 패턴을 사용하면 프론트 컨트롤러가 다양한 방식의 컨트롤러를 처리할 수 있어진다. V5 구조 클라이언트 요청 프론트 컨트롤러가 핸들러 매핑 정보에서 핸들러 조회 프론트 컨트롤러가 핸들러 어댑터 목록에서 핸들러를 처리할 수 있는 핸들러 어댑터 조회 조회된 핸들러 어댑터에 파라미터를 넘겨줌 핸들러 어탭터는 핸들러(컨트롤러)를 대신 호출 핸들러(컨트롤러)는 결과를 프론트 컨트롤러에 반환 프론트 컨트롤러는 반환된 결과로 뷰 리졸버 호출 뷰 리졸버는 결과를 반환 프론트 컨트롤러는 ..
단순하고 실용적인 컨트롤러 - v4 v3 컨트롤러는 서블릿 종속성을 제거하고 뷰 경로의 중복을 제거하는 등 잘 설게된 컨트롤러다. 그런데 실제 컨트롤러 인터페이스를 구현하는 개발자 입장에서는 항상 ModelView 객체를 생성하고 반환해야 하는 부분이 조금 번거롭다 좋은 프레임워크는 아키텍처도 중요하지만, 실제 개발자가 단순하고 편리하게 사용할 수 있어야 한다. V4 구조 기본적인 구조는 V3와 같다. 대신 컨트롤러가 ModelView를 반환하지 않고, ViewName만 반환한다. ControllerV4 public interface ControllerV4 { /** * @param paramMap * @param model * @return viewName */ String process(Map par..
Model 추가 - v3 서블릿 종속성 제거 각 컨트롤러 입장에서 HttpServletRequest, HttpServletResponse이 필요하지 않다. 요청 파라미터 정보는 자바의 Map으로 대신 넘기도록 하면 지금 구조에서는 컨트롤러가 서블릿 기술을 몰라도 동작할 수 있다. 그리고 request 객체를 Model로 사용하는 대신 별도의 Model 객체를 만들어서 반환하면 된다. 컨트롤러에서 서블릿 기술을 전혀 사용하지 않도록 해보자. 구현 코드도 단순해지고, 테스트 코드 작성이 쉬워지는 효과가 생긴다. 뷰 이름 중복 제거 return new MyView("/WEB-INF/views/new-form.jsp"); -> new-form return new MyView("/WEB-INF/views/memb..
View 분리 - v2 모든 컨트롤러에서 뷰로 이동하는 부분에 중복이 있고, 깔끔하지 않다. String viewPath = "/WEB-INF/views/new-form.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response); 이 부분을 깔끔하게 분리하기 위해 별도로 뷰를 처리하는 객체를 만들어보자. v2 구조 클라이언트가 서버에 요청 프론트 컨트롤러가 매핑 정보를 조회해서 기능이 있는 컨트롤러를 호출 기능 컨트롤러는 MyView 객체를 프론트 컨트롤러에 반환 프론트 컨트롤러는 MyView의 render()호출 JSP forward MyView // pac..