Version03 문제점
위의 Version03의 문제점은 무엇일까?
컨트롤러에서 ModelView를 반환함으로써 부득이하게 ModelView에 뷰 랜더링 시에 전달할 Map을 담아야 했다.
해결방안
컨트롤러 인터페이스 model객체를 담을 수 있는 파라미터를 추가하고자 한다.
이렇게 함으로써 컨트롤러는 ModelView 객체를 반환하지 않고 뷰의 논리적 이름만 반환하면 되는 마법이 일어난다.
컨트롤러 인터페이스 생성
기존의 파라미터에 Model 객체를 담을 수 있는 파라미터를 추가한다.
public interface ControllerVersion04 {
String process(final Map<String,String> paramMap, final Map<String, Object> model);
}
폼, 저장, 조회 클래스 생성
비즈니스 로직을 처리하는 컨트롤러는 비즈니스 로직을 처리한 뒤 전달받은 Model 파라미터에 값을 put 하고
논리적 이름을 리턴한다.
public class MemberListController implements ControllerVersion04 {
private final MemberRepository memberRepository = MemberRepository.getInstance();
@Override
public String process(final Map<String, String> paramMap, final Map<String, Object> model) {
final List<Member> members = memberRepository.finalAll();
model.put("members", members);
return "members";
}
}
FrontController 생성
기존의 ModelView에 저장한 Model를 넣다 뺏다 하는 과정이 생략되고 코드가 훨씬 간결해진다.
@Override
protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
final String requestURI = request.getRequestURI();
final ControllerVersion04 controller = controllerMap.get(requestURI);
if (controller == null) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
final Map<String, String> paramMap = createParamMap(request);
final Map<String, Object> model = new HashMap<>();
final String viewName = controller.process(paramMap, model);
final MyView myView = viewResolver(viewName);
myView.render(model, request, response);
}
Code Link
'CS > DesignPattern' 카테고리의 다른 글
(DesignPattern) FrontController - Version05 (with HandlerAdapter) (0) | 2021.05.11 |
---|---|
(DesignPattern) FrontController - Version03 (Model 추가) (0) | 2021.05.04 |
(DesignPattern) FrontController - Version02 (View 분리) (0) | 2021.05.02 |
(DesignPattern) FrontController 패턴이란? (with FrontController - Version01) (0) | 2021.04.29 |
(DesignPattern) 메멘토 패턴 (0) | 2020.07.26 |