[Java][Servlet] Servlet & JSP의 MVC 패턴

2022. 5. 23. 13:50JAVA/Servlet&JSP

1. Servlet & JSP

Servlet과 JSP는 클라이언트가 URL 또는 링크 등을 통해서 서버에 서비스 요청을 하면 서버쪽에서 요청에 따른 서비스를 처리하고 결과에 맞는 웹 페이지를 동적으로 응답하는데 사용됩니다. 보통 Servlet 쪽에서 자바 언어를 이용한 복잡한 연산을 수행하고 JSP에는 클라이언트가 볼 화면을 구성합니다. Servlet 또는 JSP에서 한쪽으로도 클라이언트에게 응답을 할 수 있지만 Servlet에서는 웹 페이지의 html 코드를 구성하는데 번거로움이 존재하고 JSP에서는 자바 언어 로직을 구현하는데 가독성이나 유지보수 측면에서 낮아지기 때문에 보통 Servlet과 JSP로 분리하여 구현합니다. Servlet과 JSP를 분리하여 구현하기 위해서 디자인 패턴 중 MVC(Model-View-Controller) 패턴을 적용할 수 있습니다. MVC 패턴은 model1 또는 model2 종류가 있습니다.

 

2. MVC Model1

MVC Model1 수행과정

  1. 클라이언트(브라우저)가 서버에게 서비스를 요청함 (Request)
  2. 서버의 역할을 수행하는 JSP는 View역할과 Controller 역할을 같이 수행하고 JSP내에 있는 자바 언어 로직이 클라이언트 요청에 맞는 서비스를 호출합니다.
  3. 서비스 호출을 받은 Model은 데이터베이스와 연결되면서 Service와 DAO 연산을 수행합니다. 그리고 수행결과를 DTO에 담아 JSP쪽으로 전달합니다.
  4. 서비스 요청 결과를 받은 JSP는 결과와 함께 화면을 구성하고 클라이언트에게 응답(Response)합니다.

MVC model1 아키텍처의 단점

  1. JSP에 Java 코드와 Html 코드가 섞여있어서 가독성에 문제가 있음
  2. 프론트(View)와 백엔드(Controller)간의 분업이 모호함
  3. 유지보수에 어려움

위 문제를 해결하기 위해서 스크립트 및 html을 작성하기 좋은 JSP를 유지하면서 Java 코드로 이루어져 있어 서버통신과 용이한 Servlet을 이용해서 새로운 디자인 패턴을 고안하였습니다.

 

3. MVC Model2

MVC Model2는 MVC Model1의 단점을 해결하기 위해서 Model1 디자인 패턴을 개선한 구조입니다. 이 디자인 패턴은 모델(Model), 뷰(View), 컨트롤러(Controller) 3가지로 나뉘어서 구성됩니다.

  • View
  • Controller
  • Model
    • DTO(Data Transfer Object) : 데이터를 담는 객체를 정의
    • Service : 클라이언트가 요청하는 서비스에 대해서 처리함 (ex 트랜잭션)
    • DAO(Data Access Object) : 데이터베이스와 연결되어 쿼리를 질의하고 결과를 받아옴

MVC Model2 장점

  1. 화면(View)과 비즈니스 로직(Controller, Model)을 분리해서 분업에 용이함
  2. 영역별 개발로 인해 확장성이 좋음
  3. 표준화된 코드를 이용하기 때문에 협업에 유리함
  4. 유지보수에 용이함

MVC Model2 단점

  1. 구조가 복잡하기 때문에 초기 개발속도가 느림
  2. 초보자가 이해하고 개발하기 다소 어려움

4. MVC Model2 구현

Controller(Servlet) 구현 (HomeController.java)

package test.controller;

@WebServlet("/home")
public class HomeController extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		Student std = new Student("김용환"); 
		
		request.setAttribute("name", std.getName());
		request.getRequestDispatcher("/home.jsp").forward(request, response);
	}

}

Model(DTO) 구현 (Student.java)

package test.model.dto;

public class Student {
	private String name;

	public Student() {
		this(null);
	}
	
	public Student(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
}

View(JSP) 구현 (home.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 예제</title>
</head>
<body>
	<h1>hello world</h1>
	<h1>hello <%=request.getAttribute("name") %></h1>
</body>
</html>

 

실행결과 (HomeController 실행)

 

References

Servlet과 JSP로 알아보는 MVC 패턴