명함관리
지금까지의 예제를 종합하여 명함관리 프로그램을 만들어 보자.
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();
}
}
