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
728x90
반응형
'Spring > spring framework 구현 스터디' 카테고리의 다른 글
[Spring] 프론트 컨트롤러 6 : 어댑터 추가 (0) | 2021.10.30 |
---|---|
[Spring] 프론트 컨트롤러 5 : 어댑터 적용 (0) | 2021.10.30 |
[Spring] 프론트 컨트롤러 3 : 종속성제거, 뷰리졸버 구현 (0) | 2021.10.23 |
[Spring] 프론트 컨트롤러 2 : 적용, 뷰 분리 (0) | 2021.10.21 |
[Spring] 프론트 컨트롤러 1 : 개념 (0) | 2021.10.18 |
댓글