SERVER(Servlet, JSP)

[Server] MVC ๋””์ž์ธ ํŒจํ„ด ๊ธฐ์ดˆ

developer of the night sky 2023. 10. 23. 15:56

๐Ÿ”ปServlet + JSP

์ž๋ฐ”์—์„œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ๋กœ Servlet๊ณผ JSP๊ฐ€ ์žˆ๋‹ค.

์ด ๋‘˜์˜ ์žฅ๋‹จ์ , ๊ทธ๋ฆฌ๊ณ  ์ด ๋‘˜์„ ๊ฐ™์ด ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์žฅ์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

1. Servlet

  • ์žฅ์  : ์ž๋ฐ”๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋ฐ” ์ฝ”๋“œ ์ž‘์„ฑ์ด ์šฉ์ดํ•˜๋‹ค
  • ๋‹จ์  : ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๋ถˆํŽธํ•˜๋‹ค.

2. JSP

  • ์žฅ์  : ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์šฉ์ดํ•˜๋‹ค.
  • ๋‹จ์  : ์ž๋ฐ” ์ฝ”๋“œ ์ž‘์„ฑ์ด ๋ถˆํŽธํ•˜๋‹ค.

3. Servlet + JSP

  • Servlet์˜ ์žฅ์ ๊ณผ JSP์˜ ์žฅ์ ์„ ํ•ฉ์ณค๋‹ค.
  • ์ž๋ฐ”์ฝ”๋“œ๋Š” ์„œ๋ธ”๋ฆฟ์—์„œ ์ž‘์„ฑํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” JSP์ฝ”๋“œ์—์„œ ์ž‘์„ฑํ•œ๋‹ค.
  • MVC ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ ํ†ตํ•ฉ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  • ์ˆœ์„œ๋Š” ๋ฌด์กฐ๊ฑด servlet์ด ๋จผ์ € ์‹คํ–‰ํ•œ๋‹ค.
  • ๊ทธ ์ด์œ ๋Š” ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์˜ JSP ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ƒ๋‹จ์— <%%>๋กœ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ทธ ์ค‘์˜ ์ผ๋ถ€๋Š” ์ค‘ํ•˜๋‹จ์˜ HTML ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. 
  • ์„œ๋ธ”๋ฆฟ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜์—ฌ ์ž๋ฐ”์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ JSP๊ฐ€ ๋ฐ›์•„ HTML๋ฅผ ์™„์„ฑ์‹œํ‚จ๋‹ค.

 

๐Ÿ”ปMVC ๋””์ž์ธ ํŒจํ„ด

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ณฅ์„ ํ•˜๋ฉด ์„œ๋ฒ„์ชฝ์€ ๋‹ด๋‹น ์—…๋ฌด(์—ญํ• )์— ๋”ฐ๋ผ Controller, View, Model ์ด๋ผ๋Š” 3๊ฐœ์˜ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ ์ ธ์žˆ๋‹ค.

Controller / ์„œ๋ธ”๋ฆฟ :  ์š”์ฒญ์—์„œ๋ถ€ํ„ฐ ์‘๋‹ต๊นŒ์ง€ ์ „์ฒด๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

View / JSP : ์ถœ๋ ฅ๋‹ด๋‹น, HTML ํŽ˜์ด์ง€๋ฅผ ์ƒ์‚ฐํ•œ๋‹ค.

Model / ์ž๋ฐ” : ์˜ค๋ผํด DB(๋ฐ์ดํ„ฐ) ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•˜๋ฉด Controller๋Š” ๊ทธ ์š”์ฒญ์„ ๋ฐ›์•„ Model์—๊ฒŒ DB ์ž‘์—…์„ ๋งก๊ธด๋‹ค. Model๋Š” ์—…๋ฌด๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ Controller์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋Œ๋ ค๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ Viewํ•œํ…Œ ๋„˜๊ฒจ์ฃผ๋ฉด์„œ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๋ผ๊ณ  ์‹œํ‚จ๋‹ค.  View๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๋ฉด ๋‹ค์‹œ Controller์—๊ฒŒ ๋ฐ˜ํ™˜ํ•˜์—ฌ Controller๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

MVC ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” JSP ๋ชจ๋ธ1๊ณผ JSP ๋ชจ๋ธ2 ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

JSP Model 1

์ž๋ฐ” ์ฝ”๋“œ์™€ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ํ•œ ์žฅ์˜ JSP ํŽ˜์ด์ง€์— ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ฆ‰, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ํ™”๋ฉด ํ‘œํ˜„, ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ฒ˜๋ฆฌ ๋“ฑ์ด ๋ชจ๋‘ ํ•˜๋‚˜์˜ JSP ํŒŒ์ผ์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

์žฅ์ ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ๋‚˜ ํ•™์Šต์šฉ์œผ๋กœ ์ ํ•ฉํ•˜๋‹ค.
๋‹จ์ ์œผ๋กœ๋Š” ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๊ณ , ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

JSP Model 2

MVC ์•„ํ‚คํ…์ฒ˜๋ฅผ ์—„๊ฒฉํžˆ ๋”ฐ๋ฅด๋ฉฐ, ๊ฐ๊ฐ์˜ ์—ญํ• ์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์„ฑํ•œ๋‹ค. ์ฆ‰, ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ, ๋ทฐ๋Š” ํ™”๋ฉด ํ‘œํ˜„์„, ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ธ์ด๋‚˜ ๋ทฐ์— ๋ฐ˜์˜ํ•œ๋‹ค.

์žฅ์ ์œผ๋กœ๋Š” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๋ฉฐ, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜์—ฌ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ˜‘์—…ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
๋‹จ์ ์œผ๋กœ๋Š” ์ดˆ๊ธฐ ๊ตฌ์„ฑ์ด ๋ณต์žกํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ ์š”์†Œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ผ๋ถ€๋ถ„์ด๋‚˜ ์ „์ฒด๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋” ์†Œ์š”๋  ์ˆ˜ ์žˆ๋‹ค.

 

 


