본문 바로가기

수업내용

[Day31][JDBC] 회원관리 및 글쓰기 / 글조회 / 글변경 / 글삭제

 

5. 모든 회원 정보 보기

 

(Eclipse) MemberNBoardMainApp

case "5":	// 모든 회원 정보 보기
		List<MemberDTO> memberList = mbrCtrl.selectAllMember();
				
		if(memberList == null) {
			System.out.println(">> 현재 가입된 회원이 1명도 없습니다. << \n");
		}
					
		else {
			System.out.println("-----------------------------------------------------------------------------------------------------");
			System.out.println("아이디\t암호\t\t성명\t주소\t\t가입일자\t\t생년월일\t\t나이\t성별\t포인트");
			System.out.println("-----------------------------------------------------------------------------------------------------");
					
					
			for(MemberDTO mbr:memberList) {
				System.out.println(mbr);
			}
			System.out.print("\n\n");
		}

 

(Eclipse)InterMemberCtrl

List<MemberDTO> selectAllMember();

 

(Eclipse)MemberCtrl

@Override
public List<MemberDTO> selectAllMember() {
	List<MemberDTO> memberList = null;
				
	memberList = mbrdao.selectAllMember();
		
	return memberList;
}

 

(Eclipse)InterMemberDAO

List<MemberDTO> selectAllMember();

 

(Eclipse)MemberDAO

