MVC model1 & model2
Model, View, Controller
Model : 출력데이터
- 애플리케이션의 데이터와 비즈니스 로직
- 애플리케이션의 핵심 기능을 정의하고 데이터를 처리하며 알고리즘을 실행
- 보통 JavaBeans나 POJO로 구현
View : 사용자에게 정보를 표시
- 사용자 인터페이스(UI)를 생성하고 모델의 데이터를 시각적으로 표현하는 역할
- 주로 HTML, XML, JSON 등의 형식
Controller : 입력과 제어를 담당
- 사용자의 입력을 처리하고 이에 따라 어떤 처리를 해야 할지를 결정 및 수행
- 사용자의 요청을 분석, 모델을 호출 및 업데이트, 사용자에게 보여줄 뷰 선택 및 그에 맞는 데이터 전달
- 서블릿이나 SpringMVC 컨트롤러와 같은 웹 프레임워크에서 구현
MVC model1 구조
MVC model1
JSP파일 내에서 컨트롤러와 뷰가 물리적으로 분리되지 않은 방식이다.
- 장점
- 단순한 구조로 개발 기간이 짧다.
- 단점
- 출력을 위한 코드와 자바 로직 코드가 섞여 가독성이 떨어지고 복잡해진다.
- 분업이 용이하지않다.
- 유지보수가 어렵다.
MVC model2
JSP파일 내에서 컨트롤러와 뷰가 물리적으로 분리된 방식이다
view단에 있는것만 사용자 요청이 있을 때 서블릿으로 만들어진다.
- 장점
- 구조화된 설계로 각 요소가 명확해져서 분업에 용이하고 유지보수 및 확장성에 좋다.
- 서블릿과 Java코드는 미리 컴파일되어 있으며 실행속도가 빨라진다.
- 단점
- Java에 대한 이해가 더 필요하다.
Controller단에서 View로 연결하기 위해서 포워딩하는 방법이 포함된다.
포워딩은 웹 애플리케이션에서 서블릿이나 JSP등의 컨트롤러에서 처리한 결과를 다른 서블릿이나 JSP로 전달하는 기술이다. 이 그림에서 보다시피 Controller&Dispatcher는 서블릿, jsp도 서블릿이다. 즉 서블릿에서 서블릿으로 이전되면서, 그 흐름을 이어받아서 코드를 진행할 때 사용하는것이 포워딩이다.
페이지가 추가 될수록 Controller&Dispatcher는 서블릿, jsp도 서블릿이 각각 추가된다. 이는 비효율적이므로 모든 Controller마다 가지고 있는 공통적인 Dispatcher기능은 하나만 두고 Controller기능만 별도로 분리한다. 따라서 실질적 서블릿은 하나만 만들고 일반적인 업무로직은 POJO클래스라는 서블릿클래스가 아닌 일반 클래스형태로 클래스를 만들어서 클라이언트의 요청이 들어오면 Dispathcer가 받아 적절한 Controller를 찾아서 수행하는 방식으로 진행한다.
여기서 POJO클래스란 일반클래스와 같은 말로 특정한 제약이나 프레임워크에 종속되지않은 단순한 자바 클래스를 의미한다.
POJO클래스를 사용하는 이유
- 독립성과 재사용성 : POJO클래스는 특정한 프레임워크나 라이브러리에 종속되지않으므로, 해당 클래스를 다른 프로젝트에서 쉽게 재사용
- 유연성 : POJO클래스는 순수한 자바객체이므로 외부 의존성이 없음 이는 테스트를 용이하게 하고 의존성 주입과 같은 디자인 패턴을 적용하기 쉬움
- 확장성 : POJO클래스를 사용하면 애플리케이션의 기능을 확장 하는데 용이
기존 코드( 짝수인지 홀수인지 구별하는 로직 )
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
int num = 0;
String num_= request.getParameter("n");
if(num_ != null && !num_.equals(""))
num = Integer.parseInt(num_);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%if(num%2!=0){ %>
홀수입니다.
<%}
else
{%>
짝수입니다.
<%} %>
</body>
</html>
MVC model1방식
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
int num = 0;
String num_= request.getParameter("n");
if(num_ != null && !num_.equals(""))
num = Integer.parseInt(num_);
String result;
if(num%2!=0)
result="홀수";
else
result="짝수";
%>
<!-- -------------------------------------------------------------- -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=result %> 입니다.
</body>
</html>
MVC model2방식
Spag.java ( Controller단 )
@WebServlet("/spag")
public class Spag extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int num = 0;
String num_= request.getParameter("n");
if(num_ != null && !num_.equals(""))
num = Integer.parseInt(num_);
String result;
if(num%2!=0)
result="홀수";
else
result="짝수";
request.setAttribute("result", result);
// redirect - 현재 작업과 상관없는 새로운 요청을 함
// forward - 현재 작업한 내용을 이어가게 해줌
RequestDispatcher dispatcher = request.getRequestDispatcher("spag.jsp");
// 현재 작업한 내용을 인자로 담아 그 내용이 dispatcher경로인 spag.jsp로 이어지게 함
// forward관계에 있는 Spag.java와 spag.jsp의 저장소는 request가 사용된다.
dispatcher.forward(request, response);
}
}
spag.jsp( View단 )
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- -------------------------------------------------------------- -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=request.getAttribute("result") %> 입니다.
</body>
</html>
참고 자료 출처 :
https://www.youtube.com/watch?v=uSuRHSOea6s&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=46&t=187s
https://www.youtube.com/watch?v=tPEf5VLKJI0&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=47