Post

๐Ÿฅœ [Spring] Pooling ๊ธฐ๋ฒ• & Cookie, Session, MVC

Pooling ๊ธฐ๋ฒ•

Apache Tomcat HOME ํ•˜๋‹จ lib ์— driver ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด

์„œ๋ฒ„์˜ ๋ชจ๋“  ๊ณณ์—์„œ DB ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด ์ง„๋‹ค.

factory ๋ผ๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” ์ œํ’ˆ์„ ๋ณด๊ด€ํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ,

Resource Factory ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ Connection ์„ ๋ฏธ๋ฆฌ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

ํ•ด๋‹นํ•˜๋Š” Connection ๋“ค์„ ๋ฏธ๋ฆฌ WAS ์— ๋“ฑ๋ก ์‹œ์ผœ๋†“์•„์•ผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋”ฐ๋ผ์„œ xml ์„ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค

  1. Connection ์„ ์ฐพ์•„์˜ฌ ๋•Œ๋Š” Context(Interface) ๋ฅผ ์‚ฌ์šฉ
  2. ํŠนํžˆ Context ์˜ ๋ฉ”์„œ๋“œ ์ค‘ lookup() ์„ ํ™œ์šฉํ•ด ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
  3. ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ ํ•  ์‹œ์—๋Š” DataSource ํƒ€์ž…์ด๋‹ค. (Resource Factory)
  4. DataSource ์˜ getConnection() ์„ ํ™œ์šฉํ•˜๋ฉด Connection ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ Pooling ๊ธฐ๋ฒ• ์ด๋ผ๊ณ  ํ•œ๋‹ค.

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
32
33
34
35
36
37
38
39
40
41
42
43
public class MemberDAOImpl implements MemberDAO{
	//ํ•„๋“œ ์ถ”๊ฐ€
	private DataSource ds;
	
	//์‹ฑ๊ธ€ํ†ค
	private static MemberDAOImpl dao = new MemberDAOImpl();
		//0. InitialContext ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
	 	//1. DataSource๋ฅผ ํ•˜๋‚˜ ๋ฐ›์•„์˜จ๋‹ค.
		
	private MemberDAOImpl() {
		//0. InitialContext ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
	 	//1. DataSource๋ฅผ ํ•˜๋‚˜ ๋ฐ›์•„์˜จ๋‹ค.
		try {
			InitialContext ic = new InitialContext();
			ds = (DataSource)ic.lookup("java:comp/env/jdbc/oracleDB"); //๊ณต์žฅ ์ฐพ์Œ
			System.out.println("Datasource Lookup Sucess.....");

		}catch(NamingException e) {
			System.out.println("Datasource Lookup faill.....");
		}
	}
	
	public static MemberDAOImpl getInstance() { //์‹ฑ๊ธ€ํ†ค 
		return dao;
	}
	
	@Override
	public Connection getConnection() throws SQLException {		
		System.out.println("๋””๋น„์—ฐ๊ฒฐ ์„ฑ๊ณต....");
		return ds.getConnection(); //Connection ํ•˜๋‚˜์”ฉ Pool์—์„œ ๋ฐ›์•„์˜จ๋‹ค..
	}

	@Override
	public void closeAll(PreparedStatement ps, Connection conn) throws SQLException{ //Factory์— Connection ๋ฐ˜๋‚ฉ 
		if(ps!=null) ps.close();		
		if(conn != null) conn.close();
	}

