티스토리 뷰

정리 노트/JSP

12주차-1일

eyoadgkn 2023. 12. 26. 09:20

웹 MVC

MVC

MVC는 Model, View, Controller의 약자로써 웹 애플리케이션을 비즈니스 로직, 프레젠테이션 로직, 데이터로 분리하는 디자인 패턴입니다. 여기서 비즈니스 로직은 에플리케이션의 데이터, 즉 고객, 제품, 주문 정보의 조작에 사용되는 용어이고, 프레젠테이션은 애플리케이션이 사용자에게 어떻게 표시가 되는지, 위치, 폰트, 크기를 나타냅니다. 

웹 애플리케이션에서 MVC 패턴을 사용하면 유지 보수가 용이하며 쉽게 확장 및 테스트를 할 수 있습니다. 

MVC 패턴 구조

웹 애플리케이션을 개발하기 이전에는 개발 구조에 대한 기본적인 계획이 있어야하는데, 이때 요청 처리가 이루어지는 서블릿 or JSP 에 따라 MVC의 모델은 두가지가 있습니다. 웹 애플리케이션에서 MVC 패턴인 JSP(view)와 자바빈즈(모델), 서블릿(컨트롤러)을 이용하면 쉽게 구현을 할 수가 있습니다. 때문에 규모가 큰 프로젝트 또한 MVC를 통해서 훨씬 더 효율적으로 개발을 할 수가 있게됩니다.

모델1
: 모델1은 기존의 JSP로만 구현한 웹 애플리케이션을 의미합니다. 웹 브라우저에서 요청을 JSP 페이지가 받아서 처리를 하는 구조입니다. 

클라이언트가 요청을 하면 서버인 컨트롤러+뷰(JSP 페이지)에서 모델(자바빈즈)로 이동이 되고 데이터베이스를 거친 후 다시 모델, 컨트롤러+뷰를 통해 응답을 클라이언트로 하게 됩니다.
모델2
:모델 2는 클라이언트의 요청 처리, 응답 처리, 비즈니스 로직 처리 부분을 모듈화한 구조입니다. 
웹 브라우저의 요청이 들어오게 된다면 모든 처리를 JSP 페이지가 담당하는 모델 1과는 달리, 요청에 대한 로직을 처리할 자바빈즈나 자바 클래스인 모델, 요청 결과를 출력하는 JSP 페이지인 뷰, 모든 흐름을 제어하는 서블릿인 컨트롤러로 나뉘어서 웹 브라우저가 요청한 작업을 처리합니다.

이때 모델2는 서블릿의 역할이 굉장히 중요하며, 웹 브라우저가 요청한 모든 작업을 하나의 서블릿이 처리를 합니다. 서블릿은 웹 브라우저의 요청에 알맞게 처리한 뒤 그 결과를 보여줄 JSP 페이지로 포워딩을 하고, 이를 통해서 요청 흐름을 받은 JSP 페이지는 결과 하면을 웹 브라우저에 전송을 하게 됩니다. 즉 서블릿이 비즈니스 로직 부분을 처리를 하게 됩니다.
MVC 패턴 구현 방법
 web.xml 파일에 서블릿 구성
: 웹 MVC에서는 클라이언트로부터 컨트롤러인 서블릿을 통해 요청을 받아야하는데, 이때 웹 애플리케이션(톰캣 기반)의 WEB-INF 폴더에 있는 환경설정인 web.xml에 서블릿 클래스와 웹 브라우저의 요청 URL 패턴을 등록하여야합니다.

1. web.xml에 servlet요소로 서블릿 클래스를 등록을 하여야합니다.
2. 후에 servlet-mapping을 통해 웹 브라우저의 요청 URL 패턴을 등록하여야하는데, 이때 servlet class로 이동하는 servlet name과 servlet-mapping의 name이 동일하여야 합니다.
컨트롤러 생성
:컨트롤러는 뷰와 모델간의 인터페이스 역할을 하여 웹 브라우저의 모든 요청 URL을 받아들이고 요청 URL과 함께 전달되는 요청 파라미터를 받아 처리하는 서블릿 클래스입니다. 컨트롤러는 요청된 데이터를 처리하기 위해 모델로 보내고 처리된 결과를 받아서 응답할 JSP 페이지로 이동을 합니다.

1.서블릿 클래스를 생성을 해야합니다.
:web.xml에 등록된 class를 생성을 해주게 되는데 이때  클래스명 뒤에 extends HttpServlet을 붙여준 뒤 doPost와 doGet을 오버라이드해줍니다.
2.페이지 이동하기
: 서블릿 클래스에서 웹 브라우저로부터 요청된 처리 결과를 보여줄 응답 페이지로 이동하는 형식은 현재 뷰 페이지에서 이동할 뷰 페이지에 요청 정보를 그대로 전달하며, 뷰 페이지가 이동해도 처음에 요청된 URL을 계속 유지하기위해서 포워딩 방식을 사용합니다.

ex)
RequestDispatcher rd = request.getRequestDispatcher("JSP 페이지");
rd.forward(req, resp);

url을 전체로 했을 때

package controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class test_controller  extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(req,resp);
	}
	

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
			System.out.println("test_controller 입니다.");
	}

}
  <servlet>
  		<servlet-name>myservlet_1</servlet-name>
  		<servlet-class>controller.test_controller</servlet-class>
  </servlet>
  <servlet-mapping>
			<servlet-name>myservlet_1</servlet-name>			  		
			<url-pattern>/</url-pattern>
</servlet-mapping>

url을 abc로 지정했을 때

package controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class test_controller_abc extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		doPost(req,resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		System.out.println("abc 입니다.");
	}

}
  <servlet>
  		<servlet-name>myservlet_1</servlet-name>
  		<servlet-class>controller.test_controller_abc</servlet-class>
  </servlet>
  <servlet-mapping>
			<servlet-name>myservlet_1</servlet-name>			  		
			<url-pattern>/abc</url-pattern>
</servlet-mapping>

서블릿이 프로젝트에 포함되기 때문에 그 이하의 abc부터 해석을 시켜준다
따라서 web.xml의 mapping은 프로젝트를 제외한 'abc'부터 해석을 한다.
mapping이 되면 해당 클래스로 이동을 시켜준다. 당연히 서로의 name이 동일해야 한다.

package controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ano")
public class test_controller_annotation extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		doPost(req,resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		System.out.println("출력");
	}

}

// annotation 방식(controll mapping). 이 클래스에 대해서 webServlet을 붙여준다.
// 뒤에 /ano가 매핑이다. 자동방식
// web.xml에서 하는 것이 수동방식.

페이지 이동하기

package class_first;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/first")
public class test1 extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req,resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("퍼스트입니다.");
		
		RequestDispatcher dispatcher = req.getRequestDispatcher("/first/one/one.jsp");
		dispatcher.forward(req, resp);
	}

}
<%@ 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>
원입니다.
<!--a태그에서는 절대경로 줄 때 프로젝트명까지 같이 줘야한다. -->
<a href="/mvc_1/first/two/two.jsp">two페이지로 이동하기</a>
</body>
</htm
<%@ 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>
투입니다.
</body>
</html>

'정리 노트 > JSP' 카테고리의 다른 글

12주차-3일  (0) 2023.12.28
12주-2일차  (0) 2023.12.27
11주차-5일  (0) 2023.12.23
11주-4일  (0) 2023.12.21
11주-3일  (0) 2023.12.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함