Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

Everything has an expiration date

★★★[JSP & JDBC & Oracle] 20231213 [프로그램 소스 - 회원 관리] - MemberDTO, MemberDAO, WebApp12_scott, MemberSelect, MemberInsertForm, MemberInsert, MemberUpdateForm, MemberUpdate, MemberDelete 본문

[JSP & JDBC & Oracle]/Program source (JSP & JDBC & Oracle)

★★★[JSP & JDBC & Oracle] 20231213 [프로그램 소스 - 회원 관리] - MemberDTO, MemberDAO, WebApp12_scott, MemberSelect, MemberInsertForm, MemberInsert, MemberUpdateForm, MemberUpdate, MemberDelete

Jelly-fish 2023. 12. 15. 00:14

 

 

WebApp12

 


0
MemberSelect (메인 화면)


 

 

 

MemberDTO.java

 

/*===============================================
  	MemberDTO.java
  - 객체 전용(데이터 보관 및 전송) → JAVA Bean
=================================================*/
package com.test;

public class MemberDTO
{	
	// 주요 속성 구성(프로퍼티 구성)
	
	private String sid, name, tel;		//-- 번호, 이름, 전화번호

	// 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
 	- 데이터베이스 액션 처리 전용 클래스
 	  (TBL_MEMBER 테이블 전용 DAO)
===========================================*/

package com.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.util.DBConn;

public class MemberDAO
{
	// 주요 속성 구성
	private Connection conn;
	
	// 데이터베이스 연결 담당 메소드
	public Connection connection() throws ClassNotFoundException, SQLException
	{
		conn = DBConn.getConnection();
		return conn;
	}
	
	// 데이터 입력 담당 메소드
	public int add(MemberDTO dto) throws SQLException
	{
		int result = 0;
		
		String sql = "INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(MEMBERSEQ.NEXTVAL, ?, ?)";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setString(1, dto.getName());
		pstmt.setString(2, dto.getTel());
		
		result = pstmt.executeUpdate();
		pstmt.close();
		
		return result;
	
	}
	
	// 회원 리스트 전체 출력 담당 메소드
	public ArrayList<MemberDTO> lists() throws SQLException
	{
		ArrayList<MemberDTO> result = new ArrayList<MemberDTO>();
		
		String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		ResultSet rs = pstmt.executeQuery();
		
		while (rs.next())
		{
			MemberDTO dto = new MemberDTO();
			
			dto.setSid(rs.getString("SID"));
			dto.setName(rs.getString("NAME"));
			dto.setTel(rs.getString("TEL"));
			
			result.add(dto);
		}
		
		rs.close();
		pstmt.close();
		
		return result;
	}
	
	// 전체 회원 수 확인 담당 메소드
	public int count() throws SQLException
	{
		int result = 0;
		
		String sql = "SELECT COUNT(*) AS COUNT FROM TBL_MEMBER";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		ResultSet rs = pstmt.executeQuery();
		
		while (rs.next())
		{
			result = rs.getInt("COUNT");
		}
		
		rs.close();
		pstmt.close();
		
		return result;
	}
	
	
	
	// 데이터베이스 연결 종료(해제) 담당 메소드
	public void close() throws SQLException
	{
		DBConn.close();
	}
	
	
	
	// 메소드 추가
	
	// 번호 검색 담당 메소드(번호를 통해 회원 데이터 조회)
	//-- 현재... 번호(sid)는 TBL_MEMBER 테이블에서 식별자의 역할을 수행하고 있으며
	//   이로인해 번호를 통한 검색 결과는 한 명의 회원일 수 밖에 없기 때문에
	//   반환 자료형은 MemberDTO 형태로 구성한다.
	
	// 회원 정보 검색 메소드 (SID)
	public MemberDTO searchMember(String sid) throws SQLException
	{
		MemberDTO result = new MemberDTO();
		
		String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER WHERE SID=?";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
//		pstmt.setString(1, sid);
		
		pstmt.setInt(1, Integer.parseInt(sid));
		
		ResultSet rs = pstmt.executeQuery();
		
		//if (rs.next())
		while (rs.next())
		{
			result.setSid(rs.getString("SID"));
			result.setName(rs.getString("NAME"));
			result.setTel(rs.getString("TEL"));
		}
		
		rs.close();
		pstmt.close();
		
		return result;
	}
	
	// 메소드 추가
	// 회원 데이터 수정 담당 메소드
	public int modify(MemberDTO member) throws SQLException
	{
		int result = 0;
		
		String sql = "UPDATE TBL_MEMBER"
				  + " SET NAME=?, TEL=?"
				  + " WHERE SID=?";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setString(1, member.getName());
		pstmt.setString(2, member.getTel());
//		pstmt.setString(3, dto.getSid());
		pstmt.setInt(3,  Integer.parseInt(member.getSid()));
		
		//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
		// 가급적이면 타입은 맞춰주는 것이 좋다.
		// Oracle 상에서는 sid가 NUMBER 타입이기 때문에
		// String으로 받아온 sid를 Integer 타입으로 변경해 준 것이다.
		//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
		
		result = pstmt.executeUpdate();
		
		pstmt.close();
		
		return result;
	}
	
