๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Backend/Spring Framework

MVC2 ํŒจํ„ด(์˜ˆ์ œ ์ฝ”๋“œ) & ํ•œ๊ณ„์ 

by sukii 2024. 2. 26.
๋ฐ˜์‘ํ˜•

๐Ÿค”์ปจํŠธ๋กค๋Ÿฌ(Controller - Servlet) : ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์•„ ๋ชจ๋ธ(Model - Class) ์—ญํ• ์˜ ๊ฐ์ฒด๋กœ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ๋ทฐ(View - JSP)์—๊ฒŒ ์ œ๊ณตํ•˜์—ฌ ์‘๋‹ต๋˜๋„๋ก ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ์›นํ”„๋กœ๊ทธ๋žจ(์„œ๋ธ”๋ฆฟ)

 

โšซ์ปจํŠธ๋กค๋Ÿฌ ์„œ๋ธ”๋ฆฟ์˜ ๋™์ž‘ ๋ฐฉ์‹โšซ

1.ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์„œ๋ธ”๋ฆฟ์˜ URL ํŒจํ„ด์„ ์„ค์ •ํ•˜์—ฌ ๋‹จ์ผ ์ง„์ž…์ ์˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„

=> Front Controller Pattern

 

๋ฐฉ๋ฒ•1) @WebServlet("url") ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ

@WebServlet("url") : ํด๋ž˜์Šค๋ฅผ ์„œ๋ธ”๋ฆฟ(์›นํ”„๋กœ๊ทธ๋žจ)์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ์š”์ฒญ URL ์ฃผ์†Œ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

=> ๋งคํ•‘ ์„ค์ •๋œ URL ์ฃผ์†Œ์— ํŒจํ„ด๋ฌธ์ž(* : ์ „์ฒด, ? : ๋ฌธ์ž ํ•˜๋‚˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ URL ํŒจํ„ด ๋“ฑ๋ก ๊ฐ€๋Šฅ

=> @WebServlet("*.do") : ํด๋ผ์ด์–ธํŠธ๊ฐ€ [XXX.do] ํ˜•์‹์˜ URL ์ฃผ์†Œ๋กœ ์š”์ฒญํ•œ ๊ฒฝ์šฐ ์„œ๋ธ”๋ฆฟ ์‹คํ–‰

@WebServlet("*.do")
public class ControllerServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

//์ƒ๋žต

 

๋ฐฉ๋ฒ•2) [web.xml] ํŒŒ์ผ์˜ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ฌ์šฉ

@WebServlet ์–ด๋…ธํ…Œ์ด์…˜ ๋Œ€์‹  [web.xml] ํŒŒ์ผ์˜ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค๋ฅผ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  URL ํŒจํ„ด์„ ๋งค์นญ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
	<display-name>mvc</display-name>
	
	<!-- servlet : ํด๋ž˜์Šค๋ฅผ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์—˜๋ฆฌ๋จผํŠธ -->
	<servlet>
		<servlet-name>controller</servlet-name>
		<servlet-class>xyz.itwill.mvc.ControllerServlet</servlet-class>
	</servlet>
	
	<!-- servlet-mapping : ์„œ๋ธ”๋ฆฟ์— URL ํŒจํ„ด์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์—˜๋ฆฌ๋จผํŠธ -->
	<servlet-mapping>
		<servlet-name>controller</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.jsp</welcome-file>
		<welcome-file>default.htm</welcome-file>
	</welcome-file-list>
</web-app>

 

 

2.ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ๋ถ„์„ : ์š”์ฒญ URL ์ฃผ์†Œ ์ด์šฉ - http://localhost:8000/mvc/XXX.do

=> HttpServlet ํด๋ž˜์Šค์˜ service ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋“œ 

//์ƒ๋žต	
    //ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ธ”๋ฆฟ์„ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//2.ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ๋ถ„์„ : ์š”์ฒญ URL ์ฃผ์†Œ ์ด์šฉ - http://localhost:8000/mvc/XXX.do
		//HttpServletRequest.getRequestURI() : ์š”์ฒญ URL ์ฃผ์†Œ์—์„œ URI ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
		String requestURI=request.getRequestURI();
		//System.out.println("requestURI = "+requestURI);//requestURI = /mvc/XXX.do
		
		//HttpServletRequest.getContextPath() : ์š”์ฒญ URL ์ฃผ์†Œ์—์„œ ์ปจํ…์ŠคํŠธ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
		String contentPath=request.getContextPath();
		//System.out.println("contentPath = "+contentPath);//contentPath = /mvc
		
		String command=requestURI.substring(contentPath.length());
		//System.out.println("command = "+command);//command = /XXX.do
 
 //์ƒ๋žต

 

3.๋ชจ๋ธ(Model) ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ทฐ(View) ๊ด€๋ จ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์•„ ์ €์žฅ

=> ํ•˜๋‚˜์˜ ์š”์ฒญ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋ชจ๋ธ ๊ฐ์ฒด๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ • - Command Controller Pattern

=> ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ์„ ์–ธ๋œ ๋ชจ๋ธ ์—ญํ• ์˜ ํด๋ž˜์Šค ์ž‘์„ฑ - ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์ž‘์„ฑ

๋”๋ณด๊ธฐ

ํšŒ์›๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํด๋ฆฌ์ด์–ธํŠธ ์š”์ฒญ(Command)์— ๋ชจ๋ธ ๊ฐ์ฒด๊ฐ€ ๋™์ž‘๋˜๋„๋ก ์„ค์ •

์™ผ์ชฝ ํŒจํ„ด์˜ URL ์ฃผ์†Œ๋ฅผ ์ด์šฉํ•ด ์˜ค๋ฅธ์ชฝ ํด๋ž˜์Šค ํ˜ธ์ถœ