๐Ÿ”ปMVC ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ

WEB-INF ํด๋”

webapp์— ์žˆ๋˜ hello.jsp๋ฅผ webapp ํ•˜์œ„ ํด๋” WEB-INF๋กœ ์˜ฎ๊ธฐ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

์•„์˜ˆ ํŽ˜์ด์ง€ ์กด์žฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.

์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋‚œ ๊ฒƒ์€ WEB-INF ํด๋”์˜ ํŠน์„ฑ๋•Œ๋ฌธ์ด๋‹ค.

๋‚ด๋ถ€ ์‹œ์Šคํ…œ ์ž์›์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ณด์•ˆ ํด๋”๋กœ์จ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์„œ๋ธ”๋ฆฟ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ๋ฐ ์ด๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

 

jsp๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ถˆ์™„์ „ํ•œ ํŽ˜์ด์ง€์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ง์ ‘์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋„๋ก WEB-INF ํด๋”์— ๋„ฃ์–ด์ค€๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” jsp ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด views์™€ ๊ฐ™์€ ์ด๋ฆ„์˜ ํด๋”๋ฅผ WEB-INF ํ•˜์œ„์— ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

 

์„œ๋ธ”๋ฆฟ์—์„œ jsp ํ˜ธ์ถœํ•˜๊ธฐ

๊ทธ๋ ‡๋‹ค๋ฉด ์„œ๋ธ”๋ฆฟ์—์„œ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์–ด๋–ป๊ฒŒ jsp๋ฅผ ํ˜ธ์ถœํ• ๊นŒ?

์„œ๋ธ”๋ฆฟ์˜ 'RequestDispatcher' ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ jsp๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

RequestDispatcher๋Š” ์„œ๋ธ”๋ฆฟ์—์„œ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ํฌ์›Œ๋”ฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

 

์ž๋ฐ” ์ฝ”๋“œ ์ž‘์—… ๊ฒฐ๊ณผ ์ „๋‹ฌ

int count = 100;
req.setAttribute("count", count);

์„œ๋ธ”๋ฆฟ์—์„œ DB ์ž‘์—… ๋˜๋Š” ๋‹ค๋ฅธ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ํŽ˜์ด์ง€๋ผ๋ฆฌ ๊ณต์œ ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด HttpServletRequest ๊ฐ์ฒด์˜ setAttribute๋กœ ๊ฐ’์„ jsp์— ์ „๋‹ฌํ•œ๋‹ค.

 

 

๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•

RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/hello.jsp");

getRequestDispatcher(String path): ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์ง€์ •๋œ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ RequestDispatcher๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฒฝ๋กœ๋Š” ์ปจํ…์ŠคํŠธ ๋ฃจํŠธ๋ถ€ํ„ฐ์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋˜๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ž…๋ ฅํ•œ๋‹ค.  ๋ฌด์กฐ๊ฑด '/'๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฉฐ '/'๋Š” webapp๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

ํฌ์›Œ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•

RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/hello.jsp");

forward(ServletRequest request, ServletResponse response) : ํ˜„์žฌ ์š”์ฒญ์„ ๋‹ค๋ฅธ ์„œ๋ธ”๋ฆฟ์ด๋‚˜ JSP๋กœ ์ „๋‹ฌํ•˜์—ฌ ์ดํ›„์˜ ์ฒ˜๋ฆฌ๋Š” ์ „๋‹ฌ๋œ ์„œ๋ธ”๋ฆฟ์ด๋‚˜ JSP์—์„œ ์ด์–ด์ง€๋„๋ก ํ•œ๋‹ค.

 

์„œ๋ธ”๋ฆฟ ์ฝ”๋“œ

Hello.java

package com.test.mvc;

import java.io.IOException;

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

public class Hello extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		req.setAttribute("count", count);
		
		RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/helo.jsp");
		dispatcher.forward(req, resp);
		
	}
}

 

 

jsp ๋ฐ์ดํ„ฐ ์ˆ˜์‹ ํ•˜๊ธฐ

jsp๋Š” ์„œ๋ธ”๋ฆฟ์—์„œ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ request.getAttribute ๋กœ ์ˆ˜์‹ ํ•œ๋‹ค.

์ˆ˜์‹ ํ•œ ๊ฐ’์„ ํŽ˜์ด์ง€๋กœ ์ถœ๋ ฅํ•˜์—ฌ view์˜ ์—ญํ• ์„ ํ•œ๋‹ค.

hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>hello.jsp</title>
<link rel="stylesheet" href="http://pinnpublic.dothome.co.kr/cdn/example-min.css">
<style>

</style>
</head>
<body>
	
	<h1>Hello</h1>
	
	<div>count: <%= request.getAttribute("count") %></div>

	<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
	<script src="http://pinnpublic.dothome.co.kr/cdn/example-min.js"></script>
	
	<script>
	
	</script>
</body>
</html>

 

์„œ๋ธ”๋ฆฟ ์ฃผ์†Œ / JSP ์ฃผ์†Œ๋ฅผ ํ‹€๋ ธ์„ ๋•Œ

์„œ๋ธ”๋ฆฟ ์ฃผ์†Œ ํ‹€๋ ธ์„ ๋•Œ

์ฃผ์†Œ์ฐฝ์˜ ์ฃผ์†Œ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•œ๋‹ค.

 

 

JSP ์ฃผ์†Œ๋ฅผ ํ‹€๋ ธ์„ ๋•Œ

์„œ๋ธ”๋ฆฟ์˜ RequestDispatcher ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•œ๋‹ค.