명함관리

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

}