MVC 패턴과 한계

스프링 MVC 1편 강의 정리

MVC 패턴이 나타나게 된 배경

  • 하나의 servlet 또는 JSP로 비즈니스 로직, 뷰 렌더링 처리
    • 너무 많은 역할을 가지게 됨
    • 유지보수 어려움
  • 변경 라이프 사이클이 다름
    • UI와 비즈니스 로직의 라이프 사이클이 다름
    • UI와 비즈니스 로직은 수정하는 경우가 다르게 발생할 가능성이 높음
  • 기능 특화
    • JSP 같은 템플릿은 화면 렌더링에 최적화되어 있으므로 이 작업만 담당하는 것이 효과적

Model View Controller

  • controller, view 영역으로 역할을 나눔
  • controller
    • HTTP 요청을 받아 파라미터 검증
    • 비즈니스 로직 실행
    • view에 전달할 결과 데이터를 조회해서 모델에 담음
  • model
    • view에 출력할 데이터를 담아둠
    • view가 필요한 데이터를 모두 담아 전달하는 역할을 맡아 view는 화면 렌더링에만 집중 가능
  • view
    • 모델에 담겨있는 데이터를 이용해서 화면을 그리는 일 집중

MVC 적용

  • 서블릿을 controller, JSP를 view로 사용해서 적용
  • request.setAttribute(), request.getAttribute() 이용해서 데이터 보관, 조회 가능
  • dispatcher.forward() : 다른 서블릿이나 JSP로 이동할 수 있는 기능으로 서부 내부에서 다시 호출 발생
// 생성 form
@WebServlet(name = "mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form")
public class MvcMemberFormServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String viewPath = "/WEB-INF/views/new-form.jsp";
		RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);// view 이동
		dispatcher.forward(request, response);
	}
}
// 저장
@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {

	private MemberRepository memberRepository = MemberRepository.getInstance();

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username = request.getParameter("username");
		int age = Integer.parseInt(request.getParameter("age"));

		Member member = new Member(username, age);
		memberRepository.save(member);

		// model 에 데이터 보관
		request.setAttribute("member", member);

		String viewPath = "/WEB-INF/views/save-result.jsp";
		RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
		dispatcher.forward(request, response);
	}
}

MVC 패턴의 한계

  • controller
    • view로 이동하는 forward 중복
    • viewpath 중복, jsp가 아닌 다른 템플릿으로 바꿀 경우 전체 코드를 다 변경해야 함
    • response처럼 사용되지 않은 코드가 있음
    • 공통 처리가 어려움
  • 한계를 해결하기 위해서는 컨트롤러 호출 전에 공통 기능을 처리해야 함 (프론트 컨트롤러 패턴)