	@Override
	public void closeAll(ResultSet rs, PreparedStatement ps, Connection conn) throws SQLException{		
		if(rs != null)	rs.close();
		closeAll(ps, conn);		
	}

์ฝ”๋“œ๋Š” DB ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์ฝ”๋“œ์ด๋‹ค. Singletone ๊ธฐ๋ฒ•์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

Context ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด lookup() ์„ ํ†ตํ•ด Connection์„ ๋นŒ๋ฆด Factory ๋ฅผ ๋ฐ˜ํ™˜ ๋ฐ›์•˜์œผ๋ฉฐ

๋ฐ˜ํ™˜ ๋ฐ›์€ Factory ๋Š” ํ•„๋“œ๊ฐ’์ธ DataSource ds ์— ๋„ฃ์—ˆ๋‹ค.

๊ทธ ๋‹ค์Œ getConnection() ์„ ๋ณด๋ฉด Factory ์— ์ €์žฅ๋œ Connection ํ•˜๋‚˜๋ฅผ ๋นŒ๋ ค์˜จ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
	public void registerMember(MemberVO vo) throws SQLException { //ํšŒ์› ๋“ฑ๋ก 
        Connection conn = null;
        PreparedStatement ps = null;
        try{
            conn = getConnection();
            String query = "INSERT INTO member (id, password, name, address) VALUES(?,?,?,?)";
            ps = conn.prepareStatement(query);

            ps.setString(1, vo.getId());
            ps.setString(2, vo.getPassword());
            ps.setString(3, vo.getName());
            ps.setString(4, vo.getAddress());

            System.out.println(ps.executeUpdate()+" row INSERT OK~~!!");
        }finally{
            closeAll(ps, conn);
        }
    }

(ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€)

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
@Override
	public ArrayList<MemberVO> showAllMember() throws SQLException { //์ „์ฒด ๋ฉค๋ฒ„ ์กฐํšŒ 
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		ArrayList<MemberVO> list = new ArrayList<>();
		try {
			conn = getConnection();
			String query = "SELECT id, password, name, address FROM member";
			ps = conn.prepareStatement(query);
			System.out.println("PreparedStatement....showAllMember()..");
			
			rs = ps.executeQuery();
			while(rs.next()) {
				list.add(new MemberVO(
						rs.getString("id"), 
						rs.getString("password"), 
						rs.getString("name"), 
						rs.getString("address")));
			}
		}finally {
			closeAll(rs, ps, conn);
		}
		return list;
	}

(์ „์ฒดํšŒ์› ๋ถˆ๋Ÿฌ์˜ค๊ธฐ)

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
@Override
	public MemberVO findByIdMember(String id) throws SQLException { //id๋กœ ๋ฉค๋ฒ„ ์ฐพ๊ธฐ 
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		MemberVO vo = null;
		try{
			conn=getConnection();
			String query = "SELECT id, password, name, address FROM member WHERE id=?";
			ps = conn.prepareStatement(query);
			
			ps.setString(1,  id);
			rs = ps.executeQuery();
			if(rs.next()) {
				vo=new MemberVO(id,
								rs.getString("password"),
								rs.getString("name"),
								rs.getString("address"));
			}
			System.out.println(id + ", findByIdMember Sucess");
			
		}finally{
			closeAll(rs, ps, conn);
		}
		return vo;
	}

(ID ๋กœ ํšŒ์› ์ฐพ๊ธฐ)

๋ฉ”์ธ ํ™”๋ฉด์—์„œ โ€˜ํšŒ์›๊ฐ€์ž…ํ•˜๊ธฐโ€™ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด register.jsp ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค

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
32
33
34
35
36
<%@ 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>
<style type="text/css">
	h2{
		text-align: center;
		color: purple;
	}
	#wrap{
		margin-left: 220px;		
	}
</style>
<script type="text/javascript">
	function btnclick(){
		alert("button Click~~!!!");
	}
</script>
</head>
<body>
	<h2>REGISTER MEMBER FORM</h2>
	<div id="wrap">
		<form action="Register" method="post">
			ID <input type="text" name="id" required="required"><br><br>
			PASS <input type="password" name="password" required="required"><br><br>
			NAME <input type="text" name="name" required="required"><br><br>
			ADDR <input type="text" name="address" required="required"><br><br>
			<input type="submit" value="REGISTER">
			<input type="button" value="CLICK" onclick="btnclick()">
		</form>
	</div>
</body>
</html>

(ํšŒ์›๊ฐ€์ž… ํผ)

