서블릿, JSP, MVC 패턴

Seunghee Lee·2023년 6월 2일
0

Spring MVC

목록 보기
3/3

🌐 회원 관리 웹 애플리케이션 요구사항

간단한 애플리케이션 (회원 관리 웹 애플리케이션) 을 구축해보자.
핵심 비즈니스 로직 구현 이후 아래 방법으로 리펙터링 해보자.

1. 서블릿으로 구현
2. JSP 로 구현
3. MVC 패턴으로 구현


1. 서블릿으로 구현하기

서블릿과 자바 코드만으로 HTML 을 만드는 것은 매우 복잡하고 비효율적이다. 따라서 템플릿 엔진을 사용하여 이를 필요한 곳만 코드를 적용해서 동적으로 변경해보자.

  • 템플릿 엔진에는 JSP, Thymeleaf 등이 있다.
    ※ 요즘은 JSP 보다 Thymeleaf 를 사용하는 추세이다.

2. JSP 로 구현하기

  • <% %> 안에는 자바 코드를 입력할 수 있다. → 비즈니스 로직을 구현한다.
  • <% %> 를 제외한 나머지는 모두 HTTP 안에 담겨진다.

처음 JSP 를 시작할 때 아래 코드를 첫 줄에 입력해 줘야 한다. → JSP 문서라는 뜻 !

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
  • 실행 때에는 .jsp 까지 함께 적어줘야 한다.
    localhost:8080/~.jsp

하지만 부족한 느낌이 든다 !
→ 두 가지 일을 하나의 페이지에서 실행하는 느낌 ..?


💥 서블릿과 JSP 의 한계

서블릿의 문제를 JSP 를 사용함으로써 뷰를 생성하는 HTML 작업이 깔끔해졌고, 동적으로 변경이 필요한 부분에만 자바 코드를 적용할 수 있게 되었다.

하지만 그럼에도 해결되지 않은 몇 가지 고민이 있다.

다양한 코드가 모두 JSP 에 노출되어 있다. (Java 코드, 데이터를 조회하는 레포지토리 등)
→ JSP 가 너무 많은 역할을 하기 때문에 나중에 유지 보수하기 어렵다.
MVC 등장 ! 💡


3. MVC 패턴으로 구현하기

✅ MVC 등장하기 이전

  • 너무 많은 역할을 한다.
    → 하나의 비즈니스 로직을 수정하고 싶을 때, 수천줄의 HTML 코드를 함께 변경해야 한다!

  • 변경 시 라이프 사이클이 다른 코드를 하나에 관리한다.
    → 예를 들어, UI 를 수정하는 일과 비즈니스 로직을 수정하는 일은 각각 다르게 발생할 가능성이 높은 데 하나의 코드로 관리하는 것은 유지보수하기 좋지 않다 !

  • 뷰 템플릿은 화면 렌더링에 적합하다.
    → JSP 같은 뷰 템플릿은 화면 렌더링 기능에 최적화 되어 있다.
    → 따라서 얘네는 이 업무만 담당하는 게 좋다.

✅ MVC 등장

  • 컨트롤러 (Controller)
    → 요청 받은 HTTP 의 파라미터 검증 & 비즈니스 로직 실행
    → 뷰에 전달할 결과 데이터를 조회해서 모델에게 전달

  • 모델 (Model)
    → 뷰에 필요한 데이터를 담는다.

  • 뷰 (View)
    → 화면 렌더링 역할
    → HTML 생성


실제 MVC 동작은 아래 그림과 같이 동작한다.

💡 컨트롤러 는 비즈니스 로직에 있는 서비스를 호출 !
💡 비즈니스 로직은 서비스(Service) 계층에서 처리 !


💻 redirect vs forward

  • redirect 는 실제 클라이언트(웹 브라우저) 에 응답이 나갔다가, 클라이언트가 redirect 경로로 다시 요청한다.
    → 클라이언트가 인지할 수 있고, URL 실제로 보이지 않지만 경로도 변경된다.

  • forward 는 서버 내부에서 일어나는 호출이다.
    → 클라이언트가 전혀 인지하지 못한다.


📗 MVC 패턴의 한계

  1. forward 중복
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
  1. ViewPath 중복
String viewPath = "/WEB-INF/views/save-result.jsp";
  1. 사용하지 않는 코드 발생 (※ 다음 코드를 사용할 때도 있고, 안할 때도 있다.)
HttpServletRequest request, HttpServletResponse response
  1. 공통 처리가 어렵다.

✅ 정리하면, 공통 처리가 어렵다는 문제가 있다.
이 문제를 해결하려면 컨트롤러를 호출 하기 전에 먼저 공통 기능을 처리하는 것이 필요하다. 즉, 수문장 역할을 하는 기능이 필요하다.
프론트 컨트롤러(Front Controller) 등장 ! 💡

profile
자라나라 개발개발 ~..₩

0개의 댓글