Last Modified : 2012.02.28

명함관리

명함을 관리하는 프로그램을 자바로 구현하겠습니다.
먼저 아래를 이용해서 scott계정에 NAMECARDS 테이블과 시퀀스를 만듭니다.

create table namecards (
    no  number,                       -- 고유번호
    name    varchar2(20) NOT NULL,    -- 이름
    mobile  varchar2(20) NOT NULL,	  -- 손전화
    email   varchar2(30),             -- 이메일
    mdate   date,                     -- 만난 날짜
    constraint namecards_no_pk primary key(no)
)
/
 
create sequence seq_namecards_no
start with 1
increment by 1
nocache
nocycle
/

Namecard.java 와 NamecardManager.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 mdate;
	
	public Namecard() {}
	
	public Namecard(String name, String mobile, String email, String mdate) {
		this.name = name;
		this.mobile = mobile;
		this.email = email;
		this.mdate = mdate;
	}
	
	public Namecard(int no, String name, String mobile, String email, String mdate) {
		this.no = no;
		this.name = name;
		this.mobile = mobile;
		this.email = email;
		this.mdate = mdate;
	}
	
	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 getMdate() {
		return mdate;
	}
	public void setMdate(String mdate) {
		this.mdate = mdate;
	}
	
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("[번호 : ");
		sb.append(no);
		sb.append("] ");
		sb.append(name);
		sb.append(" ,손전화 : ");
		sb.append(mobile);
		sb.append(" ,이메일 : ");
		sb.append(email);
		sb.append(" ,만난날자 : ");
		sb.append(mdate);
		
		return sb.toString();
	}
	
}

NamecardManager.java 는 모두 구현된 것이 아닙니다.
addCard() 메소드를 참고하여 //TODO 부분을 구현해 보시기 바랍니다.

