[Spring] 서블릿, JSP, MVC 패턴

ggamang·2023년 3월 29일
0

JAVA&Spring

목록 보기
18/27

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

회원 - username, age

기능 - 회원 저장 기능, 회원 목록 조회 기능

서블릿으로 회원 관리 웹 애플리케이션 만들기

템플릿 엔진이 나온 이유

서블릿 덕분에 동적으로 원하는 HTML을 만들 수 있지만, 복잡하고 비효율적이다.

JAVA 코드로 HTML을 만들어 내기 보다는, HTML에 동적으로 변경할 부분만 자바 코드를 넣을 수 있다면 더 효율적이다.

템플릿 엔진을 사용하면 HTML 문서에서 필요한 곳만 코드를 적용해서 동적으로 변경할 수 있다.

→ JSP, Thymeleaf, Freemarker, Velocity 등이 있다

JSP로 회원 관리 웹 애플리케이션 만들기

JAVA코드, 레포지토리 등 다양한 코드가 모두 JSP에 노출되어 있다보니 JSP가 너무 많은 역할을 수행하고 있다. 코드의 상위 절반은 비즈니스 로직, 나머지 하위 절반만 html로 보여주기 위한 뷰 영역이다.

→ MVC 패턴의 등장: 비즈니스 로직은 다른 곳에서 처리하고, JSP는 view에만 집중

MVC 패턴 - 개요

Model

  • 뷰에 출력할 데이터를 담아둔다.

→ 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고 화면 렌더링에만 집중 가능

View

  • 모델에 담겨있는 데이터를 사용해서 화면 그리는 일에 집중

Controller

  • HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다.
  • 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다

MVC 패턴 - 적용

Model - HttpServletRequest 객체 사용

  • request.setAttribute(), request.getAttribute()를 사용하여 데이터를 보관하고 조회한다

dispatcher.forward() - 다른 서블릿이나 JSP로 이동할 수 있는 기능으로, 서버 내부에서 호출이 발생한다

💡 redirect vs forward

  • 리다이렉트: 클라이언트가 redirect 경로로 다시 요청
    → 클라이언트 인지 가능, URL 경로도 실제로 변경
  • 포워드: 서버 내부에서 일어나는 호출로 클라이언트가 전혀 인지하지 못한다

MVC 패턴 - 한계

중복

View로 이동하는 코드가 항상 중복 호출 되어야 한다.

RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);

viewpath 중복

String viewPath = "/WEB-INF/views/new-form.jsp";

만약 jsp가 아닌 thymeleaf 같은 다른 뷰로 변경 시 전체 코드 변경해야 함

사용하지 않는 코드

HttpServletRequest request, HttpServletResponse response

response는 현재 코드에서 사용이 되지 않고 있다

공통처리의 어려움

기능에 복잡해질수록 컨트롤러에서 공통 처리해야할 부분이 증가하게 됨. 수문장 역할이 필요하다.

→ 컨트롤러 호출 전에 먼저 공통 기능을 처리해야한다(프론트 컨트롤러 패턴 도입)

0개의 댓글