반응형

2024_0715_MVCTest [ADD] MVC-Pattern

 

GitHub - chaSunil/FirstProject: 1차 프로젝트

1차 프로젝트. Contribute to chaSunil/FirstProject development by creating an account on GitHub.

github.com

 

 

델2 디자인 패턴은 Servlet과 view(jsp)를 따로따로 분리해서 클라이언트에게 전달 해주는게 모델 2 디자인 패턴이었다.

 

 

 

 

- 사용자의 요청에 응대하는 객체

 

(Servlet의 생성이 응대하는 응대하는 기능들이 많아질수록 Servlet이 관리하기 힘들어질 정도로 많아진다.)

 

- 나눠서 하는건 좋지만, 요청이 많아지면 많아질수록 Servlet이 너무 많아진다.

 

 

 

 

*모델2구조 - 중국집에서 짜장면을 시키면 짜장면만 만드는 요리사가 한 명이 있는것이다.

짬뽕을 시키면 짬뽕만 만드는 요리사가 한 명이 있는것이다. 요리사의 배치가 불필요하게 많다는 것이다.

하나의 요리당 하나의 요리만 하는 요리사가 있는것은 굉장히 불필요한 일이다.(샥스핀 같은 메뉴는 1년에 1번 나갈까 말까..)

 

 

 

 

 

MVC-Pattern

프론트(FrontController) 쪽에서 한명만 대기했다가, 주문을 받고 해당 요리사(작업객체)에게 주문을 전달한다.

모든 작업이 FrontController에 의해 진행이 된다.

 

Model-2 패턴의 단점 : 일꾼(Servlet)이 너무~~ 많다. (작업을 분리하다보니, 너무 많은 작업자가 존재한다는 것)

 

MVC-Pattern은 대표적으로 일꾼을 하나만 만들어서, 사용자의 요청을 그 일꾼이 받게 한다는 것이다.

그 대표적으로 받는 일꾼은 FrontController인데, 이것은 Servlet이다.

 

그러면 처리하는 요리사(처리객체 Action)은 Servlet이 아니고 POJO(Plain Old Java Object) 순수자바객체가 된다.

: 누구에게 간섭받지도 않는 순수 자바 객체

 

포죠가 기존에 Servlet을 하던 작업을 대신 하는 것이다.

 

한 줄 정리 : Model-2 = 요리사가 주문을 직접받고 그 요리만 전담으로 만들어준다.

MVC-Pattern = 전문적으로 주문을 받는 사람 한 명이 있고, 각각의 요리를 만드는 요리사들이 요리를 만들어준다.

나온 요리를 주문을 받은 사람이 요리를 전달해준다. (FrontController)

 

 

 

 

 

Filter가 가장 먼저 출력이 된다. 필터는 코드안에 있는 request.setCharacterEncoding 하는 작업을 Encoding을 대신해주는 것이다. (광역 인코딩 기능이라고 생각하자)

 

 

 

 

 

Filter와 FrontController 생성하기

 

 

 

 

Filter 생성 후에 utf-8로 인코딩을 설정해주자. *. do로 설정하면, 모든 do 확장자에 이 filter가 정상적으로 적용이 된다.

 

 

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("--doFilter() : utf-8--");
		request.setCharacterEncoding("utf-8");
		
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

 

 

 

 

FrontController 생성

 

 

 

 

 

 

 

web.xml 수정하기

 

 

 

ServletRequest와 HttpServletRequest는 상속관계이다.

 

 

 


 

 

 

 

url과 uri의 차이

// URL : http://localhost:8080/2024_0715_MVCTest/list.do

// host주소 : http://localhost:8080

// URI : /2024_0715_MVCTest/list.do

 

 

 

