CS/DesignPattern

(DesignPattern) FrontController - Version04 (단순하고 실용적인 컨트롤러)

주누 2021. 5. 7. 22:36

jwdeveloper.tistory.com/293

 

(DesignPattern) FrontController - Version03 (Model 추가)

jwdeveloper.tistory.com/292 (DesignPattern) FrontController - Version02 (View 분리) jwdeveloper.tistory.com/291 (DesignPattern) FrontController 패턴이란? (with FrontController - Version01) 이번 포..

jwdeveloper.tistory.com

Version03 문제점

위의 Version03의 문제점은 무엇일까?

컨트롤러에서 ModelView를 반환함으로써 부득이하게 ModelView에 뷰 랜더링 시에 전달할 Map을 담아야 했다.

 

해결방안

컨트롤러 인터페이스 model객체를 담을 수 있는 파라미터를 추가하고자 한다.
이렇게 함으로써 컨트롤러는 ModelView 객체를 반환하지 않고 뷰의 논리적 이름만 반환하면 되는 마법이 일어난다.

 


컨트롤러 인터페이스 생성

기존의 파라미터에 Model 객체를 담을 수 있는 파라미터를 추가한다.

public interface ControllerVersion04 {

    String process(final Map<String,String> paramMap, final Map<String, Object> model);

}

version03 컨트롤러 인터페이스

 

폼, 저장, 조회 클래스 생성

비즈니스 로직을  처리하는 컨트롤러는 비즈니스 로직을 처리한 뒤 전달받은 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";
    }

}

version03 컨트롤러 

 

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);
}

version03 FrontController

 


Code Link

github.com/mike6321/SpringMVC/commit/aa35b0418b37340ca9f9ccc5768c5199b6f092d5#diff-9b2e6637f4e656d5a2ddc5c37f24c54a159b2da4bc1c01d9460680bda3 4 b36 b7

 

(servlet) 단순하고 실용적인 컨트롤러 · mike6321/SpringMVC@aa35b04

Permalink This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. Browse files (servlet) 단순하고 실용적인 컨트롤러 Loading branch information Showing 6 changed files with 178 additions

github.com