JSP나 Servlet으로는 동적 HTML을 만들기에는 부족한 부분이 많았다.
- 너무 많은 역할
로직과 뷰 렌더링까지 처리하게 되면 역할이 많아지게 되고 유지보수가 어려워진다. - 변경의 라이프 사이클
UI와 비즈니스 로직을 수정하는 일은 각각 다르게 발생하고 독립적이다. 이렇게 라이프 사이클이 다른 부분을 하나의 코드로
관리하게 되면 유지보수가 어려워진다.
MVC(Model View Controleer)
JSP나 Servlet으로 처리하던 것을 컨트롤러(Controleer)와 뷰(View)라는 영역으로 역할을 나는 것을 말한다.
- 컨트롤러 : HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.
- 모델 : 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다.
- 뷰 : 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다. HTML 생성 ( 화면 렌더링 )
/WEB-INF와 forward(request, response)
/WEB-INF 경로 안에 jsp가 있다면 외부에서 직접 jsp를 호출할 수 없다. 이때 url에 forward를 사용하면 서버 내부에서 호출을 하여 클라이언트가 인지하지 못한다.
※ redirect : 리다이렉트는 실제 클라이언트(웹 브라우저)에 응답이 나갔다가, 클라이언트가 redirect 경로로 서버를 재요청하는 방식.
Servlet : 자바 클래스 안에 html까지 모두 작성
JSP : html 안에 자바 코드를 작성
MVC : 자바 클래스(Controller) 안에서는 로직, html(JSP)에서는 view 역할만 충당
MVC 패턴
- 클라이언트가 비즈니스 로직(Controller)을 호출 (회원가입 폼으로 들어온다.)
/servlet-mvc/members/new-form -> MvcMemberFormServlet
viewpath = /WEB-INF/views/new-form.jsp - 서비스를 사용 (회원가입 데이터 입력 후 Model에 보관)
/servlet-mvc/members/save -> MvcMemberSaveServlet
request.setAttribute(name, Member);
viewpath = /WEB-INF/views/save-result.jsp - 뷰 로직에서 Model에 저장된 데이터를 참조 (Model에서 데이터 참조)
/servlet-mvc/members -> MvcMemberListServlet
request.setAttribute(name, List <>);
viewpath = /WEB-INF/views/members.jsp - 결과 뷰에서 memeberList를 뿌려준다 (회원 목록 열람)
<c:forEach var="item" items="${members}">
<tr>
<td>${item.id}</td>
<td>${item.username}</td>
<td>${item.age}</td>
</tr>
</c:forEach>
JSP, Servlet의 단점을 MVC 패턴으로 보완할 수 있었다.
하지만!! 공통 기능의 처리가 어렵다는 단점이 또 생겨버렸다. (중복되는 코드나 상황들)
ex) forward와 /WEB-INF/ 의 중복
따라서 컨트롤러를 호출하기 전에 미리 공통 기능을 처리해야 한다. (Front Controller)
'MVC with 김영한' 카테고리의 다른 글
스프링 애노테이션 (0) | 2021.10.16 |
---|---|
스프링 MVC (0) | 2021.10.15 |
MVC 프레임워크 (0) | 2021.10.07 |
서블릿 (0) | 2021.10.04 |
웹 애플리케이션의 구조 (0) | 2021.10.02 |