실용성있는 구조
앞서 구현한 V3 컨트롤러는 서블릿 종속성을 제거하고 뷰 경로의 중복을 제거함으로써 코드를 단순화하고 유지보수성을 향상시켰다. 그런데 컨트롤러 인터페이스를 구현하려할 때, 항상 ModelView 객체를 생성하고 반환하는 부분이 번거롭다. 이러한 중복을 제거함으로써 개발자가 사용하기 쉬운 실용성 있는 구조로 개선한다.
구조 및 동작

기본적인 구조와 동작은 V3와 같지만, 컨트롤러는 ModelView를 반환하지 않고 ViewName만 반환한다.
Controller V4 - 인터페이스
public interface ControllerV4 {
String process(Map<String, String> prarmMap, Map<String, Object> model);
}
ModelView객체가 아니라 문자열인 뷰 이름을 반환한다.ModelView에 포함되어 있던 모델은 매개변수로 전달받는다.
Controller V4 - 구현체
public class MemberFormControllerV4 implements ControllerV4 {
@Override
public String process(Map<String, String> prarmMap, Map<String, Object> model) {
return "new-form";
}
}
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";
}
}
public class MemberListControllerV4 implements ControllerV4 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
public String process(Map<String, String> prarmMap, Map<String, Object> model) {
List<Member> members = memberRepository.findAll();
model.put("members", members);
return "members";
}
}
return String: 단순히 뷰 이름만 반환한다.model.put(): 모델이 매개변수로 전달되기 때문에 직접 생성하고 반환할 필요가 없다.
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 MyView viewResolver(String viewName) {
return new MyView("/WEB-INF/views/" + viewName + ".jsp");
}
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;
}
}
Map<String, Object> model = new HashMap<>(): 모델 객체를 프론트 컨트롤러에서 생성하여 컨트롤러로 전달한다. 이로 인해 컨트롤러를 구현하는 개발자 입장에서는 더욱 사용하기 편리한 프레임워크가 된다.String viewName = controller.process(paramMap, model): 컨트롤러가 뷰 이름을 직접반환한다.
'Spring' 카테고리의 다른 글
| [Spring] Spring DB : JDBC의 이해 (0) | 2024.07.28 |
|---|---|
| [Spring] Spring MVC : MVC 프레임워크 구현 - 유연한 컨트롤러 (1) | 2024.01.23 |
| [Spring] Spring MVC : MVC 프레임워크 구현 - Model 도입 (0) | 2024.01.15 |
| [Spring] Spring MVC : MVC 프레임워크 구현 - View 도입 (0) | 2023.12.12 |
| [Spring] Spring MVC : MVC 프레임워크 구현 - Front Controller 도입 (0) | 2023.12.06 |