JSP

[JSP] ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ MVC 2 ํŒจํ„ด ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

joheamin 2025. 4. 14. 17:58

๐Ÿ”ท ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ

 

โ“ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋ž€

ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ๋‹จ์ผ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

์ฆ‰ ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ๊ฐ๊ฐ์˜ ์„œ๋ธ”๋ฆฟ์ด ์•„๋‹Œ ํ•˜๋‚˜์˜ ์„œ๋ธ”๋ฆฟ์ด ๋ฐ›์•„ ์š”์ฒญ ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ํด๋ž˜์Šค์—๊ฒŒ ๋„˜๊ฒจ์ฃผ๋ฉฐ ์ฒ˜๋ฆฌ๋ฅผ ๋งก๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

โ“ ์™œ ์‚ฌ์šฉํ• ๊นŒ?

์„œ๋ธ”๋ฆฟ์€ ์„œ๋ฒ„๊ฐ€ ์Šคํƒ€ํŠธ๊ฐ€ ๋œ ๋‹ค์Œ
์ฒซ ๋ฒˆ์งธ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ฒŒ ๋  ๊ฒฝ์šฐ ํ†ฐ์บฃ์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ์„ ํ•ด์ค€๋‹ค.

ํ•œ๋ฒˆ ์ƒ์„ฑ์ด ๋˜์–ด์ง„ ์„œ๋ธ”๋ฆฟ์€ ์žฌ์š”์ฒญ์„ ๋Œ€๊ธฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ  ๊ณ„์† ๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ Destroy() ๋ฉ”์„œ๋“œ ์ฆ‰ ์ €๋ฒ„๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์‚ฌ๋ผ์ง„๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.

์š”์ฒญ์ด ๋“ค์–ด์˜ค์ง€๋„ ์•Š์•˜๋Š”๋ฐ ๋‹ค์ˆ˜์˜ ์„œ๋ธ”๋ฆฟ์ด ํ•ญ์‹œ ๋Œ€๊ธฐ ์ค‘์ด๋ผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋‹ด์ด ์ƒ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์—
์š”์ฒญ๋งŒ ๋ฐ›๋Š” ์„œ๋ธ”๋ฆฟ ํ•˜๋‚˜๋กœ ํ†ต์ผํ•ด์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

 

 

 

๐Ÿ” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ชจ๋“ˆ 

โ—พ FrontController 

ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์•„ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ฐพ์•„ ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ์—ญํ• 

 

โ—พ ActionFactory 

์š”์ฒญ์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋„๋ก ์ œ๊ณตํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์ด๋‹ค.

 

โ— ์ด๋•Œ Factory ๊ฐ์ฒด๋Š” ๋‹จ์ผ ์ƒ์„ฑ์„ ๊ถŒ์žฅํ•œ๋‹ค.

      ์ฆ‰ ์ธ์Šคํ„ด์Šค๋ฅผ 1๊ฐœ๋งŒ ์ƒ์„ฑํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

โ—พ Bean

๊ฐ ์š”์ฒญ์— ๋”ฐ๋ผ ์ƒ์„ฑ๋˜๋Š” ํด๋ž˜์Šค์ด๋ฉฐ, ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์ด๋‹ค.

๋™์ ์œผ๋กœ ์š”์ฒญ์ด ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค. 

 


๐Ÿ”ฅ ๊ตฌํ˜„

 

 

โœ๏ธ Bean

Bean์€ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•ด๋‘” ๋’ค 

๊ฐ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค๋“ค์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

 

๊ฐ„๋‹จํ•˜๊ฒŒ ํšŒ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

โ—พ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ
//ํŒŒ์ผ๋ช… : Controller
public interface Controller {
	public String doUser(HttpServletRequest request, HttpServletResponse response);
}

๐Ÿ‘‰ doUser() : ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”์ƒํ™” ํ•˜์—ฌ ํด๋ž˜์Šค๋“ค์ด ๊ตฌํ˜„ํ•˜๊ฒŒ ํ•œ๋‹ค.