	// 회원 데이터 삭제 담당 메소드
	public int remove(String sid) throws SQLException
	{
		int result = 0;
		
		String sql = "DELETE FROM TBL_MEMBER WHERE SID=?";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		// 타입을 맞춰 주어야 한다~!!! SID → NUMBER
		pstmt.setInt(1, Integer.parseInt(sid));
		
		result = pstmt.executeUpdate();
		
		pstmt.close();
		
		return result;
	}
	
	// 메소드 추가
	// 자식 테이블의 참조 데이터 레코드 수 확인
	
	// 참조 데이터 레코드 수 확인 메소드
	// TBL_MEMBERSCORE의 레코드를
	// TBL_MEMBER 에서 몇 개를 참조하는지 확인
	// → 1 (성적 레코드 참조함) → 삭제 불가능.
	// → 0 (성적 레코드 참조하지 않음) → 바로 삭제 가능!
	public int refCount(String sid) throws SQLException
	{
		int result = 0;
		
		String sql = "SELECT COUNT(*) AS COUNT"
				  + " FROM TBL_MEMBERSCORE"
				  + " WHERE SID=?";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setInt(1, Integer.parseInt(sid));
		
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next())
		{
			result = rs.getInt("COUNT");
		}
		
		rs.close();
		pstmt.close();
		
		return result;
		
	}
	
	
}

 

 


 

Oracle (Database) - WebApp12_scott.sql 

 

 

SELECT USER
FROM DUAL;

--○ 기존 테이블 삭제

DROP TABLE TBL_MEMBER;
--==>> Table TBL_MEMBER이(가) 삭제되었습니다.


--○ 테이블 생성(TBL_MEMBER)
CREATE TABLE TBL_MEMBER
( SID   NUMBER
, NAME  VARCHAR2(30) NOT NULL
, TEL   VARCHAR2(40)
, CONSTRAINT MEMBER_SID_PK PRIMARY KEY(SID)
);
--==>> Table TBL_MEMBER이(가) 생성되었습니다.


--○ 기존 시퀀스 제거
DROP SEQUENCE MEMBERSEQ;
--==> Table TBL_MEMBER이(가) 생성되었습니다.

--○ 시퀀스 생성
CREATE SEQUENCE MEMBERSEQ
NOCACHE;
--==>> Sequence MEMBERSEQ이(가) 생성되었습니다.

--○ 샘플 데이터 입력(TBL_MEMBER)
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
*/

--○ 인원 수 확인
SELECT COUNT(*) AS COUNT
FROM TBL_MEMBER;
--> 한 줄 구성
SELECT COUNT(*) AS COUNT FROM TBL_MEMBER
;

--○ 커밋
COMMIT;
--==>> 커밋 완료.

--○ 회원 정보 검색(SID)

SELECT SID, NAME, TEL
FROM TBL_MEMBER
WHERE SID=1;
--> 한 줄 구성
SELECT SID, NAME, TEL FROM TBL_MEMBER WHERE SID=1
;
--==>> 1	노은하	010-1111-1111



--○ 회원 정보 수정
UPDATE TBL_MEMBER
SET NAME='노은하', TEL='010-1100-1100'
WHERE SID=1;
--> 한 줄 구성
UPDATE TBL_MEMBER SET NAME='노은하', TEL='010-1100-1100' WHERE SID=1
;
--==>> 1 행 이(가) 업데이트되었습니다.

--○ 롤백
ROLLBACK;
--==>> 롤백 완료.




--○ 회원 정보 삭제
DELETE
FROM TBL_MEMBER
WHERE SID=1;
--> 한 줄 구성
DELETE FROM TBL_MEMBER WHERE SID=1
;
--==>> 1 행 이(가) 삭제되었습니다.

--○ 롤백
ROLLBACK;
--==>> 롤백 완료.


--○ 기존 테이블 제거
DROP TABLE TBL_SCORE;
--==>> Table TBL_SCORE이(가) 삭제되었습니다.


--○ 테이블 생성(TBL_MEMBERSCORE)
CREATE TABLE TBL_MEMBERSCORE
( SID   NUMBER
, KOR   NUMBER(3)
, ENG   NUMBER(3)
, MAT   NUMBER(3)
, CONSTRAINT MEMBERSCORE_SID_PK PRIMARY KEY(SID)
, CONSTRAINT MEMBERSCORE_KOR_CK CHECK(KOR BETWEEN 0 AND 100)
, CONSTRAINT MEMBERSCORE_ENG_CK CHECK(ENG BETWEEN 0 AND 100)
, CONSTRAINT MEMBERSCORE_MAT_CK CHECK(MAT BETWEEN 0 AND 100)
, CONSTRAINT MEMBERSCORE_SID_FK FOREIGN KEY(SID)
             REFERENCES TBL_MEMBER(SID)
);
--==>> Table TBL_MEMBERSCORE이(가) 생성되었습니다.