REGISTER ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด /Register ์ฃผ์†Œ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿผ ํ•ด๋‹น form ๊ฐ’์„ ๋ฐ›๊ณ  ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  Servlet ์„ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

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
32
33
34
35
36
37
38
39
40
41
@WebServlet("/Register")
public class RegisterServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      doProcess(request, response);
	}

	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      request.setCharacterEncoding("utf-8");
      response.setContentType("text/html;charset=utf-8");
      //๋กœ์ง์€ ์—ฌ๊ธฐ์— ์ž‘์„ฑ
      
      //1. ํผ๊ฐ’ ๋ฐ›์•„์„œ 
      String id = request.getParameter("id");
      String password = request.getParameter("password");
      String name = request.getParameter("name");
      String address = request.getParameter("address");

      //2. VO ์ƒ์„ฑ... PVO
      MemberVO pvo = new MemberVO(id, password, name, address);
      String path = "index.html";
      //3. DAO ๋ฆฌํ„ด๋ฐ›๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ˜ธ์ถœ
      try {
    	  MemberDAOImpl.getInstance().registerMember(pvo);
    	  //path = "register_result.jsp"; //๊ตณ์ด ๊ฒฐ๊ณผ ํŽ˜์ด์ง€ ํ•„์š”์—†์Œ
    	  //path="allView.jsp"; ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 500 ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค. allView.jsp๋Š” ์ „์ฒด ๋ฉค๋ฒ„๋ฅผ ์กฐํšŒํ•˜๋Š” DAO๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ AllMemberServlet์„ ๊ฐ”๋‹ค๊ฐ€ allView.jsp๋กœ ๊ฐ€์•ผํ•œ๋‹ค.
      }catch(Exception e) {
    	  
      }
      //4. ๋ฐ”์ธ๋”ฉ?? => ํ•„์š”์—†๋‹ค. 
      
      //5. ๋„ค๋น„๊ฒŒ์ด์…˜ register_result.jsp (๊ตณ์ด ๊ฒฐ๊ณผํŽ˜์ด์ง€ ํ•„์š”์—†์Œ)
      //request.getRequestDispatcher(path).forward(request, response); 
      response.sendRedirect("AllMember");
	}
}

form๊ฐ’์„ ๋ฐ›๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ธ registerMember() ๋ฅผ ํ˜ธ์ถœํ•ด ํšŒ์›๋“ฑ๋ก์„ ํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒํ–ˆ๋‹ค๋Š” ์„ฑ๊ณต ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š”๋ฐ ๊ตณ์ด ํ•„์š”์—†๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์—

์ž์‹ ์ด ํšŒ์›๊ฐ€์ž…์ด ๋๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ „์ฒด ํšŒ์›์„ ๋ณด์—ฌ์ฃผ๋Š” ํŽธ์ด ๋‚ซ๋‹ค.

๋”ฐ๋ผ์„œ request.getRequestDispatcher("AllMember").forward(request, response) ๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ response.sendRedirect("AllMember") ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

Client๋กœ ๋‹ค์‹œ ๊ฐ€์„œ AllMember Servlet์„ ๊ฑฐ์ณ์„œ ๊ทธ ์•ˆ์—์„œ showAllMember() ๋กœ์ง์„ ํ˜ธ์ถœํ•ด์•ผ

์ „์ฒด ํšŒ์›์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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
32
33
@WebServlet("/AllMember")
public class AllMemberServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doProcess(request, response);
	}

	protected void doProcess(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		//1. DAO ๋ฆฌํ„ด ๋ฐ›๊ณ  business logic ํ˜ธ์ถœ
		//2. ๋ฐ˜ํ™˜๋œ ๊ฐ’ ๋ฐ”์ธ๋”ฉ
		//3. ๊ฒฐ๊ณผ ํŽ˜์ด์ง€๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜ ...allView.jsp
		
		try {
			ArrayList<MemberVO>list =MemberDAOImpl.getInstance().showAllMember();
			request.setAttribute("list", list);
			request.getRequestDispatcher("allView.jsp").forward(request, response);
		}
		catch(Exception e) {
			
		}
	}
}

ArrayList๋ฅผ ์ด์šฉํ•ด showAllMember() ์˜ return๊ฐ’์„ ๋ฐ›๋Š”๋‹ค.

DB๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์˜จ๊ฐ’์€ request ๊ฐ์ฒด์— ๋„ฃ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ setAttribute() ๋ฅผ ํ†ตํ•ด ๋„ฃ์–ด์ค€๋‹ค.

๊ทธ๋ž˜์•ผ allView.jsp ์—์„œ ํ•ด๋‹น ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<%@page import="servlet.model.MemberVO"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%
ArrayList<MemberVO> list = (ArrayList) request.getAttribute("list");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<meta name="viewport" content="width=device-width, initial-scale=1">