โ—พ ํšŒ์› ๋ฆฌ์ŠคํŠธ ํด๋ž˜์Šค ์ƒ์„ฑ (mList)

public class mList implements Controller{
	@Override
	public String doUser(HttpServletRequest request, HttpServletResponse response) {
		memberService service = new memberService();
		//์š”์ฒญ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅ
		request.setAttribute("mlist", service.selectList());
		//์ตœ์ข… ๋งคํ•‘ ๋ฆฌํ„ด		
		return "/member/memberList.jsp";
	}
}

๐Ÿ‘‰ Controller ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„
      Service ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ DAO์— ์ ‘๊ทผํ•ด ๋ฐ›์•„์˜จ ๊ฒฐ๊ณผ๋ฅผ request์— ์ €์žฅํ•˜๊ณ  ์ตœ์ข…์ ์œผ๋กœ ์ด๋™๋  url์„ ๋ฐ˜ํ™˜

      ์ฆ‰  ์š”์ฒญํ•œ ํšŒ์›์˜ list๋ฅผ ์ €์žฅํ–ˆ๋‹ค๋ฉด View๋ฅผ ์ถœ๋ ฅํ•  jsp๋กœ ์ด๋™ํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค.


 

 

โœ๏ธ ActionFactory(Class)

ActionFactory๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

 

โ“ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋„๋ก
์ƒ์„ฑ์ž๋ฅผ private ํ•˜์—ฌ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค.

ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ์š”์ฒญํ•  ๊ฒฝ์šฐ ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑํ•ด์„œ ๊ณต๊ธ‰ํ•˜๋„๋กํ•œ๋‹ค.
→  getInstance()

๋”ฐ๋ผ์„œ ์™ธ๋ถ€์—์„œ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์ง€๋งŒ
getInstance()๋ฅผ ํ†ตํ•˜์—ฌ ์ด๋ฏธ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ƒ์„ฑ๋˜์–ด์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

โ—พ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ณ€์ˆ˜์™€ get ๋ฉ”์„œ๋“œ ์ƒ์„ฑ
public class ActionFactory {
	
	//์ƒ์„ฑ์ž
	private ActionFactory() {};
	
	//์ธ์Šคํ„ด์Šค๋ฅผ ๋ณ€์ˆ˜๋กœ ๋‘”๋‹ค.
	private static ActionFactory instance = new ActionFactory();
	
	//instance ์˜ get ๋ฉ”์„œ๋“œ
	public static ActionFactory getInstance() {
		return instance;
	}
}

๐Ÿ‘‰ ๋‚ด๋ถ€์— ๋ฏธ๋ฆฌ new ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์„ ํ•ด๋‘๊ณ  get ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์ธ์Šคํ„ด์Šค๋ฅผ return ํ•จ์œผ๋กœ์จ
      ์ธ์Šคํ„ด์Šค๊ฐ€ 2๊ฐœ์ด์ƒ ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

      ๊ทธ๋ฆฌ๊ณ  ์ ‘๊ทผ์ œ์–ด์ž๋กœ private๋ฅผ ๋‘ ์œผ๋กœ์จ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•˜๋Š”๊ฒƒ์„ ๋ง‰๋Š”๋‹ค. 


โ—พ Map์„ ์‚ฌ์šฉํ•œ Bean ๋งคํ•‘ 

private Map<String,Controller> mappings = new HashMap<>();

//์ƒ์„ฑ์ž
private ActionFactory() {
 	mappings.put("/mlist.do", new mList());
};

๐Ÿ‘‰ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์ด ๋  ๋•Œ Map์— ์š”์ฒญ url๊ณผ ์—ฐ๊ด€๋˜๋Š” Bean์„ ์ €์žฅํ•ด๋‘”๋‹ค๋ฉด ์†์‰ฝ๊ฒŒ key๋ฅผ ํ†ตํ•ด์„œ ํ•„์š”ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ


โ—พ map ์„ ํ†ตํ•ด ํ•„์š”ํ•œ Bean์„ ๊บผ๋‚ด ๋ฐ˜ํ™˜

public Controller getController(String mappingName) {
	return mappings.get(mappingName);
}

