오늘은
어느새 또 일주일의 반이 넘어가버렸습니다
하루하루 시간이 어찌나 빨리 가는지
연말이 되어 친구들의 약속을 잡자는 연락이 슬슬 오고있답니다
하지만 해야할 것이 많고 배워야 할 것이 많은 저로서는
연말에도 코딩과의 약속이 우선일 것 같습니다
JSP - DB 연동
<<AddressBook2 - 주소록 프로젝트(오라클, H2)>>
- 객체 지향 프로젝트 모델링 : 유스 케이스 다이어그램
- 데이터베이스 : DB - 모델링(E-R 다이어그램, 새발 표기)
db = jwbook, table 생성
- 자료구조 : List(ArrayList)
SQL코드 - DB
-- addrbook table 생성
CREATE TABLE addrbook(
bnum NUMBER PRIMARY KEY,
username VARCHAR2(20) NOT NULL,
tel VARCHAR2(20),
email VARCHAR2(30) UNIQUE,
gender VARCHAR2(6),
regdate TIMESTAMP DEFAULT SYSTIMESTAMP
);
CREATE SEQUENCE seq_bnum NOCACHE; -- 자동 순번
-- 테스트 데이터 넣기
INSERT INTO addrbook(bnum, username, tel, email, gender)
VALUES(seq_bnum.NEXTVAL, '이순신', '010-1212-1212', 'ship12@naver.com', '남');
-- 이메일 중복 체크 O
INSERT INTO addrbook(bnum, username, tel, email, gender)
VALUES(seq_bnum.NEXTVAL, '김시민', '010-1234-1234', 'ship12@naver.com', '남');
SELECT * FROM addrbook;
-- 이메일 khit@kh.kr 찾기
SELECT email FROM addrbook
WHERE email = 'khit@kh.kr';
COMMIT;
DROP TABLE addrbook;
DROP SEQUENCE seq_bnum;
DB 연결, 종료
package common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
// DB에 연결하고 종료하는 클래스
public class JDBCUtil {
static String driverClass = "oracle.jdbc.OracleDriver";
static String url = "jdbc:oracle:thin:@localhost:1521/xe";
static String user = "jweb";
static String password = "pwjweb";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
// DB 연결 메서드
public static Connection getConnection() {
try {
Class.forName(driverClass);
// 연결 됐을 때의 return
return DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
// 연결이 안됐을 때의 return
return null;
}
// DB 종료 메서드(추가, 수정, 삭제)
public static void close(Connection conn, PreparedStatement pstmt) {
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// DB 종료 메서드(검색)
public static void close(Connection conn, PreparedStatement pstmt, ResultSet rs) {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
package addressbook;
import java.io.Serializable;
import java.sql.Timestamp;
public class AddrBook implements Serializable{
private static final long serialVersionUID = 1L;
private int bnum;
private String username;
private String tel;
private String email;
private String gender;
private Timestamp regDate;
public int getBnum() {
return bnum;
}
public void setBnum(int bnum) {
this.bnum = bnum;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Timestamp getRegDate() {
return regDate;
}
public void setRegDate(Timestamp regDate) {
this.regDate = regDate;
}
}
<DAO - crud >
Create 추가 = public void addAddrBook(AddrBook ab){}
AddrBook ab= vo 클래스
vo - 클래스 자료형(AddrBook) => 테이블과 비슷한 개념으로 이해
(dao - crud - AddrBookDAO)
Read 보기 = public List<ArrdBook> getListAll(int bnum){return list}
piblic AddrBook getList(int bnum){return addrBook}
Update 수정 = public void updateAddrBook(AddrBook ab){}
Delete 삭제 = public void deleteAddrBook(int bnum){}
package addressbook;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import common.JDBCUtil;
// AddrBook 자료형을 이용하여 주소를 생성, 검색, 수정, 삭제를 담당하는 클래스
public class AddrBookDAO {
// Jdbc 관련 변수
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null; // db에 있는 자료
// 주소 추가
public void addAddrBook(AddrBook addrBook) {
// 물리적 연결
conn = JDBCUtil.getConnection();
try {
// sql 처리
String sql = "INSERT INTO addrbook(bnum, username, tel, email, gender) "
+ "VALUES(seq_bnum.NEXTVAL, ?, ?, ?, ?)";
pstmt = conn.prepareStatement(sql);
// 폼에 입력된 자료를 가져와서 DB에 저장
pstmt.setString(1, addrBook.getUsername());
pstmt.setString(2, addrBook.getTel());
pstmt.setString(3, addrBook.getEmail());
pstmt.setString(4, addrBook.getGender());
// sql 실행
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(conn, pstmt);
}
}
// 주소 전체 목록
public List<AddrBook> getListAll(){
// db 연결
conn = JDBCUtil.getConnection();
List<AddrBook> addrList = new ArrayList<>();
// sql 처리
try {
String sql = "SELECT * FROM addrbook ORDER BY bnum";
pstmt = conn.prepareStatement(sql);
// db의 주소록을 꺼내옴
rs = pstmt.executeQuery();
while(rs.next()) {
AddrBook addrBook = new AddrBook(); // 빈 객체 생성
// db에 있는 주소를 가져와서 주소 객체에 저장(화면 목록)
addrBook.setBnum(rs.getInt("bnum"));
addrBook.setUsername(rs.getString("username"));
addrBook.setTel(rs.getString("tel"));
addrBook.setEmail(rs.getString("email"));
addrBook.setGender(rs.getString("gender"));
addrBook.setRegDate(rs.getTimestamp("regdate"));
// 리스트에 1개 객체를 저장(순서에 따라)
addrList.add(addrBook);
}
} catch (SQLException e) {
e.printStackTrace();
}
// db 종료
finally {
JDBCUtil.close(conn, pstmt, rs);
}
return addrList;
}
// 주소 정보(1건) 가져오기
public AddrBook getAddrBook(int bnum){
conn = JDBCUtil.getConnection();
AddrBook addrBook = new AddrBook(); // 빈 객체 생성
try {
String sql = "SELECT * FROM addrbook WHERE bnum=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, bnum);
// bnum에 일치하는 1개의 주소 가져옴
rs = pstmt.executeQuery();
if(rs.next()) {
// db에 있는 주소를 가져와서 주소 객체에 저장(화면 목록)
addrBook.setBnum(rs.getInt("bnum"));
addrBook.setUsername(rs.getString("username"));
addrBook.setTel(rs.getString("tel"));
addrBook.setEmail(rs.getString("email"));
addrBook.setGender(rs.getString("gender"));
addrBook.setRegDate(rs.getTimestamp("regdate"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(conn, pstmt, rs);
}
return addrBook;
}
// 로그인 체크
public boolean checkLogin(String email) {
// db연결
conn = JDBCUtil.getConnection();
try {
// sql 처리
String sql = "SELECT email FROM addrbook "
+ "WHERE email = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, email);
rs = pstmt.executeQuery();
if(rs.next()) { // 검색한 이메일이 있으면 true
return true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(conn, pstmt, rs);
}
return false;
}
}
sql 실행하는 함수
추가, 수정, 삭제 = executeUpdate()
추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>주소록 등록 폼...</title>
<link rel="stylesheet" href="../resources/css/style.css">
</head>
<body>
<div id="container">
<h2>주소록 등록</h2>
<hr>
<form action="addrAdd.jsp" method="post">
<table id="tbl_reg">
<tr>
<td><label>이름</label></td>
<td><input type="text" name="username" required></td>
</tr>
<tr>
<td><label>전화번호</label></td>
<td><input type="text" name="tel" required></td>
</tr>
<tr>
<td><label>이메일</label></td>
<td><input type="text" name="email" required></td>
</tr>
<tr>
<td><label>성별</label></td>
<td>
<select name="gender">
<option>남</option>
<option>여</option>
</select>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="확인">
<input type="reset" value="취소">
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("utf-8"); %>
<title>주소 등록 처리</title>
<link rel="stylesheet" href="../resources/css/style.css">
</head>
<body>
<jsp:useBean id="addrBook" class="addressbook.AddrBook"/>
<jsp:setProperty property="*" name="addrBook"/>
<jsp:useBean id="abDAO" class="addressbook.AddrBookDAO" scope="application"/>
<%
// addAddrBook()함수 호출 사용
abDAO.addAddrBook(addrBook);
%>
<div id="container">
<h2>등록 내용</h2>
<hr>
<p>이름: <%= addrBook.getUsername() %></p>
<p>전화번호: <%= addrBook.getTel() %></p>
<p>이메일: <%= addrBook.getEmail() %></p>
<p>성별: <%= addrBook.getGender() %></p>
<hr>
<p><a href="addrList.jsp">목록 보기</a></p>
</div>
</body>
읽기(검색) - executeQuery()
<%@page import="addressbook.AddrBook"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>주소록 목록...</title>
<link rel="stylesheet" href="../resources/css/style.css">
</head>
<body>
<jsp:useBean id="abDAO" class="addressbook.AddrBookDAO" scope="application"/>
<div id="container">
<h2>주소 목록</h2>
<hr>
<p>
<a href="addrForm.jsp">[주소추가]</a>
(<%=session.getAttribute("sessionId") %>님)<a href="logout.jsp"> [로그아웃]</a>
</p>
<table id="tbl_list">
<thead>
<tr>
<th>번호</th>
<th>이름</th>
<th>전화번호</th>
<th>이메일</th>
<th>성별</th>
<th>등록일</th>
<th>보기</th>
</tr>
</thead>
<tbody>
<%
for(int i = 0; i < abDAO.getListAll().size(); i++){
AddrBook addrBook = abDAO.getListAll().get(i);
%>
<tr>
<td><%= addrBook.getBnum() %></td>
<td><%= addrBook.getUsername() %></td>
<td><%= addrBook.getTel() %></td>
<td><%= addrBook.getEmail() %></td>
<td><%= addrBook.getGender() %></td>
<td><%= addrBook.getRegDate() %></td>
<td>
<a href="addrView.jsp?bnum=<%= addrBook.getBnum() %>">
<button type="button">보기</button>
</a>
</td>
</tr>
<%
} // for문 끝 괄호 주의
%>
</tbody>
</table>
<!-- <p><a href="index.jsp">[메인으로]</a></p> -->
</div>
</body>
</html>
<%@page import="addressbook.AddrBook"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>주소 정보...</title>
<link rel="stylesheet" href="../resources/css/style.css">
</head>
<body>
<jsp:useBean id="abDAO" class="addressbook.AddrBookDAO" scope="application"/>
<%
// bnum으로 찾은 객체를 생성
int bnum = Integer.parseInt(request.getParameter("bnum"));
AddrBook addrBook = abDAO.getAddrBook(bnum);
%>
<div id="container">
<h2>주소 정보</h2>
<hr>
<table id="tbl_view">
<tr>
<td class="sub">번호</td>
<td><%= addrBook.getBnum() %></td>
</tr>
<tr>
<td class="sub">이름</td>
<td><%= addrBook.getUsername() %></td>
</tr>
<tr>
<td class="sub">전화번호</td>
<td><%= addrBook.getTel() %></td>
</tr>
<tr>
<td class="sub">이메일</td>
<td><%= addrBook.getEmail() %></td>
</tr>
<tr>
<td class="sub">성별</td>
<td><%= addrBook.getGender() %></td>
</tr>
<tr>
<td class="sub">등록일</td>
<td><%= addrBook.getRegDate() %></td>
</tr>
<tr>
<td colspan="2">
<%
String sessionId = (String)session.getAttribute("sessionId");
if(sessionId.equals(addrBook.getEmail())) {%>
<a href="addrUpdate.jsp?bnum=<%= addrBook.getBnum() %>">
<button type="button">수정</button>
</a>
<a onclick="return confirm('정말로 해당 주소를 삭제하시겠습니까?')"
href="addrDelete.jsp?bnum=<%= addrBook.getBnum() %>">
<button type="button">삭제</button>
</a>
<% } %>
<a href="addrList.jsp">
<button type="button">목록</button>
</a>
</td>
</tr>
</table>
</div>
</body>
</html>
<세션(session)>
http 방식 - 페이지가 다르면 연결이 끊어짐
=> session = 클라이언트와 웹 서버간의 상태를 지속적으로 유지하는 방법
-> 사용자 인증을 통해 특정 페이지를 사용할 수 있도록 권한 상태 유지
브라우저를 닫기 전까지는 웹 페이지를 이동하더라도 사용자 정보 유지
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page session="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션 생성</title>
</head>
<body>
<h2>세션 생성</h2>
<!-- session = 내장 객체임 -->
<p>세션: <%= session %></p>
<!-- JSESSIONID -->
<p>세션 아이디: <%= session.getId() %></p>
</body>
</html>
* 세션의 주요 함수
- 세션 발급 : session.setAttribute("세션이름", "객체/변수") -> 로그인
- 세션 얻기 : session.getAttribute(세션이름)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String userId = request.getParameter("uid");
String userPw = request.getParameter("passwd");
// 아이디 khip, 비밀번호 1234
// 로그인 처리
if(userId.equals("khit") && userPw.equals("1234")){
// 로그인이 성공하면 세션을 발급함(세션이름 - "userID")
session.setAttribute("userID", userId);
out.println("세션이 발급되었습니다");
} else {
out.println("<script>");
out.println("alert('아이디나 비밀번호가 일치하지 않습니다')");
out.println("history.back()");
out.println("</script>");
}
%>
<p><%= session.getAttribute("userID")%>님이 로그인한 상태입니다</p>
- 세션 삭제 : session.invalidate() -> 로그아웃
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 세션 삭제
session.invalidate();
%>
<p>세션을 삭제했습니다</p>
loginForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>주소록 등록 폼...</title>
<link rel="stylesheet" href="../resources/css/style.css">
</head>
<body>
<div id="container">
<h2>로그인</h2>
<hr>
<form action="loginProcess.jsp" method="post">
<table id="tbl_login">
<tr>
<td><label>이메일</label></td>
<td><input type="text" name="email" required size="30" maxlength="30"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="로그인">
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
loginProcess.jsp - checkLogin(String email)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:useBean id="abDAO" class="addressbook.AddrBookDAO" scope="application"/>
<%
String email = request.getParameter("email");
boolean result = abDAO.checkLogin(email);
if(result) { // 이메일이 있으면 세션 발급 (세션이름 - sessionId)
session.setAttribute("sessionId", email);
response.sendRedirect("addrList.jsp"); //주소록 목록으로 이동
} else {
out.println("<script>");
out.println("alert('아이디나 비밀번호가 일치하지 않습니다')");
out.println("history.go(-1)"); // 이전 페이지 이동
out.println("</script>");
}
%>
logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 모든 세션 삭제 - 로그아웃
session.invalidate();
// 로그아웃 후 인덱스 페이지로 이동
response.sendRedirect("../index.jsp");
%>
jsp 를 사용하여 db 를 연동하고 sql을 사용하여 db를 관리하는 프로그래밍을 하게 되면서
수업의 무게감도 굉장히 무거워졌고
슬슬 따라가는것이 버겁다고 느끼는 듯한 학생들도 많아졌습니다
저 역시도 프로그램과 DB의 연동 매커니즘에 대한 코드, 함수들을 모두 다 이해하지는
못하는 것 같아서 응용하는데에 어려움이 있는 것 같습니다
수업도 집중해서 듣고 복습도 철저하게 해야겠다고 느껴지는 하루였습니다
2023. 11. 23 (목)
프로그래머 도전기 75일차 (2) | 2023.11.28 |
---|---|
프로그래머 도전기 74일차 (1) | 2023.11.27 |
프로그래머 도전기 72일차 (5) | 2023.11.22 |
프로그래머 도전기 71일차 (4) | 2023.11.20 |
프로그래머 도전기 70일차 (0) | 2023.11.18 |