public class FrontController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	CommandAction action = new CommandAction();
	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(
			HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//
		// URL      : http://localhost:8080/2024_0715_MVCTest/list.do
		// host주소 : http://localhost:8080
		// URI      : /2024_0715_MVCTest/list.do
		
		// 1. 요청접수 및 분류
		// String url = request.getRequestURL().toString();
		String uri = request.getRequestURI();
		
		// System.out.println("url="+url);
		// System.out.println("uri="+uri);
		
		//  01234567890123456789012345
		// "/2024_0715_MVCTest/list.do"
		int index = uri.lastIndexOf("/"); // 뒤쪽부터 검색
		String cmd = uri.substring(index+1).replaceAll(".do", "");
		
		System.out.println("cmd= " + cmd);
		
		if(cmd.equals("list")) {
			String forward_page = action.list(request,response);
			
			// 결과정보(forward시킬뷰) forward
			request.getRequestDispatcher(forward_page).forward(request, response);
		}
		
		
		// System.out.println("--2.FrontController:service()--");
		
	}

}

 

 

 

 

		//  01234567890123456789012345
		// "/2024_0715_MVCTest/list.do"
		int index = uri.lastIndexOf("/"); // 뒤쪽부터 검색
		String cmd = uri.substring(index+1).replaceAll(".do", "");
		
		System.out.println("cmd= " + cmd);

 

 

 

한 단어씩 출력이 가능해졌다.(작업지시가 가능해졌다.)

 

 

 

순수자바객체 POJO 생성하기

// POJO(Plain Old Java Object) : 순수자바객체
public class CommandAction extends Object {

	// 목록요청 처리
	public String list(HttpServletRequest request, HttpServletResponse response) {
		
		return "list.jsp";
	}
}

 

 

 

view로 보여줄 jsp 생성하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<hr>
	<h3>Book List</h3>
<hr>
	<ul>
		<!-- for(String book : list) -->
		<c:forEach var="book" items="${ requestScope.list }">
			<li><a href="view.do?book=${ pageScope.book }">${ book }</a></li>
		</c:forEach>
	</ul>

</body>
</html>

 

 

 

list에 대한 정보를 request에 action Servlet이 넣어준다.

 

그 request에 대한 정보를 FrontController가 view로 보여질 jsp에게 연결해준다.

 

Spring MVC Pattern에서도 이와 같은 방향으로 움직인다.

 

FrontController -> Action(request 정보줌) -> FrontController(request 정보 받아옴) - > JSP(FrontController에게 request 정보를 받아온다)

 

 

 

 

 

FrontController에 view.do 정보 받기

		if(cmd.equals("list")) {
			String forward_page = action.list(request,response);
			
			// 결과정보(forward시킬뷰) return 받은 jsp에게 값을 전달해준다.
			request.getRequestDispatcher(forward_page).forward(request, response);
		} else if(cmd.equals("view")) {
			String forward_page = action.view(request, response);
			
			// 결과정보(forward시킬뷰) return 받은 jsp에게 값을 전달해준다.
			request.getRequestDispatcher(forward_page).forward(request, response);
		}

 

 

 

 

CommandAction에 view.do에 대한 action 추가하기

	public String view(HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub
		// /view.do?book=Java
		// /view.do?book=Oracle
		String book = request.getParameter("book");
		String description = "";
		
		switch(book.toUpperCase()) {
		case "JAVA" : description="JAVA는 맛있는 언어입니다. 제임스 고슬링이 만들었으며, 전자제품 제어용언어로 만들었습니다."; break;
		case "ORACLE" : description="Oracle은 Java의 회사로써 구글과의 법정공방에서 승소했습니다. 현존하는 DBMS중에서 독보적인 성능을 갖는 데이터베이스 프로그램입니다."; break;
		case "HTML" : description="Html은 Markup Language로써, 하이퍼텍스트를 기반으로 만들어진 언어입니다."; break;
		case "CSS" : description="Cascading Style Sheet로 CSS는 하이퍼텍스트 기반으로 만들어진 Html을 보다 맛있게 디자인 해주는 언어입니다."; break;
		case "JAVASCRIPT" : description="Javascript는 Html을 보다 맛있게 반응형으로 동작할 수 있는 웹사이트로 만들어줍니다."; break;
		case "SPRING" : description="Spring은 Java 사용을 보다 수월하게 해주는 Java용 프레임워크 입니다."; break;
		default : description="얘에 대한 정보는 없는데~~..";
		}
		
		request.setAttribute("book", book);
		request.setAttribute("description", description);
		
		return "view.jsp";
	}

 

 

 

 

출력받을 view인 jsp 생성하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<hr>
	<h3>${ requestScope.book }에 대한 정보를 알려드리겠습니다.</h3>
<hr>
${ description }
<br>
<a href="list.do">다시해보기</a>
</body>
</html>

 

 

 

반응형