상세 컨텐츠

본문 제목

프로그래머 도전기 73일차

프로그래머가 될거야!

by Choyee 2023. 11. 23. 22:38

본문

오늘은

 

어느새 또 일주일의 반이 넘어가버렸습니다

하루하루 시간이 어찌나 빨리 가는지

연말이 되어 친구들의 약속을 잡자는 연락이 슬슬 오고있답니다

하지만 해야할 것이 많고 배워야 할 것이 많은 저로서는

연말에도 코딩과의 약속이 우선일 것 같습니다

 

 

 

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> &nbsp;&nbsp;
			(<%=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 (목)

관련글 더보기