🔷JDBC 프로그래밍 - DAO 작성 및 구현클래스 작성(getAll, get, delete)
- DAO 구현클래스 작성
package com.javateam.jdbc.member.dao.Impl; 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 com.javateam.jdbc.member.dao.MemberDao; import com.javateam.jdbc.member.domain.MemberVo; import com.javateam.jdbc.member.util.DbUtil; /** * MemberDao의 구현 클래스(concrete class)<br><br> * * * 용례) MemberDao dao = MemberdaoImpl.getInstance();<br> * : 싱클턴(singleton:독신자) 패턴 적용 → 보안<br><br> * * @author mingki * */ public class MemberDaoImpl implements MemberDao { /** DAO 객체 : 싱클턴(singleton) 생성 패턴 적용*/ private static MemberDaoImpl instance = null; private MemberDaoImpl() {} /** * 싱글턴 객체(DAO singleton object) 생성 메서드 * * @return DAO 객체 */ public static final MemberDaoImpl getInstance() { // final : 오버라이드 금지 if(instance == null) { instance = new MemberDaoImpl(); } return instance; } @Override public List<MemberVo> getAllMembers() { // 리턴(반환값) 처리 List<MemberVo> members = new ArrayList<>(); // List 사용 // 개별 회원정보 객체 선언 MemberVo member = null; // 실행 메서드명 String methodName = new Exception().getStackTrace()[0].getMethodName(); // DB 연결 Connection con = DbUtil.connect(); // SQL 처리 객체 PreparedStatement pstmt = null; // SQL 결과셋 객체(DQL:select) ResultSet rs = null; // SQL 구문 String sql = "SELECT * FRom member"; try { // SQL 처리 pstmt = con.prepareStatement(sql); // SQL 결과셋 객체 생성 rs = pstmt.executeQuery(); // next() : 결과셋에서 다음 행을 조회하는 방식(iterator) while(rs.next()) { // 개별 회원정보 생성 // 주의) VO 객체 이 구문에서 선언 => 특정 개별 회원들만 여러행 출력된다 (안좋다) // => 대책 : VO 객체 외부에서 선언한다 -> 리턴처리문 아래에 선언(MemberVo member = null;) // MemberVo member = new MemberVo(); //=> 한명이 여러번 나오는 버그 발생 member = new MemberVo(); // (O) // SQL 결과셋 -> VO에 이관 member.setMemberId(rs.getString("member_Id")); member.setMemberPassword(rs.getString("member_Password")); member.setMemberNicname(rs.getString("member_Nickname")); member.setMemberName(rs.getString("member_Name")); member.setMemberGender(rs.getString("member_Gender").charAt(0)); // char로 변환 member.setMemberEmail(rs.getString("member_Email")); member.setMemberPhone(rs.getString("member_Phone")); member.setMemberBirth(rs.getDate("member_Birth")); member.setMemberZip(rs.getString("member_Zip")); member.setMemberAddressBasic(rs.getString("member_Address_Basic")); member.setMemberAddressDetail(rs.getString("member_Address_Detail")); member.setMemberJoindate(rs.getDate("member_JoinDate")); // VO -> List 로 이관(add) : 개별 회원정보 추가 members.add(member); } // SQL 실행, 예외처리 }catch(SQLException e) { System.out.println(methodName + " : " + e.getMessage()); } finally { // 자원 반납 DbUtil.close(con, pstmt, rs); } // 리턴(반환) return members ; } @Override public MemberVo getMember(String memberId) { // 리턴(반환값) 처리 MemberVo member = new MemberVo(); // 실행 메서드명 String methodName = new Exception().getStackTrace()[0].getMethodName(); // DB 연결 Connection con = DbUtil.connect(); // SQL 처리 객체 PreparedStatement pstmt = null; // SQL 결과셋 객체(DQL : select) ResultSet rs = null; // SQL 구문 String sql = "SELECT * FROM member WHERE member_id= ? "; // SQL, 인자 (선)처리, SQL 실행, 예외처리 try { pstmt = con.prepareStatement(sql); pstmt.setString(1, memberId); rs = pstmt.executeQuery(); // 한줄 나오기때문에 while문 안써도됨 if(rs.next()) { member.setMemberId(rs.getString("member_Id")); member.setMemberPassword(rs.getString("member_Password")); member.setMemberNicname(rs.getString("member_Nickname")); member.setMemberName(rs.getString("member_Name")); member.setMemberGender(rs.getString("member_Gender").charAt(0)); // char로 변환 member.setMemberEmail(rs.getString("member_Email")); member.setMemberPhone(rs.getString("member_Phone")); member.setMemberBirth(rs.getDate("member_Birth")); member.setMemberZip(rs.getString("member_Zip")); member.setMemberAddressBasic(rs.getString("member_Address_Basic")); member.setMemberAddressDetail(rs.getString("member_Address_Detail")); member.setMemberJoindate(rs.getDate("member_JoinDate")); } }catch(SQLException e) { System.out.println(methodName + " : " + e.getMessage()); }finally { // 자원 반납 DbUtil.close(con, pstmt, rs); } // 리턴(반환) return member; } @Override public boolean deleteMember(String memberId) { // 리턴(반환값) 처리 boolean result = false; // 실행 메서드명 String MethodName = new Exception().getStackTrace()[0].getMethodName(); // DB 연결 Connection con = DbUtil.connect(); // SQL 처리 객체 PreparedStatement pstmt = null; // SQL 구문 String sql = "DELETE member WHERE member_id=?"; // SQL, 인자 (선)처리 try { pstmt = con.prepareStatement(sql); pstmt.setString(1, memberId); if(pstmt.executeUpdate()==1) { System.out.println("회원정보 삭제가 완료 되었습니다"); result = true; }else { System.out.println("회원정보 삭제에 실패하였습니다"); } // SQL 실행, 예외처리 }catch(SQLException e) { System.out.println(MethodName + " : " + "회원정보 삭제시 예외 발생"); System.out.println(MethodName + " : " + e.getMessage()); } finally { // 자원 반납 DbUtil.close(con, pstmt, null); } // 리턴(반환) return result; } }
-
getAllMembers 테스트 클래스
package com.javateam.jdbc.member.test; import java.util.ArrayList; import java.util.List; import com.javateam.jdbc.member.dao.MemberDao; import com.javateam.jdbc.member.dao.Impl.MemberDaoImpl; import com.javateam.jdbc.member.domain.MemberVo; /** * getAllMembers 메서드 단위 테스트 케이스(Unit TestCase)<br><br> * : 전체 회원정보 조회<br><br> * * @author mingki * */ public class AllMembersTest { public static int getCountByWord(List<String> list, String id) { int count = 0; for (int i=0; i<list.size(); i++) { if (list.get(i).contentEquals(id)) { count++; } } return count; } public static void main(String[] args) { // DAO 객체 생성 MemberDao dao = MemberDaoImpl.getInstance(); // 인원수 확인 System.out.println("인원수 확인 : " + (dao.getAllMembers().size()==8 ? true: false)); // 테스트 케이스 점검 사항 // 중복행 출력 여부 점검 // 각 행에 대한 회원 아이디를 중복성 점검 List<String> ids = new ArrayList<>(); // 전체 현황 확인 for (MemberVo m : dao.getAllMembers()) { // System.out.println(m); ids.add(m.getMemberId()); } List<MemberVo> list = dao.getAllMembers(); // id 중복여부 출력 for(int i=0; i<list.size();i++) { String id = list.get(i).getMemberId(); System.out.println(id + ":" + getCountByWord(ids,id)); } } }
▶ 출력 화면
▶ DB
- getMember 테스트 클래스
package com.javateam.jdbc.member.test; import java.sql.Date; import com.javateam.jdbc.member.dao.MemberDao; import com.javateam.jdbc.member.dao.Impl.MemberDaoImpl; import com.javateam.jdbc.member.domain.MemberVo; /** * getMember 메서드 단위 테크스 케이스<br> * : 개별 회원 정보 조회<br><br> * * @author migki * */ public class GetMemberTest { public static void main(String[] args) { // DAO 객체 생성 MemberDao dao= MemberDaoImpl.getInstance(); // DB에 입력된 값들과 VO 값을 비교 // 비교대상 VO 준비 MemberVo member = new MemberVo(); member.setMemberId("java5555"); member.setMemberPassword("1234"); member.setMemberNicname("구디샘"); member.setMemberName("홍길동"); member.setMemberGender('m'); member.setMemberEmail("abcd@abcd.com"); member.setMemberPhone("010-1234-5678"); member.setMemberBirth(Date.valueOf("2016-02-05")); member.setMemberZip("12345"); member.setMemberAddressBasic("서울 금천 가산"); member.setMemberAddressDetail("구디아카데미"); // 날짜 입력 member.setMemberJoindate(Date.valueOf("2021-03-12")); System.out.println(member); System.out.println(dao.getMember("java5555")); System.out.println(member.hashCode()); System.out.println(dao.getMember("java5555").hashCode()); String result = member.equals(dao.getMember("java5555"))? "회원정보 조회 성공" : "회원정보 조회 실패"; System.out.println(result); } }
▶ 출력 화면
- Delete 테스트 클래스
package com.javateam.jdbc.member.test; import java.sql.Date; import com.javateam.jdbc.member.dao.MemberDao; import com.javateam.jdbc.member.dao.Impl.MemberDaoImpl; import com.javateam.jdbc.member.domain.MemberVo; /** * DeleteMember 메서드 단위 테스트(Unit Test Case) <br> * : 회원정보 삭제 테스트<br><br> * * @author mingki * */ public class DeleteMemberTest { private static String memberId; public static void main(String[] args) { // DAO 객체 생성 MemberDao dao = MemberDaoImpl.getInstance(); // UpdateMember 테스트(true/false) String result = dao.deleteMember("java12345") == true ? "삭제 성공" : "삭제 실패"; System.out.println("DeleteMember 테스트 결과 " + result); } }
▶ 출력 화면
▶ DB