<link rel="stylesheet"
	href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script
	src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.slim.min.js"></script>
<script
	src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script
	src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
	<!--๋‚˜์ค‘์— ์ด๋ถ€๋ถ„์€ BootStrap ํด๋ž˜์Šค ์†์„ฑ ์—ฐ๊ฒฐํ•ด์„œ ์™„์ „ํ•œ ๋””์ž์ธ์œผ๋กœ ์ง์ ‘ ๋งŒ๋“ค์–ด ์ฃผ์„ธ์š”  -->
	<div class="jumbotron text-center">
		<h2>ํšŒ์› ์ „์ฒด ๋ช…๋‹จ ๋ณด๊ธฐ</h2>
	</div>
	<div class="container">
	<table class="table table-hover">
		<thead>
			<tr>
				<th>ID</th>
				<th>์ด๋ฆ„</th>
				<th>์ฃผ์†Œ</th>
			</tr>
		</thead>
		<tbody>
			<%
			for (MemberVO vo : list) {
			%>
			<tr>
				<td><%=vo.getId()%></td>
				<td><%=vo.getName()%></td>
				<td><%=vo.getAddress()%></td>
			</tr>
			<%
			}
			%>
		</tbody>
	</table>
	</div>
</body>
</html>
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
32
33
34
35
36
37
@WebServlet("/Find")
public class FindServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);

	}
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        
        //๋กœ์ง์€ ์—ฌ๊ธฐ์„œ ์ž‘์„ฑ
        //1 getParameter๋กœ ID ๋ฐ›์•„์˜ค๊ธฐ -Front์™€ ์—ฐ๊ฒฐ
        String id = request.getParameter("id");
        
        //2 DB ์— ํ•ด๋‹น ID ์žˆ๋Š”์ง€ ํ™•์ธ -- DB ์—ฐ๊ฒฐ
        String path="find_fail.jsp";
        try {
        	MemberVO rvo = MemberDAOImpl.getInstance().findByIdMember(id);
        	if(rvo != null) { //ID๋ฅผ ํ†ตํ•ด ํšŒ์›์„ ์ฐพ์œผ๋ฉด
        		request.setAttribute("vo", rvo);//3 ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉ
        		path="find_ok.jsp";
        	}
        }
        catch(Exception e) {
        	
        }        
        //4 ๋„ค์ด๊ฒŒ์ด์…˜...jsp ๊ฒฐ๊ณผํŽ˜์ด์ง€๋กœ -- View์™€ ์—ฐ๊ฒฐ 
		request.getRequestDispatcher(path).forward(request, response);
	}
}

findByIdMember() ๋ฅผ ํ™œ์šฉํ•ด ID๋ฅผ ํ†ตํ•ด ํšŒ์›์„ ์ฐพ๋Š”๋‹ค.

rvo๊ฐ€ null ์ด ์•„๋‹ˆ๋ฉด ํšŒ์›์„ ์ฐพ์•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ rvo๋ฅผ setAttribute() ๋กœ ์ €์žฅํ•ด์ฃผ๊ณ 

path๋ฅผ find_ok.jsp๋กœ ์„ค์ •ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@page import="servlet.model.MemberVO"%>
<%@ 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>
	<%
		MemberVO vo =(MemberVO)request.getAttribute("vo");
	%>
	<h2>ํšŒ์› ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ</h2>
	ID : <%= vo.getId() %><br>
	NAME :<%= vo.getName() %><br>
	ADDRESS: <%= vo.getAddress() %> 
</body>
</html>

Attribute ์—๋Š” ๋ฐ์ดํ„ฐ ์œ ํšจ๊ธฐ๊ฐ„์— ๋”ฐ๋ผ ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๋‚˜๋‰จใ„ด

ServletRequest

์‘๋‹ต ์ „๊นŒ์ง€ ๋ฐ์ดํ„ฐ ๋ณด๊ด€

HttpSession

๋กœ๊ทธ์ธ ํ•˜๋Š” ๋™์•ˆ ๋ฐ์ดํ„ฐ ๋ณด๊ด€

๋กœ๊ทธ์ธ ์ƒํƒœ์ธ ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ™•์ธํ• ๊นŒ?

