개요
너무 많은 역할
- 하나의 서블릿이나 JSP만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리하는 문제점
- 너무 많은 역할 담당
- 유지보수 어려워짐
변경의 라이프 사이클
- 내부와 외부의 라이프 사이클이 다름
- UI 수정과 비즈니스 로직 수정은 각각 다르게 발생할 가능성이 매우 높음
- 대부분 서로 영향을 주지 않는다
- 분리되어 있기 때문에 함께 관리하는 것은 좋지 않다
기능 특화
- 뷰 테플릿은 화면을 렌더링 하는데 최적화 되어 있기 때문에 분리하여 담당하는 것이 효과적이다
Model View Controller
- 컨트롤러
- HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다
- 모델
- 뷰에 출력할 데이터를 담아둔다.
- 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주기에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 된다.
- 화면을 렌더링 하는 일에 집중할 수 있다
- 뷰
- 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다.
MVC 작성
@WebServlet(name = "hello", urlPatterns = "/hello")
public class MvcMemberFormServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// request로 값 받아오기
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
// Model에 데이터 담기
request.setAttribute("member", member);
// View 세팅
String viewPath = "/WEB-INF/views/hello.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
- dispatcher.forward() : 다른 서블릿이나 JSP로 이동할 수 있는 기능. 서버 내부에서 다시 호출이 발생
- /WEB-INF : 이 경로 안에 JSP가 있으면 외부에서 직접 JSP 호출 가능
redirect vs forward
- 리다이렉트
- 실제 클라이언트(웹 브라우저)에 응답이 나갔다가, 클라이언트가 redirect 경로로 다시 요청한다.
- 클라이언트가 인지할 수 있고, URL 경로도 실제로 변경된다.
- 포워드
- 서버 내부에서 일어나는 호출이기 때문에 클라이언트가 전혀 인지하지 못한다
MVC 패턴 한계
포워드 중복
- View로 이동하는 코드가 항상 중복 호출되어야 한다
ViewPath 중복
- prefix: /WEB-INF/views/
- suffix: .jsp
사용하지 않는 코드
- HttpServletRequest request, HttpServletResponse response
- 사용할 때도 있고, 사용하지 않을 때도 있다.
- HttpServletRequest , HttpServletResponse 를 사용하는 코드는 테스트 케이스를 작성하기도 어렵다.
공통 처리가 어렵다
프론트 컨트롤러(Front Controller) 패턴 도입으로 해결 가능
'Spring > MVC' 카테고리의 다른 글
[MVC] 요청 매핑 (0) | 2024.09.10 |
---|---|
[MVC] MVC 구조 (0) | 2024.09.06 |
[MVC] 프론트 컨트롤러 패턴 (0) | 2024.09.05 |
[MVC] Servlet (0) | 2024.09.05 |