--○ 샘플 데이터 입력
INSERT INTO TBL_MEMBERSCORE(SID, KOR, ENG, MAT) VALUES(1, 90, 80, 70);
INSERT INTO TBL_MEMBERSCORE(SID, KOR, ENG, MAT) VALUES(2, 89, 70, 60)
;
--==>> 1 행 이(가) 삽입되었습니다. * 2

--○ 확인
SELECT SID, KOR, ENG, MAT
FROM TBL_MEMBERSCORE
ORDER BY SID;
--> 한 줄 구성
SELECT SID, KOR, ENG, MAT FROM TBL_MEMBERSCORE ORDER BY SID
;
--==>>
/*
SID	KOR	ENG	MAT
1	90	80	70
2	89	70	60
*/


--○ 커밋
COMMIT;
--==>> 커밋 완료.

--○ 입력된 성적 데이터의 개수 확인
SELECT COUNT(*) AS COUNT
FROM TBL_MEMBERSCORE;
--> 한 줄 구성
SELECT COUNT(*) AS COUNT FROM TBL_MEMBERSCORE
;
--==>> 2

--○ 성적 데이터 수정
UPDATE TBL_MEMBERSCORE
SET KOR=91, ENG=81, MAT=71
WHERE SID=1;
--> 한 줄 구성
UPDATE TBL_MEMBERSCORE SET KOR=91, ENG=81, MAT=71 WHERE SID=1
;
--==>> 1 행 이(가) 업데이트되었습니다.


--○ 확인
SELECT *
FROM TBL_MEMBERSCORE;
--==>> 
/*
SID	KOR	ENG	MAT
1	91	81	71
2	89	70	60
*/


--○ 커밋
COMMIT;
--==>> 커밋 완료.


--○ 성적 데이터 삭제
DELETE
FROM TBL_MEMBERSCORE
WHERE SID=1;
--> 한 줄 구성
DELETE FROM TBL_MEMBERSCORE WHERE SID=1
;
--==>> 1 행 이(가) 삭제되었습니다.


--○ 롤백
ROLLBACK;
--==>> 롤백 완료.


--○ 전체 리스트 조회 쿼리문 구성
SELECT M.SID, M.NAME, M.TEL
     , S.KOR, S.ENG, S.MAT
FROM TBL_MEMBER M, TBL_MEMBERSCORE S
WHERE M.SID = S.SID;
--==>>
/*
SID	NAME	    TEL	            KOR	ENG	MAT
1	노은하	010-1111-1111	91	81	71
2	박가영	010-2222-2222	89	70	60
*/
-- 이렇게 처리하면, 성적 처리가 된 멤버들만 보이게 된다.


--○ 전체 리스트 조회 쿼리문 구성 → 개선 → LEFT JOIN

-- 성적을 첨가(+)로 구성하여 부속적인 조건으로 처리하면
-- 성적이 (null)인 학생들도 출력된다.

SELECT M.SID, M.NAME, M.TEL
     , S.KOR, S.ENG, S.MAT
FROM TBL_MEMBER M, TBL_MEMBERSCORE S
WHERE M.SID = S.SID(+);
--==>>
/*
SID	NAME	TEL	KOR	ENG	MAT
1	노은하	010-1111-1111	    91	81	71
2	박가영	010-2222-2222	    89	70	60
3	채다선	010-3333-3333	    (null)(null)(null)		
4	김수환	010-4444-4444	    (null)(null)(null)		
5	김다슬	010-5555-5555	    (null)(null)(null)		
*/


--○ 전체 리스트 조회 쿼리문 구성 → 개선 → LEFT JOIN → 개선 → NVL()
SELECT M.SID, M.NAME, M.TEL
     , NVL(S.KOR, -1) AS KOR
     , NVL(S.ENG, -1) AS ENG
     , NVL(S.MAT, -1) AS MAT
FROM TBL_MEMBER M, TBL_MEMBERSCORE S
WHERE M.SID = S.SID(+);
--==>>
/*
SID	NAME    	TEL	            KOR	ENG	MAT
1	노은하	010-1111-1111	91	81	71
2	박가영	010-2222-2222	89	70	60
3	채다선	010-3333-3333	-1	-1	-1
4	김수환	010-4444-4444	-1	-1	-1
5	김다슬	010-5555-5555	-1	-1	-1
*/

-- 성적처리가 됐는데 0점일 수도 있으니까 -1로 처리.


--○ 전체 리스트 조회 전용 뷰 생성(VIEW_MEMBERSCORE)

