서블릿과 JSP의 한계
서블릿으로 개발할 때는 view 화면을 위한 html 을 만드는 작업이 자바코드에 섞여가지고 지저분하고 복잡.
JSP 경우 코드의 상위 절반은 비즈니스로직이고 나머지 하위 절반은 HTML 보여주기위한 view영역이다. JSP가 너무 많은 역할을 담당한다. 유지보수 HELL
MVC 패턴의 등장
Controller = HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.
Model = 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다.
View = 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다. 여기서는 HTML을 생성하는 부분을 말한다.
Controller에 비지니스 로직을 두게 되면 너무 많은 역할을 담당하게 된다.
MVC 패턴2에서는 비지니스 로직을 호출을 하는 역할만 담당하게 된다.
MVC2 패턴 적용
Model 을 httpServletRequest로 쓴다.
@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);
}
}
dispatcher.forward() = 다른 서블릿이나 jsp로 이동할수 있는 기능이다. 서버 내부에서 다시 호출이 발생한다. redirect가 아니다.
Controller를 거쳐서 비지니스 처리를 다 한후에 view를 호출하게 된다.
/WEB-INF/ 밑의 directory들은 직접 접근이 불가능하다.
항상 Controller단에서 forward 나 redirect를 통해서 접근이 가능하다. WAS의 룰이다.
redirect = 실제 클라이언트에 응답이나갔다. 클라이언트가 다시 redirect 경로를 요청한다. 클라이언트도 인지하고 실제 URL 경로도 변경이된다.
forward = 반면에 포워드는 서버 내부에서 일어나는 호출이기 때문에 클라이언트가 전혀인식 하지 못한다.
form의 action을 절대경로 (/로 시작) 이 아니라 상대경로 (/로 시작하지 않음) 로 지정해주면 폼 전송시 현재 URL이 속한 계층 경로 + save가 호출된다.
/servelet-mvc/members/ -> /servlet-mvc/members/save
MVC2의 한계
forward의 중복 = view로 이동하는 코드가 항상 중복 호출되어야한다.
viewPath 중복 = "/WEB-INF/views/new-form.jsp; 처럼 매번 써줘야한다. 또한 prefix , suffix 가 달라지면 코드를 다 갈아야한다.
HttpServletResponse를 사용하지도 않는데 인자로 받고 있고 이것을 사용하는 코드는 테스트 케이스를 작성하기 어렵다.
공통 처리가 어렵다
FrontController 패턴 이 필요하다. = 컨트롤러 호출전에 공통기능을 깔끔이 처리하는 솔루션이 필요하다.
'WEB > Spring MVC 1' 카테고리의 다른 글
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(스프링 MVC - 기본기능) (0) | 2021.03.30 |
---|---|
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(스프링 MVC - 구조이해) (0) | 2021.03.29 |
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(MVC 프레임워크 만들기) (0) | 2021.03.29 |
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(서블릿) (0) | 2021.03.27 |
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(웹 애플리케이션 이해) (0) | 2021.03.27 |