NamecardManager.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 NamecardManager {
	
	private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
	private static final String USER = "scott";
	private static final String PASSWORD = "tiger";
	
	public NamecardManager() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public Connection getConnection() throws SQLException {
		Connection con = DriverManager.getConnection(URL, USER, PASSWORD);
		return con;
	}
	
	//명함 추가하기	
	public void addCard(Namecard card) {
		Connection con = null;
		PreparedStatement pstmt = null;
		//순서 name,mobile,email,mdate
		String sql = "INSERT INTO namecards VALUES (seq_namecards_no.nextval, ?, ?, ?, to_date(?, 'YYYY/MM/DD') )";

		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.getMdate());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println(sql);
		} finally {
			try {
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	//명함 삭제하기	
	public void deleteCard(int no) {
		//TODO
	}
	
	//번호로 명함찾기
	public Namecard getCard(int no) {
		Namecard card = null;
		//TODO		
		return card;
	}
	
	//이름으로 명함찾기
	public ArrayList<Namecard> findCard(String name) {
		ArrayList<Namecard> searchCards = new ArrayList<Namecard>();
		//TODO		
		return searchCards;
	}
	
	//모든 명함 출력하기
	public ArrayList<Namecard> getCards() {
		ArrayList<Namecard> cards = new ArrayList<Namecard>();
		//TODO		
		return cards;
	}
	
	//명함 수정하기
	public void updateCard(Namecard card) {
		//TODO
	}

}

Namecard 와 NamecardManager 두 클래스를 테스트하기 위해, 메인 메소드가 있는 Test 클래스를 아래 처럼 만듭니다.

Test.java

package net.java_school.namecard;

import java.util.ArrayList;

public class Test {

	public static void main(String[] args) {
		NamecardManager mgr = new NamecardManager();
		//1.addCard()테스트: 명함 추가하기
		Namecard hong = new Namecard("홍길동","010-1234-5678", "hong@gmail.com", "2011/09/07");
		mgr.addCard(hong); //실행 후 SQLPLUS에서 확인한다.


/* 
		//2.addCards()테스트: 모든 명함정보를 출력하기 
		ArrayList<Namecard> list = mgr.getCards();
		int size = list.size();
		for ( int i = 0; i < size; i++ ) {
			Namecard namecard = list.get(i);
			System.out.println(namecard);
		}
*/


/* 
		//3.findCard()테스트: 이름으로 명함찾기
		ArrayList<Namecard> search = mgr.findCard("홍길동");
		int length = search.size();
		for ( int i = 0; i < length; i++ ) {
			Namecard namecard = search.get(i);
			System.out.println(namecard);
		}
*/


/* 
		//4.getCard() 테스트 : 명함번호로 명함 찾기
		Namecard card = mgr.getCard(1);//홍길동의 명함번호가 1이라면(3번테스트에서 또는 SQLPLUS에서 확인 후 테스트)
		System.out.println(card);
*/


/* 
		5.deleteCard() 테스트 : 명함삭제하기 
		mgr.deleteCard(1);
		ArrayList<Namecard> all = mgr.getCards();
		int cardNum = all.size();
		for ( int i = 0; i < cardNum; i++ ) {
			Namecard namecard = all.get(i);
			System.out.println(namecard);
		}
*/	

/*		//6. updateCard() 테스트 : 명함 수정하기
		Namecard card = mgr.getCard(3);
		System.out.println(card);
		card.setEmail("kimchi@ggmail.org");
		card.setMobile("010-8888-7777");
		mgr.updateCard(card);
*/
	
	}

}

NamecardManager 의 addCard() 메소드는 이미 구현되어 있습니다.
2번부터 차례로 구현하고 주석을 풀어 테스트합니다.
테스트를 모두 마쳤다면 명함관리에서처럼 NamecardUI.java 를 지금의 예제에 적용해 보도록 구현하겠습니다.
이때 생각의 전환이 필요합니다.
자바 기초 과정에서의 명함관리예제는 생성된 객체를 배열이나 ArrayList에 저장하고 관리했습니다.
하지만 여기서처럼 데이터베이스와 연동한다면 객체 정보가 테이블에 저장하므로 객체를 저장하기 위한 배열이나 ArrayList가 필요없습니다.
NamecardUI.java 를 아래처럼 구현합니다.
(명함수정은 아직 완성되지 않았습니다. 명함수정이 완성되려면 NamecardManger.java 에도 코드가 추가되어야 합니다)

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 NamecardManager cardMgr = new NamecardManager();
	
	public NamecardUI() {}

	public void showMenu() throws IOException {
		
		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.종료");
			
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			
			menu = br.readLine();	
			try {
				if (menu.equals("1")) {
					//순서 name,mobile,email,mdate
					System.out.print("이름을 입력하세요>>");
					String name = br.readLine();
					
					System.out.print("손전화를 입력하세요>>");
					String mobile = br.readLine();
					
					System.out.print("이메일을 입력하세요>>");
					String email = br.readLine();
					
					System.out.print("만난 날짜를 2000/09/09 형식으로 입력하세요>>");
					String mdate = br.readLine();
					Namecard card = new Namecard(name,mobile,email,mdate);
					cardMgr.addCard(card);
				} else if (menu.equals("2")) {
					ArrayList<Namecard> cards = cardMgr.getCards();
					int totalCard = cards.size();
					for(int i = 0; i < totalCard; i++) {
						System.out.println(cards.get(i));
					}
					System.out.println();
				} else if (menu.equals("3")) {
					System.out.print("삭제할 이름을 입력하세요>>");
					String name = br.readLine();
					ArrayList<Namecard> searchCards = cardMgr.findCard(name);
					int totalCard = searchCards.size();
					for (int i = 0; i < totalCard; i++) {
						System.out.println(searchCards.get(i));
					}
					if (totalCard != 0) {
						System.out.print("삭제할 번호를 선택하세요>>");
						int id = Integer.parseInt(br.readLine());
						cardMgr.deleteCard(id);
					}
				} else if (menu.equals("4")) {
					System.out.print("수정할 명함의 이름을 입력하세요>>");
					String name = br.readLine();
					ArrayList<Namecard> searchCards = cardMgr.findCard(name);
					int totalCard = searchCards.size();
					for (int i = 0; i < totalCard; i++) {
						System.out.println(searchCards.get(i));
					}
					if ( totalCard != 0) {
						System.out.print("수정할 명함번호를 선택하세요>>");
						int id = Integer.parseInt(br.readLine());
						Namecard card = cardMgr.getCard(id);

						System.out.print("이름을 수정하려면 입력하세요>>");
						name = br.readLine();
						if (!name.equals("")) {
							card.setName(name);
						}

						System.out.print("손전화를 수정하려면 입력하세요>>");
						String mobile = br.readLine();
						if (!mobile.equals("")) {
							card.setMobile(mobile);
						}	
						
						System.out.print("이메일을 수정하려면 입력하세요>>");
						String email = br.readLine();
						if (!email.equals("")) {
							card.setEmail(email);
						}

						System.out.print("만난 날짜를 수정하려면 입력하세요>>");
						String mdate = br.readLine();
						if (!mdate.equals("")) {
							card.setMdate(mdate);
						}
						//TODO
					}
				} else if (menu.equals("5")) {
					System.out.print("검색할 이름을 입력하세요>>");
					String name = br.readLine();
					ArrayList<Namecard> cards = cardMgr.findCard(name);
					int totalCard = cards.size();
					for(int i = 0; i < totalCard; i++) {
						System.out.println(cards.get(i));
					}
					System.out.println();
				}
			} catch (Exception e) {
				System.out.println(e.toString());
			}
		} while(!menu.equals("q"));
	}
	
	public static void main(String[] args) throws IOException {
		NamecardUI cardUI = new NamecardUI();
		cardUI.showMenu();
	}

}

코드를 구현하고 1,2,3,5번 메뉴를 통해 구현내용을 확인했다면 4번 메뉴인 수정을 구현해 보세요.