CREATE OR REPLACE VIEW VIEW_MEMBERSCORE
AS
SELECT M.SID, M.NAME, M.TEL
     , NVL(S.KOR, -1) AS KOR
     , NVL(S.ENG, -1) AS ENG
     , NVL(S.MAT, -1) AS MAT
FROM TBL_MEMBER M, TBL_MEMBERSCORE S
WHERE M.SID = S.SID(+);
--==>> View VIEW_MEMBERSCORE이(가) 생성되었습니다.


--○ 생성한 뷰(VIEW_MEMBERSCORE)를 활용한 리스트 조회

SELECT SID, NAME, KOR, ENG, MAT
     , (KOR+ENG+MAT) AS TOT
     , (KOR+ENG+MAT)/3 AS AVG
     , RANK() OVER (ORDER BY (KOR+ENG+MAT) DESC) AS RANK
FROM VIEW_MEMBERSCORE
ORDER BY SID;
--> 한 줄 구성
SELECT SID, NAME, KOR, ENG, MAT, (KOR+ENG+MAT) AS TOT, (KOR+ENG+MAT)/3 AS AVG, RANK() OVER (ORDER BY (KOR+ENG+MAT) DESC) AS RANK FROM VIEW_MEMBERSCORE ORDER BY SID
;
--==>>
/*
SID	NAME	    KOR	ENG	MAT	TOT	AVG	RANK
1	노은하	91	81	71	243	81	1
2	박가영	89	70	60	219	73	2
3	채다선	-1	-1	-1	-3	-1	3
4	김수환	-1	-1	-1	-3	-1	3
5	김다슬	-1	-1	-1	-3	-1	3
*/


--○ 생성한 뷰 (VIEW_MEMBERSCORE)를 활용한 번호 검색
SELECT SID, NAME, KOR, ENG, MAT
FROM VIEW_MEMBERSCORE
WHERE SID=1;
--> 한 줄 구성
SELECT SID, NAME, KOR, ENG, MAT FROM VIEW_MEMBERSCORE WHERE SID=1
;
--==>> 1	노은하	91	81	71

--○ 참조 데이터 레코드 수 확인
SELECT COUNT(*) AS COUNT
FROM TBL_MEMBERSCORE
WHERE SID=1;
--> 한 줄 구성
SELECT COUNT(*) AS COUNT FROM TBL_MEMBERSCORE WHERE SID=1
;
--==>> 1

-- 1이 나오면 성적 처리 완료
-- 0이 나오면 성적 처리가 되지 않은 것.

 

 


 

 


0
MemberSelect.jsp


 

 

MemberSelect.jsp
(회원 정보 메인 화면)

 

 

