CS/DesignPattern
(DesignPattern) FrontController - Version04 (단순하고 실용적인 컨트롤러)
주누
2021. 5. 7. 22:36
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