์ด์ „ ์‚ฌ์šฉ์ž์™€ ๋ฐฉ๊ธˆ ์š”์ฒญํ•œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๊ฐ€ ๊ฐ™๋‹ค๋Š”๊ฑธ ์ธ์‹ํ•˜๋Š” ๊ฒƒ์ด ๋กœ๊ทธ์ธ

ServletContext

์„œ๋ฒ„๊ฐ€ ๋ฉˆ์ถ”๊ธฐ ์ „๊นŒ์ง€ ์ •๋ณด ๋ณด๊ด€

image-20

  1. ์ฟ ํ‚ค๋Š” A Server์—์„œ ๋งŒ๋“ค์–ด ์ง„๋‹ค. ์ •๋ณด๊ฐ€ String์œผ๋กœ ์ €์žฅ๋œ๋‹ค.

    (A ์„œ๋ฒ„์˜ ์ •๋ณด๊ฐ€ ์ฟ ํ‚ค์— ๋“ค์–ด๊ฐ)

    Cookie c = new Cookie(โ€idโ€, โ€œkbโ€);

  2. Server๊ฐ€ ์‘๋‹ตํ•˜๋ฉด ์ฟ ํ‚ค๋Š” ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๋‚ด์ง€๊ฒŒ ๋œ๋‹ค.

    response.addCookie(c);

  3. B server๋กœ ์š”์ฒญ๋•Œ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋œ ์ฟ ํ‚ค๊ฐ€ B Server๋กœ ์ „๋‹ฌ๋œ๋‹ค.

    ์ „๋‹ฌ ๋  ๋•Œ ๋ชจ๋“  ์ฟ ํ‚ค๊ฐ€ ์ „๋‹ฌ ๋˜๋ฉฐ ๊ทธ ์ค‘์—์„œ ์›ํ•˜๋Š” ์ฟ ํ‚ค๋ฅผ ์ฐพ๋Š”๋‹ค.

    Cookie[] cookies = request.getCookies(); => ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋œ ๋ชจ๋“  ์ฟ ํ‚ค

    ๊ฒฐ๊ตญ A์„œ๋ฒ„์—์„œ ๋งŒ๋“  ์ •๋ณด๊ฐ€ B ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์ด ์ผ์–ด๋‚œ๋‹ค.

image-21

Attribute์—์„œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ๊ณผ Cookie์—์„œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์˜ ์ฐจ์ด

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
@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        
        //1. ์ฟ ํ‚ค ์ƒ์„ฑ
        Cookie c1 = new Cookie("id", "KBLife");
        Cookie c2 = new Cookie("today", "2023-08-18");
       
        //์ฟ ํ‚ค์•ˆ์— ์ €์žฅ๋œ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ธฐ๊ฐ„์„ ์ง€์ •
        c1.setMaxAge(24*60*60); //ํ•˜๋ฃจ๋™์•ˆ ์ •๋ณด ๋ณด๊ด€
        c2.setMaxAge(2*24*60*60); //2์ผ ๋™์•ˆ ์ •๋ณด ๋ณด๊ด€
        
        //2. ์ƒ์„ฑ๋œ ์ฟ ํ‚ค๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋ƒ„ ... ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ
        response.addCookie(c1);
        response.addCookie(c2);
        
        //3, ํŽ˜์ด์ง€ ์ด๋™... redirect๋กœ ํ•ด์•ผํ•จ ์ฟ ํ‚ค๋ฅผ ๊ฒฐ๊ณผํŽ˜์ด์ง€์— ์ „๋‹ฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ 
        response.sendRedirect("getCookie.jsp");
        
	}
}

ํ˜„์žฌ ์ฟ ํ‚ค๋Š” ๋ธŒ๋ผ์šฐ์ €์— ์žˆ์œผ๋ฏ€๋กœ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€๋กœ ๋ฐ”๋กœ forward ๋ฐฉ์‹์ด ๋ถˆ๊ฐ€๋Šฅ

