명함관리
지금까지의 예제를 종합하여 명함관리 프로그램을 만들어 보자.
Namecard.java 와 NamecardDao.java 클래스를 아래와 같이 만든다.
Namecard.java
package net.java_school.namecard; public class Namecard { private int no; private String name; private String mobile; private String email; private String company; public Namecard() {} public Namecard(String name, String mobile, String email, String company) { this.name = name; this.mobile = mobile; this.email = email; this.company = company; } public Namecard(int no, String name, String mobile, String email, String company) { this.no = no; this.name = name; this.mobile = mobile; this.email = email; this.company = company; } public int getNo() { return no; } public void setNo(int no) { this.no = no; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getCompany() { return company; } public void setCompany(String company) { this.company = company; } public String toString() { StringBuilder sb = new StringBuilder(); sb.append("[번호: "); sb.append(no); sb.append("] "); sb.append(name); sb.append(" ,휴대폰: "); sb.append(mobile); sb.append(" ,이메일: "); sb.append(email); sb.append(" ,회사: "); sb.append(company); return sb.toString(); } }
NamecardDao.java
package net.java_school.namecard; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; public class NamecardDao { static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE"; static final String USER = "scott"; static final String PASSWORD = "tiger"; //생성자에서 JDBC 드라이버 로딩 public NamecardDao() { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //커넥션 얻기 private Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } //자원 반환 private void close(ResultSet rs, PreparedStatement pstmt, Connection con) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } //명함 추가하기 public void insert(Namecard card) { Connection con = null; PreparedStatement pstmt = null; //순서 name,mobile,email,company String sql = "INSERT INTO namecard VALUES " + "(seq_namecard_no.nextval, ?, ?, ?, ?)"; try { con = getConnection(); pstmt = con.prepareStatement(sql); pstmt.setString(1, card.getName()); pstmt.setString(2, card.getMobile()); pstmt.setString(3, card.getEmail()); pstmt.setString(4, card.getCompany()); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); System.out.println(sql); } finally { close(null, pstmt, con); } } //명함 삭제하기 public void delete(int no) { //TODO } //명함찾기(번호) public Namecard selectOne(int no) { return null; } //명함찾기(키워드) public ArrayList<Namecard> selectByKeyword(String keyword) { ArrayList<Namecard> matched = new ArrayList<Namecard>(); //TODO return matched; } //모든 명함 출력하기 public ArrayList<Namecard> selectAll() { ArrayList<Namecard> all = new ArrayList<Namecard>(); //TODO return all; } //명함 수정하기 public void update(Namecard card) { //TODO } }
NamecardDao.java 는 아직 완성되지 않은 상태이다.
NamecardDao.java 의 //TODO 부분을 완성한다.
NamecardDao 클래스의 모든 메소드를 구현했다면 테스트를 위한 클래스를 만든다.
Test.java
package net.java_school.namecard; import java.util.ArrayList; public class Test { public static void main(String[] args) { NamecardDao dao = new NamecardDao(); //1.insert(Namecard)테스트: 명함 추가하기 Namecard hong = new Namecard("임꺽정","011-1111-1111", "imkkukjung@gmail.org", "산적"); dao.insert(hong); //실행 후 SQLPLUS에서 확인한다. /* //2.selectAll()테스트: 모든 명함정보를 출력하기 ArrayList<Namecard> list = dao.selectAll(); int size = list.size(); for ( int i = 0; i < size; i++ ) { Namecard namecard = list.get(i); System.out.println(namecard); } */ /* //3.selectByKeyword(String)테스트: 검색어로 명함찾기 ArrayList<Namecard> matched = dao.selectByKeyword("임꺽정"); int length = matched.size(); for ( int i = 0; i < length; i++ ) { Namecard namecard = matched.get(i); System.out.println(namecard); } */ /* //4.selectOne(int) 테스트 : 명함번호로 명함 찾기 Namecard card = dao.selectOne(1); System.out.println(card); */ /* //5.delete(int) 테스트 : 명함삭제하기 dao.delete(1); ArrayList<Namecard> all = dao.selectAll(); int cardNum = all.size(); for (int i = 0; i < cardNum; i++) { Namecard namecard = all.get(i); System.out.println(namecard); } */ /* //6. update(Namecard) 테스트 : 명함 수정하기 Namecard card = dao.selectOne(3); System.out.println(card); card.setEmail("kimchi@ggmail.org"); card.setMobile("010-8888-7777"); dao.update(card); */ } //메인 메소드 끝 }
NamecardDao의 insert() 메소드부터 테스트한다.
Test를 실행하여 임꺽정 정보가 삽입되는지는 SQL*PLUS에 접속하여 확인한다.
JDBC 프로그램을 실행할 때는 SQL*PLUS는 종료되어 있어야 한다.
왜냐하면 JDBC와 SQL*PLUS의 커밋모드가 달라 병목현상 발생할 수 있기 때문이다.
Test의 메인 메소드에서 테스트항목에 붙인 번호대로 테스트한다.
테스트할때는 주석번호외에 다른 번호의 테스트는 주석처리하여 테스트한다.
예를 들어 2번을 테스트할 때는 1,3,4,5,6 은 주석처리된 상태여야 한다.
테스트를 마쳤다면 사용자 Ui를 담당할 클래스를 만들어 프로그램을 마무리하자.
Ui클래스를 만들때 생각의 전환이 필요하다.
데이터베이스를 이용한다면 명함 객체를 배열이나 ArrayList에 저장하여 유지할 필요가 없다.
NamecardUi.java
package net.java_school.namecard; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; public class NamecardUi { private NamecardDao dao = new NamecardDao(); public NamecardUi() {} private String readCommandLine() throws IOException { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String input = br.readLine(); return input; } public void showMenu() { String menu = null; do { System.out.println("메뉴를 선택하세요"); System.out.println("1.명함등록"); System.out.println("2.명함목록"); System.out.println("3.명함삭제"); System.out.println("4.명함수정"); System.out.println("5.명함검색"); System.out.println("q.종료"); try { menu = readCommandLine(); if (menu.equals("1")) { System.out.println("이름을 입력하세요>>"); String name = readCommandLine(); System.out.println("휴대폰을 입력하세요>>"); String mobile = readCommandLine(); System.out.println("이메일을 입력하세요>>"); String email = readCommandLine(); System.out.println("소속을 입력하세요>>"); String company = readCommandLine(); Namecard card = new Namecard(name,mobile,email,company); dao.insert(card); } else if (menu.equals("2")) { ArrayList<Namecard> all = dao.selectAll(); for(int i = 0; i < all.size(); i++) { System.out.println(all.get(i)); } } else if (menu.equals("3")) { System.out.println("삭제할 이름을 입력하세요>>"); String name = readCommandLine(); ArrayList<Namecard> matched = dao.selectByKeyword(name); if (matched.size() > 0) { for (int i = 0; i < matched.size(); i++) { System.out.println(matched.get(i)); } System.out.println("삭제할 번호를 선택하세요>>"); int id = Integer.parseInt(readCommandLine()); dao.delete(id); } } else if (menu.equals("4")) { System.out.println("수정할 명함의 이름을 입력하세요>>"); String name = readCommandLine(); ArrayList<Namecard> matched = dao.selectByKeyword(name); if (matched.size() > 0) { for (int i = 0; i < matched.size(); i++) { System.out.println(matched.get(i)); } System.out.println("수정할 명함번호를 입력하세요>>"); int id = Integer.parseInt(readCommandLine()); Namecard card = dao.selectOne(id); System.out.println("이름을 수정하려면 입력하세요>>"); name = readCommandLine(); if (!name.equals("")) { card.setName(name); } System.out.println("휴대폰을 수정하려면 입력하세요>>"); String mobile = readCommandLine(); if (!mobile.equals("")) { card.setMobile(mobile); } System.out.println("이메일을 수정하려면 입력하세요>>"); String email = readCommandLine(); if (!email.equals("")) { card.setEmail(email); } System.out.println("소속을 수정하려면 입력하세요>>"); String company = readCommandLine(); if (!company.equals("")) { card.setCompany(company); } dao.update(card); } } else if (menu.equals("5")) { System.out.println("검색할 이름을 입력하세요>>"); String name = readCommandLine(); ArrayList<Namecard> matched = dao.selectByKeyword(name); for(int i = 0; i < matched.size(); i++) { System.out.println(matched.get(i)); } } } catch (Exception e) { System.out.println(e.getMessage()); } } while(!menu.equals("q")); } public static void main(String[] args) { new NamecardUi().showMenu(); } }