๐Ÿ‘‰ ์ธ์ž๋กœ ๋ฐ›์•„์˜จ url , ์ฆ‰ mappingName ์€ ํšŒ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๋Š” "mlist .do" ์ด๋‹ค .
๋”ฐ๋ผ์„œ ํ•ด๋‹น key๊ฐ’์— value์ธ new mList() ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฐ˜ํ™˜๋œ๋‹ค.

 

 

โœ๏ธ FrontController (Servlet)

โ—พ url ๋งคํ•‘ ์„ค์ •
//๋งคํ•‘ ์„ค์ •
@WebServlet(urlPatterns = {"*.do"})
public class Ex02_FrontController extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public Ex02_FrontController() {
        super();
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {	
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

๐Ÿ‘‰ ์–ด๋– ํ•œ ํŽ˜์ด์ง€๊ฐ€ ๋“ค์–ด์˜ฌ์ง€ ๋ชจ๋ฅด๊ธฐ๋•Œ๋ฌธ์— url ํŒจํ„ด์„ ์ •ํ•ด๋‘์–ด ๋™์ ์œผ๋กœ ๋งคํ•‘์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค.
      ex) login ์š”์ฒญ์ด๋ผ๋ฉด ์š”์ฒญ url์— login.do 


โ—พ ์š”์ฒญ์— ํ•„์š”ํ•œ ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ˜ํ™˜ํ•ด์ค„ Factory ๊ฐ€์ ธ์˜ค๊ธฐ

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	ActionFactory action =  ActionFactory.getInstance();
}

๐Ÿ‘‰ Factory๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ฉฐ ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ถˆ๊ฐ€๋Šฅ
      ๋”ฐ๋ผ์„œ getInstance๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋˜์–ด์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.


โ—พ ํ•„์š”ํ•œ Bean์„ ๊ฐ€์ ธ์˜ค๊ธฐ์œ„ํ•œ getController ๋ฉ”์„œ๋“œ

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ActionFactory action = ActionFactory.getInstance();
        
      //์š”์ฒญ url์„ request๋ฅผ ํ†ตํ•ด ๊บผ๋‚ธ๋‹ค.
      String url = request.getServletPath();
        
	//์š”์ฒญ url์„ ์ „๋‹ฌํ•˜์—ฌ ํ•„์š”ํ•œ Bean์„ ๊ฐ€์ ธ์˜จ๋‹ค.
	Controller controller = action.getController(url);
	}

๐Ÿ‘‰ ํšŒ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜์˜€์œผ๋‹ˆ Controller ์—๋Š” mList ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ˜ํ™˜๋˜์–ด ๋‹ด๊ธด๋‹ค.


โ—พ controller์— ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋ฉ”์„œ๋“œ์ธ doUser๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ์ตœ์ข… ๋งคํ•‘ ๋ฐ˜ํ™˜

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String url = request.getServletPath();
		ActionFactory action =  ActionFactory.getInstance();

		Controller controller = action.getController(url);
		
        
        // url์— ์ตœ์ข… ๋งคํ•‘ ๋ฐ˜ํ™˜
		url = controller.doUser(request, response);
        
        //๋งŒ์•ฝ ๋ฉ”์ธํŽ˜์ด์ง€(home.jsp)๊ฐ€ ์™”๋‹ค๋ฉด redirect
		if(url.contains("home.jsp")) {
			response.sendRedirect(url);
		}else {
        // ๊ทธ ์™ธ๋ผ๋ฉด forward
			request.getRequestDispatcher(url).forward(request, response);
		}
	}

๐Ÿ‘‰ ๋ฐ˜ํ™˜๋œ url์— ๋”ฐ๋ผ redirect์™€ forward๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ด๋™ํ•˜๊ฒŒ ํ•˜๋„๋ก ํ•œ๋‹ค.

 

 

โœ”๏ธ ์‹คํ–‰ ํ•ด๋ณด๊ธฐ

<a href="/web02/mlist.do" >๋ฆฌ์ŠคํŠธ do</a>

 ๐Ÿ‘‰ํด๋ฆญ