๋”ฐ๋ผ์„œ Redirect๋ฅผ ์‚ฌ์šฉํ•ด ๋ธŒ๋ผ์šฐ์ €๋กœ ๊ฐ”๋‹ค๊ฐ€ getCookie.jsp๋กœ ๊ฐ€์•ผํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
Cookie[]cs = request.getCookies();
for(Cookie c : cs){
%>
	<li>Name : <%= c.getName() %></li>
	<li>Value : <%= c.getValue() %></li>
	
<%
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

image-22

๋ธŒ๋ผ์šฐ์ €๊ฐ€ Server ๋กœ ์š”์ฒญ์„ ํ•˜๋ฉด Request, Response, thread, Session ์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

์ด ๋•Œ Session ์— ๊ฐ’์ด ์ž๋™์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

์ด๊ฒŒ ๋ฐ”๋กœ JSESIONID ๊ฐ’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>Login Page</h2>
<form action="LoginServlet" method="post">
	ID : <input type="text" name="id" required="required"><br><br>
	PASSWORD : <input type="password" name="password" required="required"><br><br>
	<input type="submit" value="Login">
</form>
</body>
</html>
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
32
33
34
35
36
37
38
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 request.setCharacterEncoding("utf-8");
	     response.setContentType("text/html;charset=utf-8");
	     
	     /*
	      1. ํผ๊ฐ’ ๋ฐ›์•„์„œ...
	      2. DAO ๋ฆฌํ„ด๋ฐ›๊ณ .. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ˜ธ์ถœ...
	      3. ๋ฐ˜ํ™˜๊ฐ’ ๋ฐ”์ธ๋”ฉ
	      4. ๊ฒฐ๊ณผ ํŽ˜์ด์ง€๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜
	      */
	     
	     //์„ธ์…˜์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์‹œ์— ์„œ๋ฒ„์— ๋งŒ๋“ค์–ด์ง„๋‹ค.
	     //๋งŒ๋“ค์–ด์ง„ ์„ธ์…˜์„ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•œ๋‹ค.
			//login.html์—์„œ LoginServlet์œผ๋กœ ์š”์ฒญํ•ด์„œ ์„ธ์…˜ ์ƒ์„ฑ๋จ
	     HttpSession session =request.getSession(); 
	     
	     System.out.println("JSESSION::" + session.getId()); //JSESSION ํ™•์ธ
	     
	     String id = request.getParameter("id");
	     String password = request.getParameter("password");
	     
	     MemberVO vo = new MemberVO(id, password, "๊ธธ๋ณต์ˆœ", "์—ฌ์˜๋„");
	     
	     //๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ˜ธ์ถœ... ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜...
	     
	     //๋ฐ”์ธ๋”ฉ ******************!!
	     //attribute๋ฅผ session์— ๋ฐ”์ธ๋”ฉ ํ•˜๋Š” ๊ฒฝ์šฐ 2๊ฐ€์ง€ 
	     // ๋กœ๊ทธ์ธ, ํšŒ์›์ •๋ณด ์ˆ˜์ • ์ด 2๊ฐœ ๋ง๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ฒฝ์šฐ ์—†๋‹ค.
	     session.setAttribute("vo", vo); //์„ธ์…˜์— ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ
	     
	     //๋„ค๋น„๊ฒŒ์ด์…˜
	     response.sendRedirect("BuyServlet");
	}
}

ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Client ๋ฅผ ๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ์ฑ…์„ ์‚ฌ๊ธฐ ์œ„ํ•ด BuyServlet ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

๊ทธ๋Ÿผ BuyServlet ์—์„œ ํ˜„์žฌ Session ์„ ํ™•์ธํ•ด ์ด์ „์— ๋กœ๊ทธ์ธ ํ•œ ํšŒ์›์ธ์ง€ ํŒ๋ณ„ํ•ด์•ผ ํ•œ๋‹ค

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
@WebServlet("/BuyServlet")
public class BuyServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doProcess(request, response);
	}

	protected void doProcess(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		//๋กœ์ง์€ ์—ฌ๊ธฐ์„œ ์ž‘์„ฑ... ์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด ์„ธ์…˜์ด ์•„๋‹ˆ๋ผ ์ด์ „ ์„ธ์…˜์ผ ๊ฒƒ์ด๋‹ค...ํ™•์ธ ํ•˜์ž
		HttpSession session = request.getSession();
		
		if(session.getAttribute("vo") != null) { //๋กœ๊ทธ์ธ ๋œ ์ƒํƒœ๋ผ๋ฉด
			System.out.println("JSESSIONID... ButServlet" + session.getId());
			session.setAttribute("book", "์˜คํŽœํ•˜์ด๋จธ");
			request.getRequestDispatcher("buy_result.jsp").forward(request, response);

		}
		else { //๋กœ๊ทธ์ธ ์•ˆ๋œ ์ƒํƒœ๋ผ๋ฉด... ๋‹ค์‹œ ๋กœ๊ทธ์ธ ํ•˜๋Ÿฌ ๋ณด๋‚ด์•ผ ํ•จ
			response.sendRedirect("login.html");
		}
	}
}

