[Spring]프론트 컨트롤 개념 및 예제(단순하고 실용적인 컨트롤러)
프론트 컨트롤 개념 및 예제(Model 추가) 이 부분은 잘 설계된 것이다. 그런데 조금 더 고치자면 ModelView를 항상 생성하고 반환해야 하는 것을 고칠 것이다.
프론트 컨트롤 실행 순서(단순하고 실용적인 컨트롤러)
- 클라이언트가 FrontController에 Http 요청을 한다.
- 요청을 받은 FrontController은 요청을 확인하고 컨트롤러를 조회를 한다
- 조회한 컨트롤러를 호출하고 viewName을 반환받는다
- 반환받은 viewName을 viewResolver를 호출하고 MyView를 반환받는다.
- 반환받고 render를 호출하고 응답을 해준다.
public interface Controller{
String process(Map<String, String> paramMap, Map<String, Object> model);
}
public class MemberInputController implements Controller {
@Override
public String process(Map<String, String> paramMap, Map<String,Object> model> {
return "new-form";
}
}
public class MemberSaveController implments Controller {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
public String process(Map<String, String> paramMap, Map<String,Object> model> {
String name = paramMap.get("name");
int age = Integer.parseInt(paramMap.get("age"));
Member member = new Member(name, age);
memberRepository.save(member);
model.put("member",member);
return "save";
}
}
public class MemberListController implements Controller {
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";
}
}
프론트 컨트롤 개념 및 예제(Model 추가) 이 부분과 비교해보면 ModelView를 생성하고 호출해주는 부분이 없고 process 메소드의 매개변수인 Map<String,Object> model이 ModelView와 같은 역할을 한다.
@WebServlet(name="frontController", urlPatterns="/frontcontroller/*")
public class FrontController extends HttpServlet {
private Map<String, Controller> controllerMap = new HashMap<>();
public FrontController() {
controllerMap.put("/frontcontroller/input", new MemberInputController());
controllerMap.put("/frontcontroller/save", new MemberSaveController());
controllerMap.put("/frontcontroller/members", new MemberListController());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String requestURI = request.getRequestURI();
Controller controller = controllerMap.get(requestURI);
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");
}
}
정리
ModelView를 각 컨트롤러마다 생성을 안 해줘도 Map <String, Object> model = new HashMap <>();으로 ModelView와 같은 역할을 한다.
String viewName 부분을 보면 paramMap과 model을 넘겨준다. 그러면 해당된 컨트롤러를 불러 논리적 경로를 리턴을 해준다.
밑으로 내려갈수록 발전된 프론트 컨트롤 패턴 활용
프론트 컨트롤러 도입 - https://hoestory.tistory.com/12
view분리 - https://hoestory.tistory.com/13
Model 추가 - https://hoestory.tistory.com/17
단순하고 실용적 컨트롤러 - https://hoestory.tistory.com/19
유연한 컨트롤 -
'Spring Boot > MVC' 카테고리의 다른 글
[Spring]프론트 컨트롤 개념 및 예제(Model 추가) (0) | 2021.12.02 |
---|---|
[Spring]프론트 컨트롤 개념 및 예제(View 분리) (0) | 2021.11.28 |
[Spring]프론트 컨트롤 개념 및 예제(프론트 컨트롤러 도입) (0) | 2021.11.28 |
댓글
이 글 공유하기
다른 글
-
[Spring]프론트 컨트롤 개념 및 예제(Model 추가)
[Spring]프론트 컨트롤 개념 및 예제(Model 추가)
2021.12.02 -
[Spring]프론트 컨트롤 개념 및 예제(View 분리)
[Spring]프론트 컨트롤 개념 및 예제(View 분리)
2021.11.28 -
[Spring]프론트 컨트롤 개념 및 예제(프론트 컨트롤러 도입)
[Spring]프론트 컨트롤 개념 및 예제(프론트 컨트롤러 도입)
2021.11.28