서블릿, JSP, MVC 패턴
- 서블릿과 자바 코드만으로 HTML을 만드는 것은 매우 비효율적이고 힘들기에 보완하기 위해 템플릿 엔진이 생겨났다.
- 템플릿 엔진에는 JSP, Thymleaf, Freemarker, Velocity 등이 있다.
- JSP는 성능, 기능면에서 좋지 않기에 스프링과 잘 통합되는 Thymleaf를 주로 사용한다.
- JSP는 java가 아니기에 main/webapp에서 개발해야한다.
- URI 경로는 webapp까지는 디폴트이기에 webapp 하위부터 작성하면 되며 .jsp 확장자까지 포함해야 한다.
- JSP 코드 작성 방법
- java 코드(로직)는 <% %> 안에 작성할 수 있다.
- 로직은 보통 html 코드 이전에 작성
- <% %>는 자바 코드를 입력할 수 있다.
- <%= %>는 자바 코드를 출력할 수 있다.
- 필요한 객체들은 page import를 통해 사용할 수 있다.
- request, response는 JSP에서 지원을 해주기에 따로 import 하지 않아도 사용 가능
- java 코드(로직)는 <% %> 안에 작성할 수 있다.
//JSP 코드
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
MemberRepository memberRepository = MemberRepository.getInstance();
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
%>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
- JSP는 내부에서 서블릿으로 변환된다.
- JSP는 서블릿과 달리 HTML을 중심으로 하고 자바 코드를 부분부분 사용해준다.
- 서블릿의 한계
- 뷰 화면을 위한 HTML을 만드는 작업이 자바 코드에 섞여서 지저분하고 복잡하다.
- JSP의 한계
- JSP가 너무 많은 역할(비지니스 로직 + 뷰 렌더링 ...)을 하기에 다양한 코드가 모두 JSP에 노출된다.
=> 유지보수가 어려워진다. - UI와 비지니스 로직의 변경 라이프 사이클이 다르다.
- 변경의 라이프 사이클이 다른 경우 코드를 분리하는 것이 좋다.
- JSP가 너무 많은 역할(비지니스 로직 + 뷰 렌더링 ...)을 하기에 다양한 코드가 모두 JSP에 노출된다.
MVC 패턴
- MVC 패턴 (Model View Controller) : 하나의 서블릿, JSP로 처리하던 것들을 컨트롤러와 뷰라는 영역으로 서로 역할을 나눈 패턴을 의미한다.
- 컨트롤러 : HTTP 요청을 받아서 파라미터를 검증하고 비지니스 로직을 실행하며 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.
- 모델 : 뷰에 출력할 데이터를 담아둠으로 뷰는 비지니스 로직이나 데이터 접근을 몰라도 되기에 화면 렌더링에만 집중할 수 있다.
- 뷰 : 모델에 담겨있는 데이터를 사용해서 화면을 그리는 역할을 한다. (HTML 생성)
- 대부분 실무에서는 서비스와 레포지토리까지 사용하는 MVC 패턴을 사용한다.
- 컨트롤러에 비지니스 로직을 담을 수 있지만 그렇게 되면 컨트롤러가 너무 많은 역할을 담당한다.
- 일반적으로 비지니스 로직은 서비스 계층에서 처리하고 컨트롤러는 비지니스 로직을 호출하는 것을 담당한다.
//서블릿
@WebServlet(name = "mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form")
public class MvcMemberFormServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
- getRequestDispatcher(이동할 뷰 경로)로 dispatcher 객체를 생성, dispatcher는 컨트롤러에서 뷰로 이동할 때 사용하는 것.
- forward()를 통해 서블릿에서 다른 서블릿이나 jsp로 이동할 수 있는 기능이다. (서버 내부에서 호출 발생)
- 디스패처 서블릿(Dispatcher Servlet) : 클라이언트 요청을 적절한 컨트롤러로 라우팅하고 처리된 결과를 뷰에 전달하여 사용자에게 응답을 생성하는 역할을 하는 것
- redirect vs forward
- redirect는 실제 클라이언트에 응답이 나갔다가 클라이언트가 redirect 경로로 다시 요청하기에 클라이언트가 인지할 수 있고 URL 경로도 실제로 변경된다.
- forward는 서버 내부에서 일어나는 호출이기에 클라이언트가 전혀 인지하지 못한다.
//new-form.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 상대경로 사용, [현재 URL이 속한 계층 경로 + /save] -->
<form action="save" method="post">
username: <input type="text" name="username"/>
age: <input type="text" name="age"/>
<button type="submit">전송</button>
</form>
</body>
</html>
- 절대 경로 : 루트 디렉토리부터 시작해서 해당 파일, 디렉토리까지의 경로를 나타낸다.
- 상대 경로 : 현재 작업 디렉토리를 기준으로 해당 파일, 디렉토리의 위치를 나타낸다.
- 현재 URL이 속한 계층 경로 + @ 이다.
- ex) 현재 URL = /jsp/members/new-form일 때 상대경로 save를 사용하면 /jsp/members/save가 된다.
- webapp/WEB-INF 하위 JSP 파일은 외부에서 직접 JSP를 호출할 수 없다.
= URI를 통해서 호출할 수 없다.- 컨트롤러에 의해서 forward()로 JSP를 호출하는 방법만 가능하다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
성공
<ul>
<li>id = ${member.id}
</li>
<li>username = ${member.username}
</li>
<li>age = ${member.age}
</li>
</ul>
<a href="/index.html">메인</a>
</body>
- 컨트롤러에서 Model에 데이터를 담을 때는 setAttribute(키, 값)을 사용한다.
- 컨트롤러에서 Model에 담은 데이터를 뷰에서 사용하려면 ${} 표현식을 사용해야 한다.
- ${}는 프로퍼티 접근법을 사용하기에 조회할 때는 getter를 호출하고 값을 넣으면 setter를 호출한다.
- 최근에는 JSP보다 Thymleaf를 사용하므로 JSP의 상세 내용은 필요할 때 찾아서 사용하자
- 예제 MVC 패턴의 한계
- 포워드, viewPath와 같은 중복되는 코드가 많다.
- log와 같은 공통 처리가 어렵다.
- 공통 기능을 처리하기 위해서 컨트롤러 호출 전 프론트 컨트롤러를 도입함으로 공통 기능을 처리하도록 하면 된다. (프론트 컨트롤러는 스프링 MVC의 핵심 중 하나)
출처 : [인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술]
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 강의 | 김영한 - 인프런
김영한 | 웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습
www.inflearn.com
'Spring > [인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술]' 카테고리의 다른 글
[인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] 스프링 MVC - 기본 기능 (4) | 2024.10.07 |
---|---|
[인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] 스프링 MVC - 구조 이해 (2) | 2024.10.04 |
[인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] MVC 프레임워크 만들기 (2) | 2024.10.03 |
[인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] 서블릿 (3) | 2024.09.30 |
[인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] 웹 애플리케이션 이해 (2) | 2024.09.30 |