Notice
Recent Posts
Recent Comments
Link
Everything has an expiration date
[JSP & JDBC & Oracle] 20231213 [프로그램소스 (JAVA Bean + JSP)] - MemberDTO, MemberDAO, WebApp10_scott, MemberList, MemberInsert 본문
[JSP & JDBC & Oracle]/Program source (JSP & JDBC & Oracle)
[JSP & JDBC & Oracle] 20231213 [프로그램소스 (JAVA Bean + JSP)] - MemberDTO, MemberDAO, WebApp10_scott, MemberList, MemberInsert
Jelly-fish 2023. 12. 13. 12:47
WebApp10
01
MemberDTO.java
/*====================================
MemberDTO.java
- 데이터 보관 및 전송 객체 활용
=====================================*/
package com.test;
public class MemberDTO
{
// 주요 속성 구성
private String sid, name, tel;
//-- TBL_MEMBER 테이블의 컬럼 구조
// getter / setter 구성
public String getSid()
{
return sid;
}
public void setSid(String sid)
{
this.sid = sid;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getTel()
{
return tel;
}
public void setTel(String tel)
{
this.tel = tel;
}
}
MemberDAO.java
/*============================================
MemberDAO.java
- 데이터베이스 액션 처리 전용 객체 활용
=============================================*/
package com.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import com.util.DBConn;
public class MemberDAO
{
// 주요 속성 구성
private Connection conn;
// 데이터베이스 연결 → 생성자 형태로 정의
public MemberDAO() throws ClassNotFoundException, SQLException
{
conn = DBConn.getConnection();
}
// 데이터 입력 메소드 정의
public int add(MemberDTO dto) throws SQLException
{
int result = 0;
// 쿼리문 준비
// String sql = String.format("INSERT INTO TBL_MEMBER(SID, NAME, TEL)"
// + "VALUES(MEMBERSEQ.NEXTVAL, '%s', '%s')"
// , dto.getName(), dto.getTel());
// 【PreparedStatement 사용!】
String sql = "INSERT INTO TBL_MEMBER(SID, NAME, TEL)VALUES(MEMBERSEQ.NEXTVAL, ?, ?)";
// 스테이트먼트 객체 생성
// Statement stmt = conn.createStatement();
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getTel());
// excuteUpdate (Statement)
// result = stmt.executeUpdate(sql);
result = pstmt.executeUpdate();
// stmt.close();
pstmt.close();
return result;
}
// 리스트 출력 메소드 정의
public ArrayList<MemberDTO> lists() throws SQLException
{
ArrayList<MemberDTO> memList = new ArrayList<MemberDTO>();
// 쿼리문 준비
String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID";
// 스테이트먼트 객체 생성
// Statement stmt = conn.createStatement();
// 프리페어드 스테이트먼트 객체 생성
PreparedStatement pstmt = conn.prepareStatement(sql);
// excuteQuery → ResultSet
// ResultSet rs = stmt.executeQuery(sql);
ResultSet rs = pstmt.executeQuery();
// while(rs.next())
// rs.getString("컬럼명")
while(rs.next())
{
// DTO 객체 생성
MemberDTO dto = new MemberDTO();
// 객체에 속성값 담기
dto.setSid(rs.getString("SID"));
dto.setName(rs.getString("NAME"));
dto.setTel(rs.getString("TEL"));
// ArrayList에 추가
memList.add(dto);
}
// stmt.close();
rs.close();
pstmt.close();
return memList;
}
//********************************************************
// 전체 인원 수 확인이므로,
// 조건이 걸려있지 않기 때문에 매개변수를 전달하지 않는다.
//********************************************************
// 전체 인원 수 확인을 위한 메소드 정의
public int count() throws SQLException
{
// 인원 수를 저장할 변수 선언
int count = 0;
// 쿼리문 준비
String sql = "SELECT COUNT(*) AS COUNT FROM TBL_MEMBER";
// 스테이트먼트 객체 생성
// Statement stmt = conn.createStatement();
// 프리페어드 스테이트먼트 객체 생성
PreparedStatement pstmt = conn.prepareStatement(sql);
// executeQuery → 단일값 (ResultSet)
// ResultSet rs = stmt.executeQuery(sql);
ResultSet rs = pstmt.executeQuery();
//*******************************************
// if (rs.next()) 도 가능! 단일 값이므로.
//*******************************************
while(rs.next())
{
count = rs.getInt("COUNT");
}
rs.close();
pstmt.close();
// stmt.close();
return count;
}
// 데이터베이스 연결 종료 담당 메소드 정의
public void close() throws SQLException
{
DBConn.close();
}
}
WebApp10_scott.sql
SELECT USER
FROM DUAL;
--==>> SCOTT
SELECT *
FROM TAB;
SELECT *
FROM TBL_MEMBER;
/*
1 문정환 010-1111-1111
2 정한울 010-2222-2222
3 최혜인 010-3333-3333
4 길현욱 010-4444-4444
5 ggg dd
6 김동민 010-7777-7777
7 박나영 010-5555-5555
8 hh 010-3333-3333
9 정현욱 010-9170-1676
11 김민지 010-7777-7777
10 강혜성 010-6380-7047
12 흰둥이 010-2222-2222
*/
DESC TBL_MEMBER;
--==>>
/*
이름 널? 유형
---- -------- ------------
SID NOT NULL NUMBER
NAME VARCHAR2(30)
TEL VARCHAR2(40)
*/
TRUNCATE TABLE TBL_MEMBER;
--==>> Table TBL_MEMBER이(가) 잘렸습니다.
DROP SEQUENCE MEMBERSEQ;
--==>> Sequence MEMBERSEQ이(가) 삭제되었습니다.
CREATE SEQUENCE MEMBERSEQ
NOCACHE;
--==>> Sequence MEMBERSEQ이(가) 생성되었습니다.
INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(MEMBERSEQ.NEXTVAL, '강혜성', '010-1111-1111');
INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(MEMBERSEQ.NEXTVAL, '김동민', '010-2222-2222');
INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(MEMBERSEQ.NEXTVAL, '이주형', '010-3333-3333');
INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(MEMBERSEQ.NEXTVAL, '엄재용', '010-4444-4444');
INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(MEMBERSEQ.NEXTVAL, '김지민', '010-5555-5555')
;
--==>> 1 행 이(가) 삽입되었습니다. * 5
SELECT SID, NAME, TEL
FROM TBL_MEMBER
ORDER BY SID;
--> 한 줄 구성
SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID
;
--==>>
/*
SID NAME TEL
1 강혜성 010-1111-1111
2 김동민 010-2222-2222
3 이주형 010-3333-3333
4 엄재용 010-4444-4444
5 김지민 010-5555-5555
*/
COMMIT;
--==>> 커밋 완료.
--○ 인원 수 확인 쿼리문 구성
SELECT COUNT(*) AS COUNT
FROM TBL_MEMBER;
--> 한 줄 구성
SELECT COUNT(*) AS COUNT FROM TBL_MEMBER
;
--==>> 5
MemberList.jsp
<%@page import="com.test.MemberDTO"%>
<%@page import="com.test.MemberDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
StringBuffer str = new StringBuffer();
MemberDAO dao = null;
String memberCount = "<span id='memberCount'>전체 회원 수 : "; //5명</span>";
try
{
dao = new MemberDAO();
// dao 메소드에서 반환한 인원수 값을 HTML 형식 문자열에 삽입하기
memberCount += dao.count() + "명</span>";
str.append("<table class='table'>");
str.append("<tr><th>번호</th><th>이름</th><th>전화번호</th></tr>");
// MemberDAO 의 lists() 메소드 호출
//-- 반복문을 통해 <table> 하위 엘리먼트 생성
for (MemberDTO member : dao.lists())
{
str.append("<tr>");
str.append("<td class='record'>" + member.getSid() + "</td>");
str.append("<td class='record'>" + member.getName() + "</td>");
str.append("<td class='record'>" + member.getTel() + "</td>");
str.append("</tr>");
}
str.append("</table>");
}
catch(Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
// 데이터베이스 연결 종료
dao.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MemberList.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<style type="text/css">
.record {text-align: center;}
input {width: 200px; border-radius: 6px;}
button {width: 320px; height: 40px; font-family: 맑은 고딕; font-weight: bold;}
.errMsg {font-size: small; color: red; display: none;}
</style>
<script type="text/javascript">
function formCheck()
{
// 확인
//alert("함수 호출~!!!");
var userName = document.getElementById("userName");
var nameMsg = document.getElementById("nameMsg");
nameMsg.style.display = "none";
if (userName.value=="")
{
nameMsg.style.display = "inline";
userName.focus();
return false;
}
//return false;
return true;
}
</script>
</head>
<body>
<div>
<h1>데이터베이스 연동 회원관리 실습</h1>
<hr>
</div>
<div>
<p>DAO, DTO 개념 적용</p>
<form action="MemberInsert.jsp" method="post" onsubmit="return formCheck();">
<table class="table">
<tr>
<th>이름(*)</th>
<td>
<input type="text" id="userName" name="userName" class="txt">
<span class="errMsg" id="nameMsg">이름을 입력해야 합니다.</span>
</td>
</tr>
<tr>
<th>전화번호</th>
<td>
<input type="text" id="userTel" name="userTel" class="txt">
</td>
</tr>
<tr></tr>
<tr>
<td colspan="2">
<button type="submit" class="btn" id="btnAdd">회원 추가</button>
</td>
</tr>
</table>
</form>
</div>
<br><br>
<!--
<div>
<span id="memberCount">전체 회원 수 : 5명</span>
<table class="table">
<tr>
<th>번호</th><th>이름</th><th>전화번호</th>
</tr>
<tr>
<td class="record">1</td>
<td class="record">고길동</td>
<td class="record">010-1111-1111</td>
</tr>
<tr>
<td class="record">2</td>
<td class="record">둘리</td>
<td class="record">010-2222-2222</td>
</tr>
<tr>
<td class="record">3</td>
<td class="record">도우너</td>
<td class="record">010-3333-3333</td>
</tr>
<tr>
<td class="record">4</td>
<td class="record">희동이</td>
<td class="record">010-4444-4444</td>
</tr>
<tr>
<td class="record">5</td>
<td class="record">마이콜</td>
<td class="record">010-5555-5555</td>
</tr>
</table>
</div>
-->
<div>
<!-- 전체 인원 수 확인 -->
<%=memberCount %>
<!-- 번호 이름 전화번호 항목에 대한 리스트 구성 -->
<%=str.toString() %>
</div>
</body>
</html>
MemberInsert.jsp
<%@page import="com.test.MemberDTO"%>
<%@page import="com.test.MemberDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
// MemberInsert.jsp
//-- 데이터 입력 액션 처리 페이지
// 이전 페이지(MemberList.jsp)로부터 넘어온 데이터 수신
// → userName, userTel
request.setCharacterEncoding("UTF-8");
//-- 한글 데이터가 깨지지 않도록 인코딩 설정
// 위 코드를 수행한 후 데이터 수신
String userName = request.getParameter("userName");
String userTel = request.getParameter("userTel");
// 밖에서 선언해야 DAO가 보이므로 null 로 선언.
MemberDAO dao = null;
try
{
dao = new MemberDAO();
//*******************************************
// dao 메소드 호출하는 과정에서
// add 메소드의 매개변수가 MemberDTO 이므로
// MemberDTO 객체를 먼저 생성해 준다.
//*******************************************
// MemberDTO 구성
MemberDTO member = new MemberDTO();
member.setName(userName);
member.setTel(userTel);
// add 메소드의 내부에서 필요한 값은 NAME, TEL이므로
// SID = MEMBERSEQ.NEXTVAL 로 채워진 상황이기에 setSid를 하지 않음
// dao 의 add() 메소드 호출 → insert 쿼리문 수행
dao.add(member);
// 필요하다면 add() 메소드의 반환값을 받아
// insert 액션이ㅡ 정상 처리여부 확인 후 추가 코드 구성 가능~!!!
}
catch(Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
dao.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
// 이 페이지를 다시 요청하라는 의미로
// request.sendRedirect()
// URL 주소가 적혀있는 쪽지를 사용자에게 전달
// → 이 주소를 다시 요청해서 찾아갈 수 있도록 하세요~!!!
// (그럼 입력값이 반영된 결과물을 확인할 수 있을거예요~!!!)
response.sendRedirect("MemberList.jsp");
// 아래 보여주는 페이지 모두 삭제~!!!
%>