간단한 애플리케이션 (회원 관리 웹 애플리케이션) 을 구축해보자.
핵심 비즈니스 로직 구현 이후 아래 방법으로 리펙터링 해보자.
1. 서블릿으로 구현
2. JSP 로 구현
3. MVC 패턴으로 구현
서블릿과 자바 코드만으로 HTML 을 만드는 것은 매우 복잡하고 비효율적이다. 따라서 템플릿 엔진을 사용하여 이를 필요한 곳만 코드를 적용해서 동적으로 변경해보자.
<% %>
안에는 자바 코드를 입력할 수 있다. → 비즈니스 로직을 구현한다.<% %>
를 제외한 나머지는 모두 HTTP 안에 담겨진다.처음 JSP 를 시작할 때 아래 코드를 첫 줄에 입력해 줘야 한다. → JSP 문서라는 뜻 !
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
.jsp
까지 함께 적어줘야 한다.localhost:8080/~.jsp
하지만 부족한 느낌이 든다 !
→ 두 가지 일을 하나의 페이지에서 실행하는 느낌 ..?
서블릿의 문제를 JSP 를 사용함으로써 뷰를 생성하는 HTML 작업이 깔끔해졌고, 동적으로 변경이 필요한 부분에만 자바 코드를 적용할 수 있게 되었다.
하지만 그럼에도 해결되지 않은 몇 가지 고민이 있다.
다양한 코드가 모두 JSP 에 노출되어 있다. (Java 코드, 데이터를 조회하는 레포지토리 등)
→ JSP 가 너무 많은 역할을 하기 때문에 나중에 유지 보수하기 어렵다.
→ MVC 등장 ! 💡
너무 많은 역할을 한다.
→ 하나의 비즈니스 로직을 수정하고 싶을 때, 수천줄의 HTML 코드를 함께 변경해야 한다!
변경 시 라이프 사이클이 다른 코드를 하나에 관리한다.
→ 예를 들어, UI 를 수정하는 일과 비즈니스 로직을 수정하는 일은 각각 다르게 발생할 가능성이 높은 데 하나의 코드로 관리하는 것은 유지보수하기 좋지 않다 !
뷰 템플릿은 화면 렌더링에 적합하다.
→ JSP 같은 뷰 템플릿은 화면 렌더링 기능에 최적화 되어 있다.
→ 따라서 얘네는 이 업무만 담당하는 게 좋다.
컨트롤러 (Controller)
→ 요청 받은 HTTP 의 파라미터 검증 & 비즈니스 로직 실행
→ 뷰에 전달할 결과 데이터를 조회해서 모델에게 전달
모델 (Model)
→ 뷰에 필요한 데이터를 담는다.
뷰 (View)
→ 화면 렌더링 역할
→ HTML 생성
💡 컨트롤러 는 비즈니스 로직에 있는 서비스를 호출 !
💡 비즈니스 로직은 서비스(Service) 계층에서 처리 !
redirect
는 실제 클라이언트(웹 브라우저) 에 응답이 나갔다가, 클라이언트가 redirect 경로로 다시 요청한다.
→ 클라이언트가 인지할 수 있고, URL 실제로 보이지 않지만 경로도 변경된다.
forward
는 서버 내부에서 일어나는 호출이다.
→ 클라이언트가 전혀 인지하지 못한다.
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
String viewPath = "/WEB-INF/views/save-result.jsp";
HttpServletRequest request, HttpServletResponse response
✅ 정리하면, 공통 처리가 어렵다는 문제가 있다.
이 문제를 해결하려면 컨트롤러를 호출 하기 전에 먼저 공통 기능을 처리하는 것이 필요하다. 즉, 수문장 역할을 하는 기능이 필요하다.
→ 프론트 컨트롤러(Front Controller) 등장 ! 💡