스프링 MVC 1편 -벡엔드 웹 개발 핵심 기술 (3)

bin1225·2021년 9월 23일
0

Spring

목록 보기
3/15
post-thumbnail

서블릿,JSP,MVC 패턴

위 3가지 방법을 각각 이용하여 회원관리 웹 애플리케이션을 간단하게 만들어보았고 그 과정을 통해 MVC 패턴이 어떤 역할을 수행해주는 지 알아보았다.

서블릿

서블릿으로 만들었을 때는

PrintWriter w = response.getWriter();
 w.write("<html>\n" +
 "<head>\n" +
 " <meta charset=\"UTF-8\">\n" +
 "</head>\n" +
 "<body>\n" +
 "성공\n" +
 "<ul>\n" +
 " <li>id="+member.getId()+"</li>\n" +
 " <li>username="+member.getUsername()+"</li>\n" +
 " <li>age="+member.getAge()+"</li>\n" +
 "</ul>\n" +
 "<a href=\"/index.html\">메인</a>\n" +
 "</body>\n" +
 "</html>");
 }

이런식으로 HTML 문서를 STRING을 이어붙여가며 작성해야한다는 치명적인 단점이 있었다.
이렇게 했을 때 문제는 불편한 건 둘째치고 오류가 어디서 발생했는지 찾기가 매우 힘들어진다는 것이었다.

JSP

JSP 는 성능,기능면에서 경쟁에서 밀려 점점 사장되어 가는 추세이다.

<%
// request, response 사용 가능
 MemberRepository memberRepository = MemberRepository.getInstance();
 System.out.println("save.jsp");
 String username = request.getParameter("username");
 int age = Integer.parseInt(request.getParameter("age"));
 Member member = new Member(username, age);
 System.out.println("member = " + member);
 memberRepository.save(member);
%>
<html>
<head>
 <meta charset="UTF-8">
</head>
<body>
성공
<ul>
 <li>id=<%=member.getId()%></li>
 <li>username=<%=member.getUsername()%></li>
 <li>age=<%=member.getAge()%></li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>

이런식으로 JAVA코드와 HTML이 함께 있고 HTML 부분부분에 자바코드가 입력 되어있다.

서블릿과 JSP의 한계

서블릿으로 개발할 때는 뷰(View)화면을 위한 HTML을 만드는 작업이 자바 코드에 섞여서 지저분하고 복잡했다.
JSP를 사용한 덕분에 뷰를 생성하는 HTML 작업을 깔끔하게 가져가고, 중간중간 동적으로 변경이 필요한 부분에만 자바 코드를 적용했다.
하지만 코드의 상위 절반은 회원을 저장하기 위한 비즈니스 로직이고, 나머지 하위 절반만 결과를 HTML로 보여주기 위한 뷰 영역이다.
코드를 잘 보면, JAVA 코드, 데이터를 조회하는 리포지토리 등등 다양한 코드가 모두 JSP에 노출되어 있다.
JSP가 너무 많은 역할을 한다. 이렇게 작은 프로젝트도 벌써 머리가 아파오는데, 수백 수천줄이 넘어가는 JSP를 떠올려보면 정말 지옥과 같을 것이다.

중요한 점은 VIEW 와 비즈니스 로직은 변경의 라이프 사이클이 다르다. 이렇게 변경의 라이프 사이클이 다른 부분을 하나의 코드로 관리하는 것은 유지보수하기 좋지 않다.

MVC 패턴

MVC 패턴은 서블릿이나, JSP로 처리하던 것을 컨트롤러(Controller)와 뷰(View)라는 영역으로 서로 역할을 나눈 것을 말한다. 웹 애플리케이션은 보통 이 MVC 패턴을 사용한다.

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

모델: 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다.

뷰: 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다. 여기서는 HTML을 생성하는 부분을 말한다.

MVC 패턴 - 한계

MVC패턴을 통해 모든 문제가 해결된 듯하지만, 고전적인 MVC패턴만으로는 한계가 있다.

MVC 패턴을 적용한 덕분에 컨트롤러의 역할과 뷰를 렌더링 하는 역할을 명확하게 구분할 수 있다.
특히 뷰는 화면을 그리는 역할에 충실한 덕분에, 코드가 깔끔하고 직관적이다. 단순하게 모델에서 필요한 데이터를 꺼내고, 화면을 만들면 된다.
그런데 컨트롤러는 딱 봐도 중복이 많고, 필요하지 않는 코드들도 많이 보인다

그래서 공통 기능을 처리해주는 FRONT CONTROLLER를 만듬으로써 중복을 제거하는 과정을 거쳤다.

0개의 댓글