<%@page import="com.test.MemberDTO"%>
<%@page import="com.test.MemberDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<% 
	StringBuffer str = new StringBuffer();
	MemberDAO dao = new MemberDAO();
	
	try
	{
		//*****************************************************
		// 커넥션을 수행하는 메소드를 생성자에 선언하지 않고
		// 별도로 메소드를 따로 만들었기 때문에
		// DAO 객체를 밖에서 생성한 것.
		//*****************************************************
		
		dao.connection();
		
		str.append("<table class='table'>");
		str.append("		<tr>");
		str.append("			<th style='width: 50px;'>번호</th>");
		str.append("			<th style='width: 100px;'>이름</th>");
		str.append("			<th style='width: 150px;'>전화번호</th>");
		str.append("			<th style='width: 200px;'>관리</th>");
		str.append("		</tr>");
		
		
		for(MemberDTO member : dao.lists())
		{
			/* sid를 넘겨주어야, 데이터베이스에서 가져오므로.  */
			/* 특정한 sid 값을 갖는 학생에 대한 데이터를 수정해야 하기 때문에. */
			str.append("<tr>");
			str.append("	<td>"+ member.getSid() +"</td>");
			str.append("	<td>" + member.getName() +"</td>");
			str.append("	<td>" + member.getTel() + "</td>");
			str.append("	<td>");
								/* "<a href='MemberUpdateForm.jsp?sid=2'>" */
			str.append("		<a href='MemberUpdateForm.jsp?sid=" + member.getSid() + "'>");
			str.append("			<button type='button' class='btn01'>수정</button>");
			str.append("		</a>");
			
			// memberDelete(1, '노은하')
			
			// ※ 자바스크립트에서 사용할 수 있는 따옴표의 종류
			//    ① "" ② '' ③ \"\"
			//    일반적으로 따옴표가 두 번 중첩되어 사용하게 되면
			//    ① 과 ② 를 사용하면 된다.
			//    하지만, 따옴표가 세 번 중첩되어 사용될 경우
			//    ③ escape 를 사용해야 한다.
			
						
			
			
			/* 삭제 버튼을 눌렀을 때, 정말 삭제할 것인지 alert 창 띄우고, 예를 눌렀을 때만 삭제되도록. */
			
			/* <a href='javascript:memberDelete(member.getSid(), member.getName())>' */
			str.append("		<a href='javascript:memberDelete(" + member.getSid() + ", \"" + member.getName() + "\")'>");
			str.append("			<button type='button' class='btn01'>삭제</button>");
			str.append("		</a>");
			str.append("	</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>MemberSelect.jsp</title>
<link rel="stylesheet" type="text/css" href="css/MemberScore.css">
<style type="text/css">
	a {text-decoration: none;}
</style>
<script type="text/javascript">

	function memberDelete(sid, name)
	{
		// 확인
		//alert("함수 호출~!!!");
		
		// 확인
		//alert("번호 : " + sid);
		
		
		// 확인
		//alert("번호 : " + sid + ", 이름 : " + name);
		
		// confirm - 확인, 취소를 사용자로부터 선택하게끔 처리하는 안내창.
		//┌──────────────────────────────────────────┐
		//│                                          │
		//│ 번호:1, 이름:구구                         │  
		//│  이 회원의 정보를 정말 삭제하시겠습니까?    │
		//│                  < 확인 > < 취소 >        │
		//│                   true     false         │
		//└─────────────────────────────────────────┘
		
		var res = confirm("번호:" + sid + ", 이름:" + name + "\n이 회원의 정보를 정말 삭제하시겠습니까?");
		
		// 확인
		//alert(res);
		//-- confirm() 함수를 통해 호출되는 창은
		//   사용자의 의사표현 결과에 따라
		//   true(확인) 또는 false(취소)를 반환하게 된다.
		
		// res 자체가 true, false를 담기 때문에. → if (res)
		if (res)
			window.location.href="MemberDelete.jsp?sid=" + sid;
		// get 방식으로 가져오는 방식
		// 아무것도 안 담긴채로 전달되게 된다.
		// Delete 처리 요청을 부탁하는 것이다. 
		//	window.location.href="MemberDelete.jsp";
		// 해당 회원의 정보를 처리하게끔 구성하려면 sid를 url에 전달해 주어야 한다!
		
		
		
		// 성적 정보가 입력된 회원은 삭제할 수가 없어야 한다.
		// MemberDelete에서 분기가 이루어져야 한다.
		// 성적 정보가 입력된 것은 자식 레코드이므로 이 회원을 바로 삭제할 수가 없어야 하기 때문에
		// 삭제 버튼이 회색 폰트 컬러.
		
	}
	
</script>


</head>
<body>

<div>
	<h1>회원 <span style="color: red;">명단</span> 관리 및 출력 페이지</h1>
	<hr>
</div>

<div>
	<a href="MemberScoreSelect.jsp"><button type="button">회원 성적 관리</button></a>
	<a href="MemberInsertForm.jsp"><button type="button">신규 회원 등록</button></a>
</div>
<br>

<div>
	<!-- 리스트 출력 -->
<!-- 	
	<table class='table'>
		<tr>
			<th style="width: 50px;">번호</th>
			<th style="width: 100px;">이름</th>
			<th style="width: 150px;">전화번호</th>
			<th style="width: 200px;">관리</th>
		</tr>
		<tr>
			<td>1</td>
			<td>희동이</td>
			<td>010-1111-1111</td>
			<td>
				<a><button type="button" class="btn01">수정</button> </a>
				<a><button type="button" class="btn01">삭제</button> </a>
			</td>
		</tr>
		<tr>
			<td>2</td>
			<td>도우너</td>
			<td>010-2222-2222</td>
			<td>
				<a><button type="button" class="btn01">수정</button> </a>
				<a><button type="button" class="btn01">삭제</button> </a>
			</td>
		</tr>
		<tr>
			<td>3</td>
			<td>마이콜</td>
			<td>010-3333-3333</td>
			<td>
				<a><button type="button" class="btn01">수정</button> </a>
				<a><button type="button" class="btn01">삭제</button> </a>
			</td>
		</tr>
	</table>
	-->
	<%=str.toString() %>
</div>

</body>
</html>

 

 


 

 

01. MemberInsert - 회원 정보 입력 처리

 

 

 

 

01
MemberInsertForm, MemberInsert (페이지 뒷단 Logic 처리)

 

 

MemberInsertForm.jsp (사용자에게 보여지는 Form)

 

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MemberInsertForm.jsp</title>
<link rel="stylesheet" type="text/css" href="css/MemberScore.css">
<style type="text/css">
	a {text-decoration: none;}
</style>
<script type="text/javascript">
	
	// 입력하기 버튼 클릭 시 호출되는 자바스크립트 함수
	function memberSubmit()
	{
		// 확인
		//alert("함수 호출~!!!");
		
		var memberForm = document.getElementById("memberForm")
		
		var uName = document.getElementById("uName");
		var nameMsg = document.getElementById("nameMsg");
		
		nameMsg.style.display = "none";
		
		if (uName.value == "")
		{
			nameMsg.style.display = "inline";
			uName.focus();
			return;
		}
		
		// form 을 직접 지정하여 submit 액션 수행
		memberForm.submit();
	
	}
	
	function memberReset()
	{
		// 확인
		//alert("함수 호출~!!!");
		
		var memberForm = document.getElementById("memberForm");
		var uName = document.getElementById("uName");
		var nameMsg = document.getElementById("nameMsg");
		
		nameMsg.style.display = "none";
		
		// form 을 직접 지정하여 reset 액션 수행
		
		memberForm.reset();
		
		uName.focus();
	}
	
</script>
</head>
<body>


<div>
	<h1>회원 <span style="color: red;">명단</span> 관리
		및 <span style="color: green;">입력</span> 페이지</h1>
	<hr>
</div>

<div>
	<a href="MemberSelect.jsp"><button type="button">회원 명단 관리</button></a>
</div>
<br>

<div>
	<!-- 회원 데이터 입력 폼 구성 -->
	<form action="MemberInsert.jsp" method="post" id="memberForm">
		<table class="table">
			<tr>
				<th>이름(*)</th>
				<td>
					<input type="text" id="uName" name="uName">
				</td>
				<td>
					<span class="errMsg" id="nameMsg">이름을 입력해야 합니다.</span>
				</td>
			</tr>
			<tr>
				<th>전화번호</th>
				<td>
					<input type="text" id="uTel" name="uTel">
				</td>
				<td></td>
			</tr>
		</table>
		<br>
		<a href="javascript:memberSubmit()"><button type="button">입력하기</button></a>
		<a href="javascript:memberReset()"><button type="button">취소하기</button></a>
		<a href="MemberSelect.jsp"><button type="button">목록으로</button></a>
		
	</form>
</div>




</body>
</html>

 


 

 

MemberInsert.jsp (뒷단 Logic 처리)

 

<%@page import="com.test.MemberDTO"%>
<%@page import="java.sql.Connection"%>
<%@page import="com.test.MemberDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
	// MemberInsert.jsp
	//-- 데이터베이스의 테이블(TBL_MEMBER)에
	//   회원 데이터 추가 액션 처리 수행
	//   ... 이후... 클라이언트가 다시 리스트 페이지(MemberSelect.jsp)를
	//   요청할 수 있도록 안내
	
	// 이전 페이지로(MemberInsertForm.jsp)부터 넘어온 데이터 수신
	// → uName, uTel
	
	request.setCharacterEncoding("UTF-8");
	
	String uName = request.getParameter("uName");
	String uTel = request.getParameter("uTel");
	
	MemberDAO dao = new MemberDAO();
	
	//Connection conn;
	//int result = 0;
	
	try
	{
		//conn = dao.connection();
		// 데이터 베이스 연결
		dao.connection();
		
		// MemberDTO 객체 생성 및 속성 구성 (→ add() 메소드 호출을 위해 필요)
		
		MemberDTO dto = new MemberDTO();
		dto.setName(uName);
		dto.setTel(uTel);
		
		// insert 쿼리문을 수행하는 dao 의 add() 메소드 호출
		dao.add(dto);
		
		/*
		result = dao.add(dto);
		
		if (result < 1)
		{
			response.sendRedirect("Error.jsp");
		}
		else
		{
			response.sendRedirect("MemberSelect.jsp");
		}
		*/
	}
	catch(Exception e)
	{
		System.out.println(e.toString());
	}
	finally
	{
		try
		{
			dao.close();
		}
		catch(Exception e)
		{
			System.out.println(e.toString());
		}
	}
	
	// check~!!!
	// 클라이언트가 MemberSelect.jsp 페이지를 다시 요청할 수 있도록 안내
	response.sendRedirect("MemberSelect.jsp");

// 아래 보여지는 코드 모두 제거 (HTML)
	
	
	
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>

</body>
</html>

 

 


 

 

02. MemberUpdate - 회원 정보 수정 처리

 

 


01
MemberUpdateForm, MemberUpdate(페이지 뒷단 Logic 처리)


 

 

MemberUpdateForm.jsp

 

<%@page import="com.test.MemberDTO"%>
<%@page import="com.test.MemberDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>

<%
	// 이전 페이지(MemberSelect.jsp)로부터 넘어온 데이터 수신
	// -> sid
	
	// 수신한 sid 를 가지고 회원 데이터 조회
	// 조회해서 얻어낸 데이터를 폼에 구성
	
	String sid = request.getParameter("sid");
	String name = "";
	String tel = "";
	
	MemberDAO dao = new MemberDAO();
	
	try
	{
		// 데이터베이스 연결
		dao.connection();
		
		MemberDTO member = dao.searchMember(sid);
		name = member.getName();
		tel = member.getTel();
	}
	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>MemberUpdateForm.jsp</title>
<link rel="stylesheet" type="text/css" href="css/MemberScore.css">
<style type="text/css">
	a {text-decoration: none;}
</style>

<script type="text/javascript">
	
	// 입력하기 버튼 클릭 시 호출되는 자바스크립트 함수
	function memberSubmit()
	{
		// 확인
		// alert("함수 호출");
		
		var memberForm = document.getElementById("memberForm");
		
		var uName = document.getElementById("uName");
		var nameMsg = document.getElementById("nameMsg");
		
		nameMsg.style.display = "none";
		
		if(uName.value == "")
		{
			nameMsg.style.display = "inline";
			uName.focus();
			return;
		}
		
		// form 을 직접 지정하여 submit 역할 수행
		memberForm.submit();
	}
	
	function memberReset()
	{
		// 확인
		// alert("함수 호출");
		
		var memberForm = document.getElementById("memberForm");
		var uName = document.getElementById("uName");
		var nameMsg = document.getElementById("nameMsg");
		
		nameMsg.style.display = "none";
		
		// form 을 직접 지정하여 reset 액션 수행
		memberForm.reset();	// 원래대로 돌아가는 것
		
		uName.focus();
	}
	
</script>

</head>
<body>

<div>
	<h1>회원 <span style="color: red;">명단</span> 관리 및 
	<span style="color: blue;">수정</span> 페이지</h1>
	<hr>
</div>

<div>
	<a href="MemberSelect.jsp"><button type="button">회원 명단 관리</button></a>
</div>
<br>

<div>
	<!-- 회원 데이터 수정 폼 구성 -->
					<!-- 3방법 -->
	<form action="MemberUpdate.jsp?sid=<%=sid %>" method="post" id="memberForm">
		<table class="table">
			<tr>
				<th>번호</th>
				<!-- <td>1</td> -->
				<!-- name 속성이 없어서 가져올 수 없다(getparameter로 다음 jsp에서) -->
				<td>	<!-- 1방법 -->
					<%-- <input type="text" name="sid" value="<%=sid %>" disabled="disabled"> --%>
					<%=sid %>
				</td>
			</tr>
			<tr>
				<th>이름(*)</th>
				<td>
					<input type="text" id="uName" name="uName" value="<%=name%>">
				</td>
				<td>
					<span class="errMsg" id="nameMsg">이름을 입력해야 합니다.</span>
				</td>
			</tr>
			<tr>
				<th>전화번호</th>
				<td>
					<input type="text" id="uTel" name="uTel" value="<%=tel %>">
				</td>
				<td></td>
			</tr>
		</table>
		
		
		<%-- 2방법
		 <input type="hidden" name="sid" value="<%=sid %>"> --%>
		<br>
		
		<a href="javascript:memberSubmit()"><button type="button">수정하기</button></a>
		<a href="javascript:memberReset()"><button type="button">취소하기</button></a>
		<a href="MemberSelect.jsp"><button type="button">목록으로</button></a>
	</form>
</div>




</body>
</html>

<%-- <%@page import="com.test.MemberDTO"%>
<%@page import="com.test.MemberDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<% 
	// 이전 페이지(MemberSelect.jsp)로부터 넘어온 데이터 수신
	// → sid
	
	String sid = request.getParameter("sid");

	// sid를 통해, 이름과 전화번호를 알아내야 한다.
	String name = "";
	String tel = "";
	
	MemberDAO dao = new MemberDAO();
	
	try
	{
		// 데이터베이스 연결
		dao.connection();
		
		MemberDTO member = dao.searchMember(sid);
		// MemberDAO dao의 메소드 searchMember(sid)는
		// sid 에 해당하는 MemberDTO 객체를 리턴하는 메소드이다.
		// 현재, sid밖에 MemberSelect.jsp 페이지에서 전달해주지 않았기 때문에
		// 수정 전의 데이터를 받아오기 위해서
		// sid 에 해당하는 MemberDTO 객체를 반환받아서 member에 저장한다.
		name = member.getName();
		tel = member.getTel();
		
	}
	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>MemberInsertForm.jsp</title>
<link rel="stylesheet" type="text/css" href="css/MemberScore.css">
<style type="text/css">
	a {text-decoration: none;}
</style>
<script type="text/javascript">
	
	// 입력하기 버튼 클릭 시 호출되는 자바스크립트 함수
	function memberSubmit()
	{
		// 확인
		//alert("함수 호출~!!!");
		
		var memberForm = document.getElementById("memberForm")
		
		var uName = document.getElementById("uName");
		var nameMsg = document.getElementById("nameMsg");
		
		nameMsg.style.display = "none";
		
		if (uName.value == "")
		{
			nameMsg.style.display = "inline";
			uName.focus();
			return;
		}
		
		// form 을 직접 지정하여 submit 액션 수행
		memberForm.submit();
	
	}
	
	function memberReset()
	{
		// 확인
		//alert("함수 호출~!!!");
		
		var memberForm = document.getElementById("memberForm");
		var uName = document.getElementById("uName");
		var nameMsg = document.getElementById("nameMsg");
		
		nameMsg.style.display = "none";
		
		// form 을 직접 지정하여 reset 액션 수행
		
		memberForm.reset();
		
		uName.focus();
	}
	
</script>
</head>
<body>


<div>
	<h1>회원 <span style="color: red;">명단</span> 관리
		및 <span style="color: green;">입력</span> 페이지</h1>
	<hr>
</div>

<div>
	<a href="MemberSelect.jsp"><button type="button">회원 명단 관리</button></a>
</div>
<br>

<div>
	<!-- 회원 데이터 수정 폼 구성 -->
	<form action="MemberUpdate.jsp?sid=<%=sid %>" method="post" id="memberForm">
		<table class="table">
			<tr>
				<th>이름(*)</th>
				<td>
					<input type="text" id="uName" name="uName" value="<%=name %>">
				</td>
				<td>
					<span class="errMsg" id="nameMsg">이름을 입력해야 합니다.</span>
				</td>
			</tr>
			<tr>
				<th>전화번호</th>
				<td>
					<input type="text" id="uTel" name="uTel" value="<%=tel%>">
				</td>
				<td></td>
			</tr>
		</table>
		<br>
		<a href="javascript:memberSubmit()"><button type="button">수정하기</button></a>
		<a href="javascript:memberReset()"><button type="button">취소하기</button></a>
		<a href="MemberSelect.jsp"><button type="button">목록으로</button></a>
		
	</form>
</div>


</body>
</html>
 --%>

 

 

MemberUpdate.jsp

 

 

<%@page import="com.test.MemberDAO"%>
<%@page import="com.test.MemberDTO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<% 
	// MemberUpdate.jsp
	
	// 이전 페이지(MemberUpdateForm.jsp)로부터 넘어온 데이터 수신
	// → sid, uName, uTel
	
	request.setCharacterEncoding("UTF-8");

	String sid = request.getParameter("sid");
	String name = request.getParameter("uName");
	String tel = request.getParameter("uTel");
	
	MemberDAO dao = new MemberDAO();
	
	try
	{
		dao.connection();
		
		MemberDTO member = new MemberDTO();
		member.setSid(sid);
		member.setName(name);
		member.setTel(tel);
		
		dao.modify(member);
		
		// 이후 반환 결과에 따른 분기 처리 가능~!!!
		
		
	}
	catch(Exception e)
	{
		System.out.println(e.toString());
	}
	finally
	{
		try
		{
			dao.close();
		}
		catch(Exception e)
		{
			System.out.println(e.toString());
		}
	}
	
	// 클라이언트에 MemberSelect.jsp 페이지를 다시 요청할 수 있도록 안내~!!!
	response.sendRedirect("MemberSelect.jsp");
	
// 이후 보여지는 페이지 구성 모두 삭제

%>

 

 


 

03. MemberDelete - 회원 정보 삭제 처리

 

 


 

01
MemberSelect, MemberDelete (페이지 뒷단 Logic 처리)


 

 

MemberDelete.jsp

 

<%@page import="com.test.MemberDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<% 
	// MemberDelete.jsp
	
	// 이전 페이지(MemberSelect.jsp)로부터 넘어온 데이터 수신
	// → sid
	
	String sid = request.getParameter("sid");

	MemberDAO dao = new MemberDAO();
	
	String strAddr = "";
	
	try
	{
		dao.connection();
		
		//dao.remove(sid);
		
		// 참조 레코드 수 확인
		
		int checkCount = dao.refCount(sid);
		//-- TBL_MEMBER 테이블에서 제고하고자 하는 데이터의
		//   SID를 참조하는 TBL_MEMBERSCORE 테이블 내의 데이터 개수 확인
		//   (현재는 0 or 1)
		
		if (checkCount==0)		//-- 제거 가능
		{
			dao.remove(sid);
			strAddr = "MemberSelect.jsp";
		}
		else					//-- 제거 불가
		{
			//dao.remove(sid);
			// (제거 불가능하므로 안 됨! sid 참조하는 자식 레코드 있으니까!)
			strAddr = "Notice.jsp";
			//-- TBL_MEMBERSCORE 테이블의 데이터가
			//   TBL_MEMBER 테이블의 SID 를 참조하고 있는 경우로
			//   삭제가 불가능한 상황
			//-- 제거하지 못하는 사유를 안내하는 페이지로 이동
			//   + 리스트로 돌아가기 기능 추가
		}
		
	}
	catch(Exception e)
	{
		System.out.println(e.toString());
	}
	finally
	{
		try
		{
			dao.close();
			
		}
		catch(Exception e)
		{
			System.out.println(e.toString());
		}
	}
	
	// check~!!!
	// 사용자가 다시 요청해야 할 페이지 안내
	response.sendRedirect(strAddr);
	
	// 위의 코드를 if문 내부에 구성하고,
	// Notice.jsp 에 보내지 않고
	// 이 페이지에 남아있게끔도 구성할 수 있다.
	
// 나머지 보여주는 코드들 모두 제거 

%>