MVC 패턴과 한계
20 Aug 2023스프링 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
처럼 사용되지 않은 코드가 있음- 공통 처리가 어려움
- view로 이동하는
- 한계를 해결하기 위해서는 컨트롤러 호출 전에 공통 기능을 처리해야 함 (프론트 컨트롤러 패턴)