BuyServlet์—์„œ ๋ฝ‘์•„๋‚ธ Session์—์„œ getAttribute() ๋ฅผ ํ–ˆ์„ ๋•Œ null ์ด ์•„๋‹ˆ๋ฉด ์ด์ „์— ๋กœ๊ทธ์ธํ•œ

ํšŒ์›์ด๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

์—ฌ๊ธฐ์„œ ํ˜„์žฌ ํšŒ์›์ด โ€œ์˜คํŽœํ•˜์ด๋จธโ€ ๋ผ๋Š” ์ฑ…์„ ์ƒ€๋‹ค๊ณ  setAttribute() ํ•ด์ฃผ๊ณ  buy_result.jsp๋กœ forward ํ•œ๋‹ค

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
///buy_result.jsp
<%@page import="servlet.model.MemberVO"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
	MemberVO vo=(MemberVO)session.getAttribute("vo");
	String book=(String)session.getAttribute("book");
	if(vo==null){ //๋กœ๊ทธ์ธ ํ•œ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด
%>
	<h3>๋กœ๊ทธ์ธ๋ถ€ํ„ฐ ํ•˜์„ธ์—ฌ</h3>
	<a href="login.html">LOGIN</a>
<%
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR"> 
<title>Insert title here</title>
</head>
<body>
<h2>Information...</h2>
LOGIN ID : <b><%= vo.getId() %></b><br>
LOGIN Name : <b><%= vo.getName() %></b><br>
ProductName : <b><%= book %></b><br>
</body>
</html>

ํ•ด๋‹น JSP ๋กœ ํ™•์ธํ•˜๋ฉด LoginServlet์˜ ์„ธ์…˜๊ณผ BuyServlet์˜ ์„ธ์…˜์ด ๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

MVC

image-23

FrontController

image-24

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด Servlet ์ด ์ด 4๊ฐœ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

ํ•˜๋‚˜์˜ Servlet์„ ๋งŒ๋“ค๋ฉด ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜, ์š”์ฒญ์„ ๋ฐ›๊ฒŒ ๋˜๋ฉด Request, Response, thread, Session์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

์ด๊ฒŒ x4๊ฐ€ ๋งŒ๋“ค์–ด ์ง€๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰, Servlet ์ด ๋„ˆ๋ฌด ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฌธ์ œ์ ์ด ์กด์žฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ

๋”ฐ๋ผ์„œ 4๊ฐœ์˜ Servlet ์„ 1๊ฐœ์˜ Servlet ์œผ๋กœ ๋ฌถ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด Servlet ์€ ์–ด๋–ค ์š”์ฒญ์ด ์˜ค๋Š”์ง€ ํ•˜๋‚˜ํ•˜๋‚˜ ํŒ๋ณ„์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

โ‡’ FrontController ํŒจํ„ด์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.

Servlet ์œผ๋กœ ์š”์ฒญ์„ ๋ชจ๋“  ๊ณณ์—์„œ FrontController ๋กœ ๊ฐ€๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

find.jsp, login.jsp, register.jsp, allView.jsp ์—์„œ ์š”์ฒญ์„ ๊ฐ๊ฐ์˜ Servlet ์ด ์•„๋‹ˆ๋ผ

front.do ๋ผ๋Š” FrontCotroller๋กœ ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋จผ์ € ์–ด๋–ค ์š”์ฒญ์ด ์™”๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค.

1
2
// find.jsp
<input type="hidden" name="command" value="find">

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ form ํƒœ๊ทธ ์•ˆ์— ๋„ฃ์–ด ์ค€๋‹ค. ์œ„ ์ฝ”๋“œ๋Š” hidden ์ด๊ธฐ ๋•Œ๋ฌธ์— Client ํ™”๋ฉด์—๋Š” ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

1
2
// index.html
<p><a href="front.do?command=showAll">์ „์ฒด ํšŒ์› ๋ณด๊ธฐ</a></p>
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
@WebServlet("/front.do")
public class FrontController extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doProcess(request, response);
	}

	protected void doProcess(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");

		// ๋กœ์ง์€ ์—ฌ๊ธฐ์„œ ์ž‘์„ฑ...์–ด๋–ค ์š”์ฒญ์ด ๋“ค์–ด์™”๋Š”์ง€๋ฅผ ... ๊ตฌ๋ถ„
		// register, login, find, showAll...
		String command = request.getParameter("command");

		String path = "index.html";
		if (command.equals("register")) { // ํšŒ์›๊ฐ€์ž… ๋กœ์ง..
			path = register(request, response);
		} else if (command.equals("find")) {
			path = find(request, response);
		} else if (command.equals("login")) {
			path = login(request, response);
		} else if (command.equals("showAll")) {
			path = showAll(request, response);
		}
		request.getRequestDispatcher(path).forward(request, response);

	}// do process

	private String register(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		// 1. ํผ๊ฐ’ ๋ฐ›์•„์„œ
		String id = request.getParameter("id");
		String password = request.getParameter("password");
		String name = request.getParameter("name");
		String address = request.getParameter("address");

		// 2. VO ์ƒ์„ฑ... PVO
		MemberVO pvo = new MemberVO(id, password, name, address);
		String path = "index.html";
		// 3. DAO ๋ฆฌํ„ด๋ฐ›๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ˜ธ์ถœ
		try {
			MemberDAOImpl.getInstance().registerMember(pvo);
			
		} catch (Exception e) {

		}
		return path;
	}

	private String find(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// ๋กœ์ง์€ ์—ฌ๊ธฐ์„œ ์ž‘์„ฑ
		// 1 getParameter๋กœ ID ๋ฐ›์•„์˜ค๊ธฐ -Front์™€ ์—ฐ๊ฒฐ
		String id = request.getParameter("id");

		// 2 DB ์— ํ•ด๋‹น ID ์žˆ๋Š”์ง€ ํ™•์ธ -- DB ์—ฐ๊ฒฐ
		String path = "find_fail.jsp";
		try {
			MemberVO rvo = MemberDAOImpl.getInstance().findByIdMember(id);
			if (rvo != null) {
				request.setAttribute("vo", rvo);// 3 ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉ
				path = "find_ok.jsp";
			}
		} catch (Exception e) {

		}
		// 4 ๋„ค์ด๊ฒŒ์ด์…˜...jsp ๊ฒฐ๊ณผํŽ˜์ด์ง€๋กœ -- View์™€ ์—ฐ๊ฒฐ
		return path;
	}

	private String login(HttpServletRequest request, HttpServletResponse response) {
		String id = request.getParameter("id");
		String password = request.getParameter("password");
		String path = "index.html";

		try {
			MemberVO rvo = MemberDAOImpl.getInstance().login(id, password);
			HttpSession session = request.getSession();

			if (rvo != null) {
				session.setAttribute("vo", rvo);
				System.out.println("JSESSIONID ::" + session.getId());
				path = "login_result.jsp";
			}
		} catch (Exception e) {
			path = "login.jsp";
		}

		return path;
	}

	private String showAll(HttpServletRequest request, HttpServletResponse response) {
		String path="index.html";
		try {
			ArrayList<MemberVO> list = MemberDAOImpl.getInstance().showAllMember();
			request.setAttribute("list", list);
			path = "allView.jsp";
		} catch (Exception e) {

		}
		return path;
	}
}

์ด์ œ ์–ด๋–ค ์š”์ฒญ์ธ์ง€ ์•Œ์•˜์œผ๋ฏ€๋กœ ์š”์ฒญ์— ๋”ฐ๋ฅธ Servlet ์„ FrontController ์— ์ •์˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ๊ฒฐ๊ตญ Servlet ์„ FrontController 1๊ฐœ๋งŒ ๋งŒ๋“  ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

This post is licensed under CC BY 4.0 by the author.