🔷JDBC - DAO 작성 및 구현클래스 작성(paging,isEnableEmail(email/ id,email))
- 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> getMembersByPaging(int page, int limit) { // 리턴(반환값) 처리 List<MemberVo> members = new ArrayList<>(); // 개별 회원정보 객체 선언 MemberVo member = null; // 실행 메서드명 String methodName = new Exception().getStackTrace()[0].getMethodName(); // DB 연결 Connection con = DbUtil.connect(); // SQL 처리 객체 PreparedStatement pstmt = null; // 결과셋 객체 ResultSet rs = null; // SQL 구문 // 1) // String sql = "SELECT * " + // "FROM (SELECT ROWNUM, " + // " m.*, " + // " FLOOR((ROWNUM - 1) / ? + 1) page " + // " FROM (" + // " SELECT * FROM member " + // " ORDER BY member_id ASC " + // " ) m " + // " ) " + // "WHERE page = ?"; // // 2) StringBuilder sb = new StringBuilder(); sb.append("SELECT * ") .append("FROM (SELECT ROWNUM,") .append(" m.*,") .append(" FLOOR((ROWNUM - 1) / ? + 1) page ") .append(" FROM ( ") .append(" SELECT * FROM member ") .append(" ORDER BY member_id ASC ") .append(" ) m ") .append(" ) ") .append("WHERE page = ?"); // SQL, 인자 (선)처리 try { // pstmt = con.prepareStatement(sql); // 1) pstmt = con.prepareStatement(sb.toString()); // 2) // 내가 작성한것 // pstmt.setInt(1,page); // pstmt.setInt(2,limit); pstmt.setInt(1, limit); // 한 페이지당 출력 인원 수 pstmt.setInt(2, page); // 현재 페이지 // SQL 결과셋 객체 생성 rs = pstmt.executeQuery(); while(rs.next()) { member = new MemberVo(); // 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); } } catch (SQLException e) { System.out.println(methodName + " : " + e.getMessage()); // 자원 반납 }finally { DbUtil.close(con, pstmt, rs); } // 리턴(반환) return members; } @Override public boolean isEnableEmail(String memberEmail) { // 리턴(반환값) 처리 boolean result = false; // 실행 메서드명 String methodName = new Exception().getStackTrace()[0].getMethodName(); // DB 연결 Connection con = DbUtil.connect(); // SQL 처리 객체 PreparedStatement pstmt = null; // 결과셋 객체 (DOL : select) ResultSet rs = null; // SQL 구문 // 내가 작성한거 // String sql = "SELECT count(*) FROM member " + // "WHERE member_email = ? "; // 1) // String sql = "SELECT DECODE(count(*), 0, 'true', 1, 'false') as email_flag " // + "FROM member " // + "WHERE member_email = ? "; // 2) String sql = "SELECT count(*) FROM member " + "WHERE member_email = ? "; // SQL, 인자 (선)처리 try { pstmt = con.prepareStatement(sql); pstmt.setString(1, memberEmail); // SQL 결과셋 객체 생성 rs = pstmt.executeQuery(); // SQL 실행, 예외처리 // 1) // if(rs.next()) { // // boolean으로 형변환 // // result = Boolean.valueOf(rs.getString(1)); //(O) // // result = new Boolean(rs.getString(1)); // (O) // result = new Boolean(rs.getString("email_flag")); // } // 2) if(rs.next()) { result = rs.getInt(1) == 1 ? false : true; } // 내가 작성한 코드 // while(rs.next()) { // result = rs.getBoolean(1)== false ? false:true; // } } catch (SQLException e) { System.out.println(methodName + " : " + e.getMessage()); // 자원 반납 }finally { DbUtil.close(con, pstmt, rs); } // 리턴(반환) return result; } @Override public boolean isEnableEmail(String memberId, String memberEmail) { // 리턴(반환값) 처리 boolean result = false; // 실행 메서드명 String methodName = new Exception().getStackTrace()[0].getMethodName(); // DB 연결 Connection con = DbUtil.connect(); // SQL 처리 객체 PreparedStatement pstmt = null; // 결과셋 객체 (DOL : select) ResultSet rs = null; // SQL 구문 // 내가 작성한거 String sql = "SELECT count(*) FROM member " + "WHERE member_id != ? AND member_email = ? "; // String sql = "SELECT DECODE(count(*), 0, 'true', 1, 'false') as email_flag " // + "FROM member " // + "WHERE memberid != ? AND member_email = ? "; // // SQL, 인자 (선)처리 try { pstmt = con.prepareStatement(sql); pstmt.setString(1,memberId); pstmt.setString(2, memberEmail); // SQL 결과셋 객체 생성 rs = pstmt.executeQuery(); // SQL 실행, 예외처리 if(rs.next()) { result = rs.getInt(1) == 0 ? true : false; }else { result = false; } } catch (SQLException e) { System.out.println(methodName + " : " + e.getMessage()); // 자원 반납 }finally { DbUtil.close(con, pstmt, rs); } // 리턴(반환) return result; }
-
getMemberByPaging 테스트 클래스
package com.javateam.jdbc.member.test; 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; /** * getMembersByPaging 단위 테스트 케이스<br> * : 페이징 단위로 전체 회원정보 조회 테스트<br><br> * * @author migki * */ public class PagingTest { public static void main(String[] args) { // DAO 객체 생성 MemberDao dao= MemberDaoImpl.getInstance(); // 페이징에 따른 테스트 기대값 // 1) 특정 페이지 입력시 인원수 - 한페이지당 인원수 10명 제한 // 2) 처음/마지막 인원 회원 아이디 정보로 점검 // ex) 1 페이지 첫 아이디 = goodee_1001, 마지막 아이디 = goodee_1010 List<MemberVo> members = dao.getMembersByPaging(1, 10); // 1) 특정 페이지 입력시 인원수 - 한페이지당 인원수 10명 제한 System.out.println("특정 페이지 입력시 인원수 : " + members.size()); // 2) 처음/마지막 인원 회원 아이디 정보로 점검 // ex) 1 페이지 첫 아이디 = goodee_1001, 마지막 아이디 = goodee_1010 System.out.println("처음 인원 회원 아이디 정보로 점검 : " + members.get(0).getMemberId().equals("goodee_1001")); System.out.println("마지막 인원 회원 아이디 정보로 점검 : " + members.get(9).getMemberId().equals("goodee_1010")); // 특정 페이지 전체 인원 출력 for(MemberVo m : members) { System.out.println(m); } // 내가 작성한코드 //System.out.println(dao.getMembersByPaging(1,10 )); } }
▶ 출력 화면
- isEnableEmail(memberEmail) 테스트 클래스
package com.javateam.jdbc.member.test; import com.javateam.jdbc.member.dao.MemberDao; import com.javateam.jdbc.member.dao.Impl.MemberDaoImpl; /** * isEnableEmail 단위 테스트 케이스<br> * : 이메일 중복 점검 테스트<br><br> * * @author migki * */ public class isEnableEmailTest { public static void main(String[] args) { // DAO 객체 생성 MemberDao dao = MemberDaoImpl.getInstance(); // 존재하는 아이디와 존재하지 않는 이메일 두가지 경우를 테스트 // 1) DB 현황에 존재하는 이메일 로 점검 System.out.println("회원 이메일 존재 여부(goodee_1@abcd.com): " + dao.isEnableEmail("goodee_1@abcd.com")); // 2) DB 현황에 존재하지 않는 이메일 점검 System.out.println("회원 이메일 존재 여부(1234) : " + dao.isEnableEmail("1234")); } }
▶ 출력 화면
🎈 존재하는경우 false가 출력되도록 한 이유 : 중복된 이메일이므로 사용할 수 없기 때문
- isEnableEmail(memberId, memberEmail) 테스트 클래스
package com.javateam.jdbc.member.test; import com.javateam.jdbc.member.dao.MemberDao; import com.javateam.jdbc.member.dao.Impl.MemberDaoImpl; /** * isEnableEmail(id, email) 단위 테스트 케이스<br> * : 이메일 중복 점검 테스트<br><br> * * @author migki * */ public class isEnableEmailTest2 { public static void main(String[] args) { // DAO 객체 생성 MemberDao dao = MemberDaoImpl.getInstance(); System.out.println("회원 ID 존재, 본인의 Email 존재 : " + dao.isEnableEmail("hyun", "skfksnsk1@gmail.com")); System.out.println("회원 ID 존재, Email 존재X : " + dao.isEnableEmail("hyun", "skfksn@gmail.com")); System.out.println("회원 ID 존재, 다른회원 mail 존재: " + dao.isEnableEmail("hyun", "goodee_2@abcd.com")); } }
▶ 출력 화면