서블릿에서 MVC 패턴까지

Jang990·2023년 6월 8일
0

시작

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

해당 글은 다음 강의를 통해 배운 내용을 스스로 정리한 글입니다.
혼자 정리한 내용이다보니 강의 내용과 다를 수 있습니다.

기존 서블릿을 사용한 개발

w = response.getWriter();
w.write("<!DOCTYPE html>\n" +
                "<html>\n" +
                "<head>\n" +
                " <meta charset=\"UTF-8\">\n" +
                " <title>Title</title>\n" +
                "</head>\n" +
                "<body>\n" +
                "... 페이지 내용 ..."
                "</body>\n" +
                "</html>\n");

기존 서블릿에서는 이런식으로 개발해야 했다.

그래서 JSP, Thymeleaf와 같은 템플릿 엔진이 필요하다.


템플릿 엔진(JSP)를 통한 개발

JSP로 개발을 할 때 처음에는 비즈니스 로직과 뷰 로직을 한 페이지에서 개발했다.

<%
Memberrepository meberRepository = MemberRepository.getInstance();
List<Member> members = memberRespository.findAll();
%>
<html>
...
<%
for(Member member : members) {
out.write(...);
...
}
%>
</html>

이것 또한 문제였다.

이렇게 화면을 보여주는 뷰와 비즈니스 로직이 혼합되면서 하나의 JSP의 코드 라인이 엄청나게 많아지고 복잡해졌다.


MVC 패턴의 등장

처음 JSP로 개발한 페이지를 다시 확인해보자.
해당 페이지는 다음과 같이 2가지 역할을 한 번에 하고 있다.

<%
Member를 저장소에서 가져오기
%>

<html>
... 가져온 정보로 화면 출력하기 ...
</html>

지금은 단순히 Member만을 가져오는 페이지이지만 서비스가 복잡해지고 가져올 정보도 많아진다면 하나의 JSP 파일이 엄청나게 복잡해질 것이다.

Member를 저장소에 저장하거나, 가져오거나 하는 로직들은 따로 분리를 하고
화면 구성에 필요한 데이터만 JSP 화면에 전달해준다.
그리고 JSP는 화면을 렌더링하는데 집중하게 한다.
이렇게 만들면 훨씬 코드가 단순해지고 유지보수하기 쉬워질 것이다.


참고 - request 임시 저장소

request.getAttribute();
request.setAttribute();

이게 임시저장소이다.(Model에 해당)
request는 클라이언트에게 요청이 들어와서 응답이 나갈 때 까지 유효하다.
그래서 이 임시저장소도 그 기간동안 유효하다.


M: Model - View에서 출력할 정보 저장소 (Controller에서 View로 전달하는 값) -request의 Attribute
V: View - 화면을 그리는 작업 - jsp 파일
C: Controller - 검증 및 비즈니스 로직 - java 파일

이렇게 역할을 분리한 MVC 패턴이 등장하게 되었다.


MVC 적용

// 컨트롤러
@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/members")
public class MvcMemberListServlet extends HttpServlet {
    private MemberRepository memberRepository = MemberRepository.getInstance();
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Member> members = memberRepository.findAll();
        request.setAttribute("members", members); // 모델
        
        String viewPath = "/WEB-INF/views/members.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request,response);
    }
}
<!-- 뷰 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
...
  <c:forEach var="item" items="${members}">
      ... 화면 출력 로직 ... 
  </c:forEach>            
...
</html>

jsp에서 사용한 ${members}는 결국 request.getAttribute("members")로 List를 꺼내와서 쓰는 것입니다.

profile
공부한 내용을 적지 말고 이해한 내용을 설명하자

0개의 댓글