=> [/loginform.do] - LoginFormModel ํด๋ž˜์Šค

=> [/login.do] - LoginModel ํด๋ž˜์Šค

=> [/logout.do] - LogoutModel ํด๋ž˜์Šค

=> [/writeform.do] - WriteFormModel ํด๋ž˜์Šค

=> [/write.do] - WriteModel ํด๋ž˜์Šค

=> [/list.do] - ListModel ํด๋ž˜์Šค

=> [/view.do] - ViewModel ํด๋ž˜์Šค

=> [/modifyform.do] - ModifyFormModel ํด๋ž˜์Šค

=> [/modify.do] - ModifyModel ํด๋ž˜์Šค

=> [/remove.do] - RemoveModel ํด๋ž˜์Šค

=> [/error.do] - ErrorModel ํด๋ž˜์Šค

//์ƒ๋žต
//์•„๋ž˜ ๋ฐฉ๋ฒ•๋ณด๋‹ค Map๊ฐ์ฒด ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋” ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง.but ์ง€๊ธˆ์€ ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑ.

        //๋ชจ๋ธ ์—ญํ• ์˜ ํด๋ž˜์Šค๊ฐ€ ์ƒ์†๋ฐ›๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ฐธ์กฐ๋ณ€์ˆ˜ ์ƒ์„ฑ
		// => ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ƒ์„ฑ๋œ ์ฐธ์กฐ๋ณ€์ˆ˜์—๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ๋ชจ๋“  ์ž์‹ํด๋ž˜์Šค(๋ชจ๋ธ) ๊ฐ์ฒด ์ €์žฅ ๊ฐ€๋Šฅ
		Action action=null;
		
		//ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ •๋ณด๋ฅผ ๋น„๊ตํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋ธ ์—ญํ• ์˜ ํด๋ž˜์Šค๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ
		//์ธํ„ฐํŽ˜์ด์Šค ์ฐธ์กฐ๋ณ€์ˆ˜์— ์ €์žฅ
		if(command.equals("/loginform.do")) {
			action=new LoginFormModel();
		} else if(command.equals("/login.do")) {
			action=new LoginModel();
		} else if(command.equals("/logout.do")) {
			action=new LogoutModel();
		} else if(command.equals("/writeform.do")) {
			action=new WriteFormModel();
		} else if(command.equals("/write.do")) {
			action=new WriteModel();
		} else if(command.equals("/list.do")) {
			action=new ListModel();
		} else if(command.equals("/view.do")) {
			action=new ViewModel();
		} else if(command.equals("/modifyform.do")) {
			action=new ModifyFormModel();
		} else if(command.equals("/modify.do")) {
			action=new ModifyModel();
		} else if(command.equals("/remove.do")) {
			action=new RemoveModel();
		} else if(command.equals("/error.do")) {
			action=new ErrorModel();
		} else {//ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋Œ€ํ•œ ๋ชจ๋ธ ์—ญํ• ์˜ ํด๋ž˜์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
			action=new ErrorModel();
		}
		
		//์ธํ„ฐํŽ˜์ด์Šค ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์ถ”์ƒ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฌต์‹œ์  ๊ฐ์ฒด ํ˜•๋ณ€ํ™˜์— ์˜ํ•ด ์ฐธ์กฐ๋ณ€์ˆ˜์—  
		//์ €์žฅ๋œ ๋ชจ๋ธ ๊ฐ์ฒด์˜ ์˜ค๋ฒ„๋ผ์ด๋“œ ์„ ์–ธ๋œ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  
		//๋ทฐ ๊ด€๋ จ ์ •๋ณด(ActionForward ๊ฐ์ฒด)๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์•„ ์ €์žฅ - ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋“œ์— ์˜ํ•œ ๋‹คํ˜•์„ฑ
		ActionForward actionForward=action.execute(request, response);
 //์ƒ๋žต

 

 

4.๋ทฐ ๊ด€๋ จ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ ActionForward ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ์‘๋‹ต ์ฒ˜๋ฆฌ

//์ƒ๋žต
if(actionForward.isForward()) {//ActionForward ๊ฐ์ฒด์˜ forward ํ•„๋“œ๊ฐ’์ด [true]์ธ ๊ฒฝ์šฐ
				//JSP ๋ฌธ์„œ๋กœ ํฌ์›Œ๋“œ ์ด๋™ํ•˜์—ฌ JSP ๋ฌธ์„œ์˜ ์‹คํ–‰๊ฒฐ๊ณผ(HTML)๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต ์ฒ˜๋ฆฌ
				request.getRequestDispatcher(actionForward.getPath()).forward(request, response);
		} else {//ActionForward ๊ฐ์ฒด์˜ forward ํ•„๋“œ๊ฐ’์ด [false]์ธ ๊ฒฝ์šฐ
				//์„œ๋ธ”๋ฆฟ(์ปจํŠธ๋กค๋Ÿฌ)์—์„œ URL ์ฃผ์†Œ(/XXX.do)๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต ์ฒ˜๋ฆฌ
				response.sendRedirect(actionForward.getPath());
		}
	
	}
}

 

 

 

MVCํŒจํ„ด์˜ ํ•œ๊ณ„๋ฅผ ์ž˜ ์„ค๋ช…ํ•ด์คŒโฌ‡๏ธ

https://catsbi.oopy.io/441b4af6-e877-4dc5-9695-2983bbe22799

 

์„œ๋ธ”๋ฆฟ,JSP, MVCํŒจํ„ด

๋ชฉ์ฐจ

catsbi.oopy.io

 

๋ฐ˜์‘ํ˜•