서블릿
- 서블릿은 자바로 웹 페이지를 동적으로 생성하는 서버 프로그램으로, 자바 코드 안에 HTML을 포함한다.
- 서블릿을 사용하면 동적으로 원하는 HTML을 만들 수 있으나, 자바 코드에 HTML을 만들어야 하므로 매우 복잡하고 비효율적
@WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/members/new-form")
public class MemberFormServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter w = response.getWriter();
// HTML
w.write("<!DOCTYPE html>\n" +
"<html>\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>Title</title>\n" +
"</head>\n" +
"<body>\n" +
"<form action=\"/servlet/members/save\" method=\"post\">\n" +
" username: <input type=\"text\" name=\"username\" />\n" +
" age: <input type=\"text\" name=\"age\" />\n" +
" <button type=\"submit\">전송</button>\n" +
"</form>\n" +
"</body>\n" +
"</html>\n");
}
}
- 이러한 비효율을 해결하기 위해 HTML 문서에 동적으로 변경해야 하는 부분만 자바 코드를 넣는 템플릿 엔진이 등장했다.
템플릿 엔진
- 지정된 템플릿 양식과 데이터를 이용하여 HTML을 생성하는 소프트웨어로, 웹 사이트의 화면을 어떤 형태로 만들지 도와주는 양식
- Spring을 사용할 경우 View를 만들 때 JSP를 템플릿 엔진으로 사용할 수 있으며, JSP 외에도 Thymeleaf, Freemarker, Velocity 등이 있다.
- 템플릿 엔진을 사용하면 HTML 문서에서 필요한 곳만 코드를 적용해서 동적으로 변경이 가능하다.
JSP
- HTML 내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹 브라우저에 돌려 주는 서버 사이드 스크립트 언어이다.
- Java EE 스펙 중 일부로 웹 애플리케이션 서버에서 동작하며, 실행시에는 자바 서블릿으로 변환된 후 실행된다.
<%@page import="java.util.Arrays"%>
<%@page import="java.util.ArrayList"%>
<%@page import="bean.MemberDAO"%>
<%@page import="bean.MemberDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body align="center">
<form action="../controller/checkPlay.jsp" method="post">
<h1>계정</h1>
<br>
<div id="div">
// JAVA 코드
<%
String id = (String)session.getAttribute("id");
MemberDTO dto = new MemberDTO();
dto.setId(id);
MemberDAO dao = new MemberDAO();
ArrayList<Object> list = dao.acccount(dto);
String[] accountNameList = String.valueOf(list.get(0)).split(",");
ArrayList<String> list2 = new ArrayList<>(Arrays.asList(accountNameList));
while (list2.indexOf("") != -1) {
list2.remove("");
}
int i = 0;
for (String name : list2) {
%>
<input type='submit' name='account' value="<%= name %>"/>
<%
}
%>
</div>
</form>
</body>
</html>
- 뷰를 생성하는 HTML 작업을 중심으로 중간에 동적으로 변경이 필요한 부분에 자바 코드를 적용하기 때문에 서블릿에 비해 더 편리하게 HTML을 만들 수 있다.
- 하지만 자바 코드와 데이터를 조회하는 리포지토리 등 다양한 코드가 모두 JSP에 노출되고, JSP가 너무 많은 역할을 담당하기 때문에 유지보수가 어렵다.
- 이러한 문제를 해결하기 위해 MVC 패턴이 등장하게 되었다.
서블릿과 JSP의 문제점
1. 서블릿과 JSP에서 너무 많은 역할을 담당한다.
- 하나의 서블릿이나 JSP만으로 비즈니스 로직과 뷰 렌더링까지 전부 처리하면 너무 많은 역할을 하게 되고, 결과적으로 유지보수가 어려워진다.
- 비즈니스 로직을 호출하는 부분에 변경이 발생할 경우 해당 코드를 손대야하고, UI를 변경할 일이 있어도 비즈니스 로직이 함께 있는 파일을 수정해야 한다.
2. UI와 비즈니스 로직 간에 변경의 라이프 사이클이 다르다.
- UI를 일부 수정하는 일과 비즈니스 로직을 수정하는 일은 각각 다르게 발생할 가능성이 매우 높고, 대부분 서로에게 영향을 주지 않는다.
- 변경의 라이프 사이클이 다른 부분을 하나의 코드로 관리하는 것은 유지보수에 좋지 않다.
MVC 패턴
- 하나의 서블릿이나 JSP로 처리하던 일들을 컨트롤러와 뷰라는 영역으로 역할을 나눈 것으로, MVC 패턴을 적용하면 컨트롤러의 역할과 뷰를 렌더링하는 역할을 명확하게 구분할 수 있다.
- 즉, 사용자 인터페이스로부터 비즈니스 로직을 분리함으로써 애플리케이션의 확장성을 높이고 유지보수를 용이해 진다.
- 뷰는 단순하게 모델에서 필요한 데이터를 꺼내서 화면을 렌더링하는 일만 담당하기 때문에 코드가 단순하고 깔끔해진다.
- 컨트롤러는 HTTP 요청을 받아서 파라미터를 검증, 비즈니스 로직을 실행하거나, 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.
- 일반적으로 컨트롤러에 비즈니스 로직을 두면 너무 많은 역할을 담당하기 때문에 비즈니스 로직은 서비스라는 별도의 계층을 만들어 처리하고, 컨트롤러는 비즈니스 로직이 있는 서비스 호출을 담당하게 구성한다.
'Spring > Spring MVC' 카테고리의 다른 글
뷰 컨트롤러 (0) | 2022.03.27 |
---|---|
컨트롤러 요청과 응답 (0) | 2022.03.05 |
@Valid 유효성 검사 (0) | 2022.01.26 |
스프링 MVC 구조 (0) | 2022.01.23 |