Connection Pool
: 서버에 미리 Connection 를 설정해 놓는 것
: 데이터베이스와 연결된 커넥션을 미리 만들어서 풀(Pool)속에 저장해 두고 있다가
필요할 때 커넥션을 풀에서 가져다 쓰고 다시 풀에 반환(close)하는 기법
: Connection의 내용이 바뀌면 서버만 수정해주면 된다
: 풀속에 미리 커넥션이 생성 되어있기 때문에 커넥션을 생성하는데 드는 연결시간이 소비되지 않는다
: 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수는 많지 않다
: 오라클 주소, 드라이버, ID, PW를 서버에 숨겨 놓음으로 보안에 좋다
: 서버의 Connection 들을 얻어오려면 javax.sql.DataSource 를 이용
: server.xml에서 에 추가해야하는데 따로 context.xml를 만들어서 사용해보자
톰캣은 자체에서 jar 파일을 제공하고 있다.
Connection Pool 은행창고
↓ ↓
DataSource(실행하자마자 모든 커넥션 다 받아옴) 여직원 (아침에 출근하면 창고에 있는 돈 다 받아온다.)
↓ ↑
클라이언트 손님
context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="projectJSP"
path="/projectJSP"
reloadable="true"
source="org.eclipse.jst.jee.server:projectJSP">
<Resource name="jdbc/oracle"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:xe"
username="C##JAVA"
password="1234"
maxActive="20"
maxIdle="3"
removeAbandoned="true"/>
</Context>
- maxActive: 최대 활성화된 연결 수 / 최대 20개의 연결을 동시에 사용
- maxIdle: 유휴 상태로 유지할 최대 연결 수 / 최대 3개의 유휴 연결을 유지
- removeAbandoned: 유휴 상태로 너무 오래된 연결을 제거할지 여부를 설정 true로 설정되어 있으면 방치된 연결을 자동으로 제거
ds가 모든 커넥션들을 다 가지고있다.
package member.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import member.bean.MemberDTO;
public class MemberDAO {
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs;
private DataSource ds;
private static MemberDAO memberDAO = new MemberDAO();
public static MemberDAO getInstance() {
return memberDAO;
}
public MemberDAO() {
// 실행하자마자 커넥션 받아야한다.
Context ctx;
try {
ctx = new InitialContext();
ds = (DataSource) ctx.lookup("java:comp/env/jdbc/oracle"); //Tomcat의 경우 - java:comp/env/
} catch (NamingException e) {
e.printStackTrace();
}
}
getConnection( ) 지우고 try catch 안에 밑에 코드 넣기
con = ds.getConnection();
로그인
memberLoginForm.jsp
<%@ 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">
table {
width: 700x;
margin: 100px auto;
}
th {
padding: 7px 15px;
}
td {
padding: 7px 10px;
}
div {
color: red;
font-size: 8pt;
font-weight: bold;
}
input[type="button"], input[type="submit"] {
background-color: #E0E0E0;
border: 1px solid;
text-align: center;
font-size: 14px;
margin: 4px 2px;
padding: 4px 5px;
}
input[type="button"]:hover, input[type="submit"]:hover {
background-color: #BFBFBF;
}
</style>
</head>
<body>
<form method="post" action="memberLogin.jsp">
<table>
<tr>
<th>아이디</th>
<td>
<input type="text" name="id" id="id" placeholder="아이디 입력" />
<div id="idDiv"></div>
</td>
</tr>
<tr>
<th>비밀번호</th>
<td>
<input type="password" name="pwd" id="pwd" placeholder="비밀번호 입력" />
<div id="pwdDiv"></div>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="로그인" onclick="memberLogin(event)" />
<input type="button" value="회원가입" onclick="location.href='./memberWriteForm.jsp'" />
</td>
</tr>
</table>
</form>
<script src="../js/member.js"></script>
</body>
</html>
member.js
function memberLogin(e){
let isValid = true;
document.getElementById("idDiv").innerHTML = "";
document.getElementById("pwdDiv").innerHTML = "";
if(document.getElementById("id").value == ""){
document.getElementById("idDiv").innerHTML = "아이디를 입력해주세요.";
e.preventDefault();
isValid = false;
}
if(document.getElementById("pwd").value == ""){
document.getElementById("pwdDiv").innerHTML = "비밀번호를 입력해주세요.";
e.preventDefault();
isValid = false;
}
if(isValid)
document.memberLoginForm.submit();
}
memberLogin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="member.bean.MemberDTO"%>
<%@page import="member.dao.MemberDAO"%>
<%
//데이터
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
//DB
MemberDAO memberDAO = MemberDAO.getInstance();
String name = memberDAO.memberLogin(id, pwd);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script type="text/javascript">
window.onload = function(){
if("<%= name %>" !== "null"){
alert("<%= name %>" + "님 로그인에 성공하였습니다.");
location.href = "../index.jsp";
} else {
alert("아이디 또는 비밀번호가 틀렸습니다.");
history.back();
}
}
</script>
</body>
</html>
MemberDAO.java
public String memberLogin(String id, String pwd){
String name = null;
String sql = "select * from member where id=? and pwd=?";
try {
con = ds.getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
rs = pstmt.executeQuery();
if(rs.next()) {
name= rs.getString("name");
System.out.println(name);
}
else
name = null;
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return name;
}
memberWriteForm.jsp / memberLoginForm.jsp
이미지 넣고 클릭하면 메인페이지로 가게 만들기
<img src="../image/토끼.gif" alt="홈" width="70" height="70" onclick="location.href='../index.jsp'" style="cursor: pointer; display: block; margin: 0 auto;" />
Connectionless
HTTP 프로토콜은 클라이언트의 요청에 대한 응답을 하고 나면 해당 클라이언트와의 연결을 지속하지 않는다.
쿠키
(건물 안에 들어갈 수 있는 방문증이나 사원증이라 생각하면 좋다)
: 생성된 쿠키는 클라이언트의 웹브라우저에 저장
: 웹사이트에 접속할 때 생성되는 정보를 담은 임시파일 (4KB)
: ID 기억 - 다음에 접속시 별도의 절차없이 빠르게 연결
: 쿠키 삭제는 시간을 0으로 셋팅
: 사생활 침해(웹브라우저에 저장되므로)
: 팝업창의 오늘 하루 창 띄우지 않음
새로고침으로 조회수 늘리는 걸 방지할 때
최근 본 목록
--> 남이 봐도 되는 것들을 저장한다.
쿠키생성
Cookie cookie = new Cookie("쿠키명", 값);
cookie.setMaxAge(3);//초 단위
세션
: 웹서버쪽의 웹컨테이너에 상태를 유지하기 위한 정보가 저장 (눈에 안 보임)
: 세션은 기본 시간 1800초(30분)
: 각 클라이언트 고유 Session ID를 부여한다
Session ID로 클라이언트를 구분하여 각 클라이언트 요구에 맞는 서비스 제공
세션 생성
HttpSession session = request.getSession();
session.setMaxInactiveInterval(30*60); //초 단위
세션 부여
session.setAttribute("세션명“, ”값“)
세션 얻어오기
session.getAttribute("세션명“)
세션 삭제
session.removeAttribute("세션명“)
모든 세션 삭제 - 무효화
session.invalidate()
클라이언트가 서버에게 요청을 한다.
서버는 요청을 받아서 응답을 해줘야한다.
서버는 쿠키를 생성에서 응답과 함께 전달해주지만 저장은 클라이언트 쪽에서 저장한다.
쿠키는 클라이언트에서 만드는게 아니다.
쿠키는 서버에서 만들어서 응답에 실어서 클라이언트한테 보내주는 것 !!
쿠키생성
Cookie cookie = new Cookie("쿠키명", 값);
cookie.setMaxAge(3);//초 단위
쿠키는 딱 원하는 애만 꺼낼 수 없다.
항상 다 꺼내온다.
memberLoginForm.jsp
<%@ 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">
table {
width: 700x;
margin: auto;
}
th {
padding: 7px 15px;
}
td {
padding: 7px 10px;
}
div {
color: red;
font-size: 8pt;
font-weight: bold;
}
input[type="button"], input[type="submit"] {
background-color: #E0E0E0;
border: 1px solid;
text-align: center;
font-size: 14px;
margin: 4px 2px;
padding: 4px 5px;
}
input[type="button"]:hover, input[type="submit"]:hover {
background-color: #BFBFBF;
}
</style>
</head>
<body>
<img src="../image/free-icon-love-4096198.png" alt="홈" width="60" height="60" onclick="location.href='../index.jsp'" style="cursor: pointer; display: block; margin: 0 auto;" />
<form id="loginForm">
<table>
<tr>
<th>아이디</th>
<td>
<input type="text" name="id" id="id" placeholder="아이디 입력" />
<div id="idDiv"></div>
</td>
</tr>
<tr>
<th>비밀번호</th>
<td>
<input type="password" name="pwd" id="pwd" placeholder="비밀번호 입력" />
<div id="pwdDiv"></div>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="로그인" id="loginBtn"/>
<input type="button" value="회원가입" onclick="location.href='MemberWriteForm.jsp'" />
</td>
</tr>
</table>
쿠키 = <span></span>
</form>
<script src="../js/member.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-3.7.1.min.js"></script>
<script type="text/javascript">
$('#loginBtn').click(function(event) {
event.preventDefault(); // 기본 제출 동작 방지
$('#idDiv').empty();
$('#pwdDiv').empty();
if ($('#id').val() == '') {
$('#idDiv').html('아이디를 입력하세요.');
} else if ($('#pwd').val() == '') {
$('#pwdDiv').html('비밀번호를 입력하세요.');
} else {
$.ajax({
type: 'POST',
url: 'memberLogin.jsp',
data: {
'id': $('#id').val(),
'pwd': $('#pwd').val()
},
dataType: 'text', // 서버로부터 순수한 텍스트만 받음
success: function(data) {
if (data.trim() === 'fail') {
alert("아이디 또는 비밀번호가 틀렸습니다.");
} else {
alert(data.trim() + "님이 로그인하였습니다.");
$('span').text(data.trim());
}
},
error: function(e) {
console.log(e);
}
});
}
});
</script>
</body>
</html>
memberLogin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.net.URLEncoder"%>
<%@page import="member.dao.MemberDAO"%>
<%
//데이터
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
//DB
MemberDAO memberDAO = MemberDAO.getInstance();
String name = memberDAO.memberLogin(id, pwd);
if (name == null) {
//페이지 이동
response.sendRedirect("loginFail.jsp");
} else {
//중요한 데이터를 주소표시줄에 실어서 보내지 말자
//response.sendRedirect("loginOk.jsp?name=" + URLEncoder.encode(name, "UTF-8") + "&id=" + id);
// 쿠키 설정
Cookie cookie = new Cookie("memName", name);//쿠키 생성
cookie.setMaxAge(30 * 60); //초 단위 - 30분
response.addCookie(cookie);//클라이언트에 저장
Cookie cookie2 = new Cookie("memId", id);//쿠키 생성
cookie2.setMaxAge(30 * 60); //초 단위 - 30분
response.addCookie(cookie2);//클라이언트에 저장
response.sendRedirect("loginOk.jsp");
}
%>
loginOk.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//String name = request.getParameter("name");
//String id = request.getParameter("id");
String name = null;
String id = null;
//쿠키
Cookie[] ar = request.getCookies(); //특정 쿠키만을 가져오지 못하고, 모든 쿠키들을 다 가져온다.
if(ar != null){
for(int i=0; i<ar.length; i++){
String cookieName = ar[i].getName(); //쿠키명
String cookieValue = ar[i].getValue(); //쿠키값
System.out.println("쿠키명 = " + cookieName);
System.out.println("쿠키값 = " + cookieValue);
System.out.println();
if(cookieName.equals("memName"))
name = ar[i].getValue();
if(cookieName.equals("memId"))
id = ar[i].getValue();
} //for
} //if
%>
<%=name%>
loginFail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
fail
memberLogout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//쿠키
Cookie[] ar = request.getCookies();
if(ar != null){
for(int i=0; i<ar.length; i++){
if(ar[i].getName().equals("memName")){
ar[i].setMaxAge(0); //쿠키 삭제
response.addCookie(ar[i]); //클라이언트에 저장
}
if(ar[i].getName().equals("memId")){
ar[i].setMaxAge(0); //쿠키 삭제
response.addCookie(ar[i]); //클라이언트에 저장
}
}//for
}//if
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
'JSP & Servlet' 카테고리의 다른 글
DAY 49 - MyBatis (2024.09.10) (0) | 2024.09.10 |
---|---|
DAY 48 - MyBatis ( 2024.09.09) (0) | 2024.09.09 |
DAY 47 - 미니프로젝트(member) - 세션 / 회원정보 수정 / 글 작성 (2024.09.06) (2) | 2024.09.06 |
DAY 45 JSP - 주석 / 미니프로젝트(member) - 중복체크 ( 2024.09.04 ) (4) | 2024.09.04 |
DAY 45 Servlet - Guestbook2 ( 2024.09.04 ) (0) | 2024.09.04 |