@Override
public List<MemberDTO> selectAllMember() {
		
	List<MemberDTO> memberList = new ArrayList<MemberDTO>();
		
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver");

		conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "myorauser", "eclass");

		String sql = "select no, userid, passwd, name, address\n"
				+ "     , substr(birthday, 1, 4) || '-' || substr(birthday, 5, 2) || '-' || substr(birthday, 7) AS birthday\n"
				+ "     , to_char(registerday, 'yyyy-mm-dd hh24:mi:ss') AS registerday\n" + "     , gender, point\n"
				+ "from jdbc_tbl_member\n" + "where status = 1 ";

		pstmt = conn.prepareStatement(sql);

		rs = pstmt.executeQuery();

		int cnt = 0;
		while (rs.next()) {	
			cnt++;
			if(cnt == 1)
			memberList = new ArrayList<MemberDTO>();
				
			int no = rs.getInt("no");
			String userid = rs.getString("userid");
			String passwd = rs.getString("passwd");
			String name = rs.getString("name");
			String address = rs.getString("address");
			String birthday = rs.getString("birthday");
			String registerday = rs.getString("registerday");
			int gender = rs.getInt("gender");
			int point = rs.getInt("point");

			MemberDTO mbrdto = new MemberDTO();
				
			mbrdto.setNo(no);
			mbrdto.setUserid(userid);
			mbrdto.setPasswd(passwd);
			mbrdto.setName(name);
			mbrdto.setAddress(address);
			mbrdto.setBirthday(birthday);
			mbrdto.setRegisterday(registerday);
			mbrdto.setGender(gender);
			mbrdto.setPoint(point);
				
			memberList.add(mbrdto);
		}

	} catch (ClassNotFoundException e) {
		System.out.println(">> ojdbc6.jar 파일이 없습니다. <<");
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		try {
			if (rs != null)
				rs.close();
			if (pstmt != null)
				pstmt.close();
			if (conn != null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
		
	return memberList;
}

 

-- memberDTO의 toString 메소드 재정의를 해 주어야 한다.

 

(Eclipse)InterMemberDTO

String toString();

 

(Eclipse)MemberDTO

public String toString() {
		
	StringBuilder sb = new StringBuilder();
		
	String strGender = "";
	if(gender == 1)
		strGender = "남자";
	else
		strGender = "여자";
		
	Calendar currentDate = Calendar.getInstance();
	int currentYear = currentDate.get(Calendar.YEAR);
	int birthYear = Integer.parseInt(birthday.substring(0, 4));
	int age = currentYear - birthYear + 1;
		
	sb.append(userid + "\t" + passwd + "\t" + name + "\t");
	sb.append(address + "\t" + registerday.subSequence(0, 10) + "\t" + birthday + "\t");
	sb.append(age + "\t" + strGender + "\t" + point + "\t");
	return sb.toString();

 


 

6. 성별 조회

 

(Eclipse)MemberNBoardMainApp

case "6": // 성별 조회
				
		String gender = "";
		genderSubmenu(sc);
		do {
			gender = sc.nextLine();
			gender = gender.trim();
			if(!("1".equals(gender) || "2".equals(gender))) {
				System.out.println(">> 남자는 1, 여자는 2로 선택하세요.");
				System.out.print("▷ 남녀 선택 : ");
			} 
			else 
				break;	
		} while(true);
				
		memberList = mbrCtrl.selectMemberByGender(gender);
				
		if (memberList == null) {
			String strGender = ("1".equals(gender))?"남자":"여자";
			System.out.println(">> 현재 가입된 " + strGender + "회원이 1명도 없습니다. << \n");
		}
        else {
			System.out.println(
					"-----------------------------------------------------------------------------------------------------");
			System.out.println("아이디\t암호\t\t성명\t주소\t\t가입일자\t\t생년월일\t\t나이\t성별\t포인트");
			System.out.println(
					"-----------------------------------------------------------------------------------------------------");

			for (MemberDTO mbr : memberList) {
				System.out.println(mbr);
			}
			System.out.print("\n\n");
		}
		break;

 

(Eclipse)MemberNBoardMainApp

List<MemberDTO> selectMemberByGender(String gender);

 

(Eclipse)MemberCtrl

@Override
public List<MemberDTO> selectMemberByGender(String gender) {
	List<MemberDTO> memberList = null;
		
	memberList = mbrdao.selectMemberByGender(gender);
	return memberList;
}

 

(Eclipse)InterMemberDAO

List<MemberDTO> selectMemberByGender(String gender);

 

(Eclipse)MemberDAO

@Override
public List<MemberDTO> selectMemberByGender(String paraGender) {
		
	List<MemberDTO> memberList = null;
		
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver");

		conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "myorauser", "eclass");

		String sql = "select no, userid, passwd, name, address\n"
				+ "     , substr(birthday, 1, 4) || '-' || substr(birthday, 5, 2) || '-' || substr(birthday, 7) AS birthday\n"
				+ "     , to_char(registerday, 'yyyy-mm-dd hh24:mi:ss') AS registerday\n" + "     , gender, point\n"
				+ "from jdbc_tbl_member\n" + "where status = 1 and gender = ? \n"
				+ "order by no desc";

		pstmt = conn.prepareStatement(sql);
		pstmt.setString(1, paraGender);

		rs = pstmt.executeQuery();

		int cnt = 0;
		while (rs.next()) {	
				
			cnt++;
			if(cnt == 1)
			memberList = new ArrayList<MemberDTO>();
				
			int no = rs.getInt("no");
			String userid = rs.getString("userid");
			String passwd = rs.getString("passwd");
			String name = rs.getString("name");
			String address = rs.getString("address");
			String birthday = rs.getString("birthday");
			String registerday = rs.getString("registerday");
			int gender = rs.getInt("gender");
			int point = rs.getInt("point");

			MemberDTO mbrdto = new MemberDTO();
				
			mbrdto.setNo(no);
			mbrdto.setUserid(userid);
			mbrdto.setPasswd(passwd);
			mbrdto.setName(name);
			mbrdto.setAddress(address);
			mbrdto.setBirthday(birthday);
			mbrdto.setRegisterday(registerday);
			mbrdto.setGender(gender);
			mbrdto.setPoint(point);
			memberList.add(mbrdto);
		}

	} catch (ClassNotFoundException e) {
		System.out.println(">> ojdbc6.jar 파일이 없습니다. <<");
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		try {
			if (rs != null)
				rs.close();
			if (pstmt != null)
				pstmt.close();
			if (conn != null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	return memberList;
}

 


7. 연령대별 검색

 

(Eclipse)MemberNBoardMainApp

case "7": // 연령대별 검색
				
		int ageLine = 0;
				
		do {	
			try {
			System.out.print("\n ▷ 검색하고자 하는 연령대 : ");
			ageLine = Integer.parseInt(sc.nextLine());
					
			if(!(ageLine == 10 ||
				 ageLine == 20 ||
				 ageLine == 30 ||
				 ageLine == 40 ||
				 ageLine == 50 ||
                 ageLine == 60 ||
				 ageLine == 70 ||
				 ageLine == 80 ||
				 ageLine == 90)) {
						
				System.out.println(">> 연령대가 20대면 20, 30대면 30으로 입력해 주세요. <<");
			}
			else
				break;
			} catch(NumberFormatException e) {
				System.out.println(">> 숫자만 입력하세요. <<");
			}
						
		} while (true);
				
		memberList = mbrCtrl.selectMemberByAgeLine(ageLine);
				
				
		if (memberList == null) {
			System.out.println(">> 현재 가입된 회원 중 연령대가 " + ageLine + "대인 회원은 1명도 없습니다. << \n");
		}

		else {
			System.out.println(
					"-----------------------------------------------------------------------------------------------------");
			System.out.println("아이디\t암호\t\t성명\t주소\t\t가입일자\t\t생년월일\t\t나이\t성별\t포인트");
			System.out.println(
					"-----------------------------------------------------------------------------------------------------");

			for (MemberDTO mbr : memberList) {
				System.out.println(mbr);
			}
			System.out.print("\n\n");
		}
		break;

 

(Eclipse)InterMemberCtrl

List<MemberDTO> selectMemberByAgeLine(int ageLine);

 

(Eclipse)MemberCtrl

@Override
public List<MemberDTO> selectMemberByAgeLine(int ageLine) {
	List<MemberDTO> memberList = null;
		
	memberList = mbrdao.selectMemberByGender(ageLine);
	return memberList;

 

(Eclipse)InterMemberDAO

List<MemberDTO> selectMemberByGender(int ageLine);

 

(Eclipse)MemberDAO

@Override
public List<MemberDTO> selectMemberByGender(int ageLine) {
	List<MemberDTO> memberList = null;
		
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver");

		conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "myorauser", "eclass");

		String sql = "select no, userid, passwd, name, address\n"
				+ "     , substr(birthday, 1, 4) || '-' || substr(birthday, 5, 2) || '-' || substr(birthday, 7) AS birthday\n"
				+ "     , to_char(registerday, 'yyyy-mm-dd hh24:mi:ss') AS registerday\n" + "     , gender, point\n"
				+ "from jdbc_tbl_member\n" + "where status = 1 and "
				+ "trunc((extract(year from sysdate) - substr(birthday, 1, 4) + 1),-1) = ? \n"
				+ "order by no desc";

		pstmt = conn.prepareStatement(sql);
		pstmt.setInt(1, ageLine);

		rs = pstmt.executeQuery();

		int cnt = 0;
		while (rs.next()) {
			
			cnt++;
			if(cnt == 1)
			memberList = new ArrayList<MemberDTO>();
				
			int no = rs.getInt("no");
			String userid = rs.getString("userid");
			String passwd = rs.getString("passwd");
			String name = rs.getString("name");
			String address = rs.getString("address");
			String birthday = rs.getString("birthday");
			String registerday = rs.getString("registerday");
			int gender = rs.getInt("gender");
			int point = rs.getInt("point");

			MemberDTO mbrdto = new MemberDTO();
				
			mbrdto.setNo(no);
			mbrdto.setUserid(userid);
			mbrdto.setPasswd(passwd);
			mbrdto.setName(name);
			mbrdto.setAddress(address);
			mbrdto.setBirthday(birthday);
			mbrdto.setRegisterday(registerday);
			mbrdto.setGender(gender);
			mbrdto.setPoint(point);
			memberList.add(mbrdto);
		}
	} catch (ClassNotFoundException e) {
		System.out.println(">> ojdbc6.jar 파일이 없습니다. <<");
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		try {
			if (rs != null)
				rs.close();
			if (pstmt != null)
				pstmt.close();
			if (conn != null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	return memberList;
}

 


-- 5번, 6번, 7번은 모두 회원 정보를 가져오는 것이므로 비슷한 코드를 반복한다. 따라서 메소드로 만들어 재사용하도록 하자.

 

(Eclipse)MemberNBoardMainApp main method 밖

public static void printMemberInfo(List<MemberDTO> memberList) {
		System.out.println(
				"-----------------------------------------------------------------------------------------------------");
		System.out.println("아이디\t암호\t\t성명\t주소\t\t가입일자\t\t생년월일\t\t나이\t성별\t포인트");
		System.out.println(
				"-----------------------------------------------------------------------------------------------------");

		for (MemberDTO mbr : memberList) {
			System.out.println(mbr);
		}
		System.out.print("\n\n");
	}

 

-- 메소드 안 코드가 있던 자리에 원래 있던 코드를 제거하고 printMemberInfo(memberList); 를 넣는다.

 

 


 

8. 내 정보 수정1

 

(Eclipse)MemberNBoardMainApp

case "8": // 내 정보 수정
	if (loginuser == null) {
		System.out.println(">> 먼저 로그인하세요. <<");
		continue;
	} else {
		System.out.println("\n" + loginuser.showMemberInfo());
		n = mbrCtrl.updateMember(loginuser, sc);

		if (n == 1)
			System.out.println(">> 내 정보 수정하기 성공했습니다. <<");
		else {
			System.out.println(">> 내 정보 수정하기 실패 또는 취소했습니다. <<");
		}
	}
	break;

 

(Eclipse)InterMemberCtrl

int updateMember(MemberDTO loginuser, Scanner sc);

 

(Eclipse)MemberCtrl

@Override
public int updateMember(MemberDTO loginuser, Scanner sc) {
	int n = 0;
		
	System.out.print("▷ 암호 : ");
	String passwd = sc.nextLine();
		
	if(!"".equals(passwd.trim())) {
		loginuser.setPasswd(passwd);	
	}
		
	System.out.print("▷ 성명 : ");
	String name = sc.nextLine();
		
	if(!"".equals(name.trim())) {
		loginuser.setName(name);	
	}
		
		
	System.out.print("▷ 주소 : ");
	String address = sc.nextLine();

	if(!"".equals(address.trim())) {
		loginuser.setAddress(address);	
	}
		
	n = mbrdao.updateMember(loginuser, sc);
		
	
	return n;
}

 

(Eclipse)InterMemberDAO

int updateMember(MemberDTO loginuser, Scanner sc);

 

(Eclipse)MemberDAO

@Override
public int updateMember(MemberDTO loginuser, Scanner sc) {
	int result = 0;
		
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver");
			
		conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "myorauser", "eclass");
			
		conn.setAutoCommit(false);
			
		String sql = " update jdbc_tbl_member set passwd = ? "
				   + " , name = ? "
				   + " , address = ? "
				   + "where userid = ? ";
					   
			
		pstmt = conn.prepareStatement(sql);
			
		pstmt.setString(1, loginuser.getPasswd());
		pstmt.setString(2, loginuser.getName());
		pstmt.setString(3, loginuser.getAddress());
		pstmt.setString(4, loginuser.getUserid());
			
		result = pstmt.executeUpdate();
			
		do {
			System.out.print(">> 정말로 회원 정보 수정을 하시겠습니까? [Y/N] => ");
			String yn = sc.nextLine();

			if (result == 1 && ("Y".equals(yn) || "y".equals(yn))) {
				conn.commit();
				break;
			} else if (result == 1 && ("N".equals(yn) || "n".equals(yn))) {
				conn.rollback();
				result = 0;
				break;
			}
		} while (true);
			
	} catch (ClassNotFoundException e) {
		System.out.println(">> ojdbc6.jar 파일이 없습니다. <<");
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		try {
			if (pstmt != null) pstmt.close();
			if (conn != null) conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
		
	return result;
}

 


9. 내 정보 수정2

 

(Eclipse)MemberDAO

@Override
public int updateMember2(MemberDTO loginuser, Scanner sc) {
		
	int n = 0;
		
	System.out.print("▷ 암호 : ");
	String passwd = sc.nextLine();
		
	if("".equals(passwd.trim())) {
		passwd = loginuser.getPasswd();	
	}
		
	System.out.print("▷ 성명 : ");
	String name = sc.nextLine();
		
		
		
	System.out.print("▷ 주소 : ");
	String address = sc.nextLine();
		
	Map<String, String> paraMap = new HashMap<String, String>();
		
	paraMap.put("passwd", passwd);
	paraMap.put("name", name);
	paraMap.put("address", address);
	paraMap.put("userid", loginuser.getUserid());
		
	n = mbrdao.updateMember2(paraMap, sc);
		
	if(n==1) { // 사용자 정보 변경을 완료(성공)했다라면
		loginuser.setPasswd(passwd);
		loginuser.setName(name);
		loginuser.setAddress(address);
	}
		
	return n;
}

 

(Eclipse)InterMemberCtrl

int updateMember2(MemberDTO loginuser, Scanner sc);

 

(Eclipse)MemberCtrl

@Override
	public int updateMember2(MemberDTO loginuser, Scanner sc) {
		
		int n = 0;
		
		System.out.print("▷ 암호 : ");
		String passwd = sc.nextLine();
		
		System.out.print("▷ 성명 : ");
		String name = sc.nextLine();
		
		System.out.print("▷ 주소 : ");
		String address = sc.nextLine();
		
		Map<String, String> paraMap = new HashMap<String, String>();
		
		paraMap.put("passwd", passwd);
		paraMap.put("name", name);
		paraMap.put("address", address);
		paraMap.put("userid", loginuser.getUserid());
		
		n = mbrdao.updateMember2(paraMap, sc);
		
		if(n==1) { // 사용자 정보 변경을 완료(성공)했다라면
			loginuser.setPasswd(passwd);
			loginuser.setName(name);
			loginuser.setAddress(address);
		}
		
		return n;
	}

 

(Eclipse)InterMemberDAO

int updateMember2(Map<String, String> paraMap, Scanner sc);

 

(Eclipse)MemberDAO

@Override
	public int updateMember2(Map<String, String> paraMap, Scanner sc) {
		
		int result = 0;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "myorauser", "eclass");

			conn.setAutoCommit(false);

			String sql = " update jdbc_tbl_member set passwd = ? " + " , name = ? " + " , address = ? "
					+ "where userid = ? ";

			pstmt = conn.prepareStatement(sql);

				
			pstmt.setString(1, paraMap.get("passwd"));
			pstmt.setString(2, paraMap.get("name"));
			pstmt.setString(3, paraMap.get("address"));
			pstmt.setString(4, paraMap.get("userid"));
			


			result = pstmt.executeUpdate();
		
			do {
				System.out.print(">> 정말로 회원 정보 수정을 하시겠습니까? [Y/N] => ");
				String yn = sc.nextLine();

				if (result == 1 && ("Y".equals(yn) || "y".equals(yn))) {
					conn.commit();
					break;
				} else if (result == 1 && ("N".equals(yn) || "n".equals(yn))) {
					conn.rollback();
					result = 0;
					break;
				}
			} while (true);

		} catch (ClassNotFoundException e) {
			System.out.println(">> ojdbc6.jar 파일이 없습니다. <<");
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return result;
	}

 


과제1 ▷ 9. 내 정보 수정2의 경우 8. 내 정보 수정1과 달리 name 값 등을 null로 입력하면 오류가 발생한다. 오류가 발생하지 않도록 고쳐 보자.

 

(Eclipse)MemberCtrl

@Override
public int updateMember2(MemberDTO loginuser, Scanner sc) {
		
	int n = 0;
		
	System.out.print("▷ 암호 : ");
	String passwd = sc.nextLine();
		
	if("".equals(passwd.trim())) {
		passwd = loginuser.getPasswd();	
	}
		
	System.out.print("▷ 성명 : ");
	String name = sc.nextLine();
		
	if("".equals(name.trim())) {
		name = loginuser.getName();	
	}
		
	System.out.print("▷ 주소 : ");
	String address = sc.nextLine();
		
	if("".equals(address.trim())) {
		address = loginuser.getAddress();	
	}

 


 

과제2 ▷▷ 10. 회원 탈퇴를 만들어 보자.

 

(Eclipse)MemberNBoardMainApp

case "10": // 회원 탈퇴
		if(loginuser == null) {
			System.out.println(">> 먼저 로그인 하세요. <<");
		} else {
			n = mbrCtrl.deleteMember(loginuser, sc);
					
			if(n == 1) {
				System.out.println(">> 회원 탈퇴를 성공했습니다. <<");
				loginuser = null;
			}
			else
				System.out.println(">> 회원 탈퇴를 실패 또는 취소했습니다. <<");
		}
		break;

case "100": // 프로그램 종료

		break;

default:
		System.out.println(">> 메뉴에 없는 번호를 선택하셨습니다. \n");
		break;
	}

} while (!"100".equals(strMenuNo));

	System.out.println(">>> 프로그램을 종료합니다. <<<");
	sc.close();
}

 

(Eclipse)InterMemberCtrl

int deleteMember(MemberDTO loginuser, Scanner sc);

 

(Eclipse)MemberCtrl

@Override
public int deleteMember(MemberDTO loginuser, Scanner sc) {
	int n = 0;
		
	System.out.print("▷ 아이디 : ");
	String userid = sc.nextLine();
		
	System.out.print("▷ 암호 : ");
	String passwd = sc.nextLine();
		
	if(loginuser.getUserid().equals(userid) && loginuser.getPasswd().equals(passwd)) {
		n = mbrdao.deleteMember(loginuser, sc);
	}
	else
		System.out.println(">> 아이디와 암호가 일치해야 탈퇴할 수 있습니다. <<");
		
		
	return n;

}

 

(Eclipse)InterMemberDAO

int deleteMember(MemberDTO loginuser, Scanner sc);

 

(Eclipse)MemberDAO

@Override
public int deleteMember(MemberDTO loginuser, Scanner sc) {
	int result = 0;
		
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver");
			
		conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "myorauser", "eclass");
			
		conn.setAutoCommit(false);
			
		String sql = "delete from jdbc_tbl_member\n"+
					 "where userid = ? ";
			
		pstmt = conn.prepareStatement(sql);
			
		pstmt.setString(1, loginuser.getUserid());
			
		result = pstmt.executeUpdate();
			
		do {
			System.out.print(">> 정말로 회원 탈퇴를 하시겠습니까? [Y/N] => ");
			String yn = sc.nextLine();

			if (result == 1 && ("Y".equals(yn) || "y".equals(yn))) {
				conn.commit();
				break;
			} else if (result == 1 && ("N".equals(yn) || "n".equals(yn))) {
				conn.rollback();
				result = 0;
				break;
			}
		} while (true);
			
	} catch (ClassNotFoundException e) {
		System.out.println(">> ojdbc6.jar 파일이 없습니다. <<");
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		try {
			if (pstmt != null) pstmt.close();
			if (conn != null) conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	return result;
}