1. JDBC 개요

 

○ JDBC : Java DataBase Connectivity
    - JAVA와 SQL(DB)을 연동하는 프레임워크

 

○ 외부 라이브러리(External API) : 정적 로딩
    ① 모든 프로젝트에서 동작
        - Oracle SQL(DB)에서 제공한 API를 복사 : ojdbc6.jar

        - C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
        - JAVA 설치 폴더 > JRE > lib > ext : 붙여넣기
        - Eclipse 재시작
    ② 현재 프로젝트에서 동작(권장 사항)
        - 프로젝트명 > 마우스 오른쪽 > BuildPath > Configure Build Path
        - Libraries Tab > Add External JARs...

○ JDBC 주요한 클래스(인터페이스)
    - Connection : JAVA와 DB를 연결해주는 연결 객체
    - Statement / PreparedStatement : SQL 문장(Query)을 전송해주는 겍체
    - ResultSet : 결과 객체(select 쿼리)

sqlplus > system / 0000 > create user 계정이름 identified by 0000 > grant dba to 계정이름

 


 

● MemberDTO.java

package com.hanul.member;

public class MemberDTO {
	private int num;
	private String name;
	private int age;
	private String addr;
	private String tel;
	
	public MemberDTO() {}

	public MemberDTO(int num, String name, int age, String addr, String tel) {
		super();
		this.num = num;
		this.name = name;
		this.age = age;
		this.addr = addr;
		this.tel = tel;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}
	
}

 

● MemberMain.java

import java.util.Scanner;

import com.hanul.member.MenuInput;

public class MemberMain {
	public static void menuPrint() {
		System.out.println("====회원관리====");
		System.out.println("회원관리 입력 : I");
		System.out.println("전체회원 검색 : S");
		System.out.println("회원정보 삭제 : D");
		System.out.println("회원주소 검색 : A");
		System.out.println("회원관리 종료 : E");
		System.out.println("=================\n");
	}//menuPrint()
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		MenuInput input = new MenuInput(scanner);
		
		while (true) {
			menuPrint();
			System.out.print("메뉴를 입력하세요 : ");
			String menu = scanner.nextLine();
			if (menu.equalsIgnoreCase("i")) {
				//System.out.println("신규 회원 등록화면");
				input.insertInput();		//회원정보를 등록하는 서브화면 호출
				continue;
			} else if(menu.equalsIgnoreCase("s")) {
				input.getAllList();		//전체 회원을 검색하는 서브화면 호출
				continue;
			} else if(menu.equalsIgnoreCase("d")) {
				input.deleteInput();		//회원정보를 삭제하는 서브화면 호출
			} else if(menu.equalsIgnoreCase("a")) {
				input.addrInput();		//주소를 검색하는 서브화면 호출
			} else if (menu.equalsIgnoreCase("e")) {
				System.out.print("정말 종료하시겠습니까(y/n)?");
				String exit = scanner.nextLine();
				if (exit.equalsIgnoreCase("y")) {
					System.out.println("회원관리 프로그램을 종료합니다.\n");
					System.exit(0);
					break;
				} else if (exit.equalsIgnoreCase("n")) {
					continue;
				} else {
					System.out.println("메뉴를 잘못 입력하셨습니다.\n");
					continue;
				}
			} else {
				System.out.println("메뉴를 잘못 입력하셨습니다.\n");
				continue;
			}
			
		}//while
		scanner.close();
		
	}//main()
}//class

메뉴를 잘못 입력 시 실행 결과  /  회원관리 종료(E) 시 실행 결과

 


2. 회원정보 등록

 

 

 

● MenuInput.java

package com.hanul.member;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;

public class MenuInput {
	private Scanner scanner;
	
	public MenuInput(Scanner scanner) {
		this.scanner = scanner;
	}

	//insertInput() : 회원정보 등록 서브화면
	public void insertInput() {
		System.out.println("회원정보 등록 화면 입니다.");
		
		//DAO와 연동하여 DB에 접속한 후 번호의 중복 검사를 수행해야 한다.
		System.out.print("번호를 입력하세요 : ");
		int num = Integer.parseInt(scanner.nextLine());
		
		MemberDAO dao = new MemberDAO();
		ResultSet rs =  dao.checkNum(num);		//중복 검사를 하기 위해 번호검색
		
		//데이터(하나의 레코드)의 유무를 판별하여 true/false를 반환하는 메소드 : next()
		try {
			if (rs.next()) {	//검색 결과가 있다 → 중복된 번호
				System.out.println("입력하신" + num + "번 자료는 이미 존재합니다.");
				System.out.println("다른 번호를 입력하시기 바랍니다.");
			} else {		//검색 결과가 없다 → 사용가능한 번호
				System.out.print("이름을 입력하세요 : ");
				String name = scanner.nextLine();	//db의 변수 이름과 같아야 함
				System.out.print("나이를 입력하세요 : ");
				int age = Integer.parseInt(scanner.nextLine());
				System.out.print("주소를 입력하세요 : ");
				String addr = scanner.nextLine();
				System.out.print("전화번호를 입력하세요 : ");
				String tel = scanner.nextLine();
				
//				System.out.println("num : " + num);
//				System.out.println("name : " + name);
//				System.out.println("age : " + age);
//				System.out.println("addr : " + addr);
//				System.out.println("tel : " + tel);
				MemberDTO dto = new MemberDTO(num, name, age, addr, tel);
				
				int succ = dao.insertMember(dto);
				if (succ > 0) {		//성공
					System.out.println(num + "번 회원님의 정보가 등록되었습니다.");
				} else {
					System.out.println(num + "번 회원님의 정보가 등록되지 않았습니다.");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}//insertInput()
}//class

 

 

● MemberDAO.java

package com.hanul.member;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class MemberDAO {
	private Connection conn;		//연결객체
	private PreparedStatement ps;		//전송객체
	private ResultSet rs;			//결과 객체
	
	//DB 접속 메소드
	public Connection getConn() {
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		// jdbc:oracle:thin: → 프로토콜
		// @ → 구분 기호
		// 127.0.0.1 → 자기 자신을 의미하는 ip
		// 1521 → 포트 번호
		// XE → 서비스 이름
		String user = "hanul";
		String password = "0000";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");	
			//동적로딩 : JAVA와 DB를 연결해주는 driver 호출
			//oracle.jdbc.driver라는 패키지에 OracleDriver라는 클래스 제공
			conn = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("getConn() Exception!");
		}
		return conn;
	}//getConn()
	
	//DB 종료 메소드 : conn, ps, rs → 역순으로 종료해야 함
	public void dbClose() {
		try {
			if (rs !=  null) rs.close();
			if (ps !=  null) ps.close();
			if (conn !=  null) conn.close();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("dbClose() Exception!");
		}
	}//dbClose()
	
	
	//번호 중복 검사(번호 검색 메소드) 
	public ResultSet checkNum(int num) {
		conn = getConn();	//DB 접속
		//String sql = "select * from tblMember where num = " + num;	//쿼리 작성(Statement)
		String sql = "select * from tblMember where num = ?";	//쿼리 작성(PreparedStatement)
		try {
			ps = conn.prepareStatement(sql);	//전송객체
			ps.setInt(1, num);			
			//매개변수값을 전달(db는 인덱스가 1부터 시작)
			//여기서 1은 첫번째 ?를 의미
			rs = ps.executeQuery();		//쿼리가 실행 후 결과가 저장된 객체
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("checkNum() Exception!");
		} finally {
			//dbClose();
		}
		return rs;
	}//checkNum()
	
	//회원 등록 메소드
	public int insertMember(MemberDTO dto) {
		conn = getConn();		//DB 접속
		String sql = "insert into tblMember values(?, ?, ?, ?, ?)";	//sql 쿼리 작성
		int succ = 0;		//성공, 실패 여부를 저장할 변수
		try {
			ps = conn.prepareStatement(sql);	//전송객체
			ps.setInt(1, dto.getNum());
			ps.setString(2, dto.getName());
			ps.setInt(3, dto.getAge());
			ps.setString(4, dto.getAddr());
			ps.setString(5, dto.getTel());
			succ = ps.executeUpdate();		//쿼리 실행(성공 시 1 저장)
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("insertMember() Exception!");
		} finally {
			dbClose();
		}
		return succ;
	}//insertMember()
	
}//class

회원정보 등록 시 중복된 번호를 입력 시 실행 결과  /  회원정보 등록 시 실행 결과

 

회원 정보 등록 후 DB에 들어있는 회원정보 목록

 


3. 전체 회원 검색

 

 

 MenuInput.java

package com.hanul.member;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;

public class MenuInput {
	private Scanner scanner;
	
	public MenuInput(Scanner scanner) {
		this.scanner = scanner;
	}

	//전체 회원 목록 검색 서브화면
	public void getAllList() {
		System.out.println("전체 회원 목록 검색 화면입니다.");
		MemberDAO dao = new MemberDAO();
		ArrayList<MemberDTO> list = dao.searchAllMember();
		dao.display(list);
	}//getAllList()y
	
}//class

 

 MemberDAO.java

package com.hanul.member;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class MemberDAO {
	private Connection conn;		//연결객체
	private PreparedStatement ps;		//전송객체
	private ResultSet rs;			//결과 객체
	
	//DB 접속 메소드
	public Connection getConn() {
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		// jdbc:oracle:thin: → 프로토콜
		// @ → 구분 기호
		// 127.0.0.1 → 자기 자신을 의미하는 ip
		// 1521 → 포트 번호
		// XE → 서비스 이름
		String user = "hanul";
		String password = "0000";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");	
			//동적로딩 : JAVA와 DB를 연결해주는 driver 호출
			//oracle.jdbc.driver라는 패키지에 OracleDriver라는 클래스 제공
			conn = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("getConn() Exception!");
		}
		return conn;
	}//getConn()
	
	//DB 종료 메소드 : conn, ps, rs → 역순으로 종료해야 함
	public void dbClose() {
		try {
			if (rs !=  null) rs.close();
			if (ps !=  null) ps.close();
			if (conn !=  null) conn.close();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("dbClose() Exception!");
		}
	}//dbClose()
    
	//전체 회원 검색 메소드
	public ArrayList<MemberDTO> searchAllMember() {
		conn = getConn();
		String sql = "select * from tblMember";
		ArrayList<MemberDTO> list = new ArrayList<>();
		try {
			ps = conn.prepareStatement(sql);	//전송객체
			rs = ps.executeQuery();		
			
			while (rs.next()) {			//rs.next()가 false가 될 때까지 반복
				//columnLabel vs columnIndex 
				// → 테이블 구조가 바뀌면 index 구조도 바뀌므로 columnLabel을 사용해야한다.
				int num = rs.getInt("num");
				String name = rs.getString("name");
				int age = rs.getInt("age");
				String addr = rs.getString("addr");
				String tel = rs.getString("tel");
				MemberDTO dto = new MemberDTO(num, name, age, addr, tel);
				list.add(dto);
			}//while()
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("searchAllMember() Exception!");
		} finally {
			dbClose();
		}
		return list;
	}//searchAllMember()
	
	//출력 메소드
	public void display(ArrayList<MemberDTO> list) {
		if (list.size() == 0) {		//검색 결과가 없을 때
			System.out.println("검색 결과가 없습니다.");
		} else {
			for (MemberDTO dto : list) {
				System.out.print(dto.getNum() + "\t");
				System.out.print(dto.getName() + "\t");
				System.out.print(dto.getAge() + "\t");
				System.out.print(dto.getAddr() + "\t");
				System.out.print(dto.getTel() + "\n");
			}//for-each
		}//if
	}//display()
    
}//class

전체회원 검색(S) 시 실행 결과

 


4. 회원 정보 삭제

 

 

 

● MenuInput.java

package com.hanul.member;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;

public class MenuInput {
	private Scanner scanner;
	
	public MenuInput(Scanner scanner) {
		this.scanner = scanner;
	}
    
	//회원 정보 삭제 서브화면
	public void deleteInput() {
		System.out.println("회원 정보 삭제 화면입니다.");
		System.out.print("삭제할 회원번호를 입력하세요 : ");
		int num = Integer.parseInt(scanner.nextLine());
		
		MemberDAO dao = new MemberDAO();
		ResultSet rs = dao.checkNum(num);
		
		try {
			if (!(rs.next())) {		//rs.next() == false(검색 결과가 없음 즉, 삭제할 번호가 없음)
				System.out.println("입력하신 " + num + "번 자료는 없습니다.");
			} else {
				System.out.print("정말 삭제하시겠습니까(y/n)? : ");
				String isDelete = scanner.nextLine();
				if (isDelete.equalsIgnoreCase("y")) {
					int succ = dao.deleteMember(num);
					if (succ > 0) {
						System.out.println(num + "번 회원님의 정보가 삭제되었습니다.");
					} else {
						System.out.println(num + "번 회원님의 정보가 삭제 실패되었습니다.");
					}
				} else if(isDelete.equalsIgnoreCase("n")) {
					System.out.println("취소되었습니다.");
				} else {
					System.out.println("잘못 입력하셨습니다.");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("deleteInput() Exception!");
		}
	}//deleteInput()
    
}//class

 

 

● MemberDAO.java

package com.hanul.member;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class MemberDAO {
	private Connection conn;		//연결객체
	private PreparedStatement ps;		//전송객체
	private ResultSet rs;			//결과 객체
	
	//DB 접속 메소드
	public Connection getConn() {
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		// jdbc:oracle:thin: → 프로토콜
		// @ → 구분 기호
		// 127.0.0.1 → 자기 자신을 의미하는 ip
		// 1521 → 포트 번호
		// XE → 서비스 이름
		String user = "hanul";
		String password = "0000";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");	
			//동적로딩 : JAVA와 DB를 연결해주는 driver 호출
			//oracle.jdbc.driver라는 패키지에 OracleDriver라는 클래스 제공
			conn = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("getConn() Exception!");
		}
		return conn;
	}//getConn()
	
	//DB 종료 메소드 : conn, ps, rs → 역순으로 종료해야 함
	public void dbClose() {
		try {
			if (rs !=  null) rs.close();
			if (ps !=  null) ps.close();
			if (conn !=  null) conn.close();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("dbClose() Exception!");
		}
	}//dbClose()
    
	//회원 정보 삭제 메소드
	public int deleteMember(int num) {
		conn = getConn();
		String sql = "delete from tblMember where num = ?";
		int succ = 0;
		try {
			ps = conn.prepareStatement(sql);	//전송객체
			ps.setInt(1, num);
			succ = ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("deleteMember() Exception!");
		} finally {
			dbClose();
		}
		return succ;
	}//deleteMember()
	
}//class

회원정보 삭제(D) 시 실행 결과

 

회원정보 삭제 후, 전체 회원 검색 실행 결과


5. 회원 주소 검색

 

 

 

● MenuInput.java

package com.hanul.member;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;

public class MenuInput {
	private Scanner scanner;
	
	public MenuInput(Scanner scanner) {
		this.scanner = scanner;
	}

	//주소 검색 서브화면
	public void addrInput() {
		System.out.println("주소 검색 서브화면입니다.");
		System.out.print("검색할 주소를 입력하세요 : ");
		String searchAddr = scanner.nextLine();
		MemberDAO dao = new MemberDAO();
		ArrayList<MemberDTO> list = dao.searchAddr(searchAddr);
		dao.display(list);
	}//addrInput()
	
}//class

 

 

● MemberDAO.java

package com.hanul.member;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class MemberDAO {
	private Connection conn;		//연결객체
	private PreparedStatement ps;	//전송객체
	private ResultSet rs;			//결과 객체
	
	//DB 접속 메소드
	public Connection getConn() {
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		// jdbc:oracle:thin: → 프로토콜
		// @ → 구분 기호
		// 127.0.0.1 → 자기 자신을 의미하는 ip
		// 1521 → 포트 번호
		// XE → 서비스 이름
		String user = "hanul";
		String password = "0000";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");	
			//동적로딩 : JAVA와 DB를 연결해주는 driver 호출
			//oracle.jdbc.driver라는 패키지에 OracleDriver라는 클래스 제공
			conn = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("getConn() Exception!");
		}
		return conn;
	}//getConn()
	
	//DB 종료 메소드 : conn, ps, rs → 역순으로 종료해야 함
	public void dbClose() {
		try {
			if (rs !=  null) rs.close();
			if (ps !=  null) ps.close();
			if (conn !=  null) conn.close();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("dbClose() Exception!");
		}
	}//dbClose()
	
	// 주소 검색 메소드
	public ArrayList<MemberDTO> searchAddr(String searchAddr) {
		conn = getConn();
		String sql = "select * from tblMember where addr like ? order by num asc";
		ArrayList<MemberDTO> list = new ArrayList<>();
		try {
			ps = conn.prepareStatement(sql);
			ps.setString(1, "%" + searchAddr + "%");
			rs = ps.executeQuery();
			//전체 검색
			while (rs.next()) {			//rs.next()가 false가 될 때까지 반복
				//columnLabel vs columnIndex 
				// → 테이블 구조가 바뀌면 index 구조도 바뀌므로 columnLabel을 사용해야한다.
				int num = rs.getInt("num");
				String name = rs.getString("name");
				int age = rs.getInt("age");
				String addr = rs.getString("addr");
				String tel = rs.getString("tel");
				MemberDTO dto = new MemberDTO(num, name, age, addr, tel);
				list.add(dto);
			}//while()
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("searchAddr() Exception!");
		} finally {
			dbClose();
		}
		return list;
	}//searchAddr()
	
}//class

 

회원주소 검색(A) 시 실행 결과

 


6. 전체 코드

 

 

 

● MemberDTO.java

package com.hanul.member;

public class MemberDTO {
	private int num;
	private String name;
	private int age;
	private String addr;
	private String tel;
	
	public MemberDTO() {}

	public MemberDTO(int num, String name, int age, String addr, String tel) {
		super();
		this.num = num;
		this.name = name;
		this.age = age;
		this.addr = addr;
		this.tel = tel;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}
	
}

 

● MemberMain.java

import java.util.Scanner;

import com.hanul.member.MenuInput;

public class MemberMain {
	public static void menuPrint() {
		System.out.println("====회원관리====");
		System.out.println("회원관리 입력 : I");
		System.out.println("전체회원 검색 : S");
		System.out.println("회원정보 삭제 : D");
		System.out.println("회원주소 검색 : A");
		System.out.println("회원관리 종료 : E");
		System.out.println("=================\n");
	}//menuPrint()
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		MenuInput input = new MenuInput(scanner);
		
		while (true) {
			menuPrint();
			System.out.print("메뉴를 입력하세요 : ");
			String menu = scanner.nextLine();
			if (menu.equalsIgnoreCase("i")) {
				//System.out.println("신규 회원 등록화면");
				input.insertInput();		//회원정보를 등록하는 서브화면 호출
				continue;
			} else if(menu.equalsIgnoreCase("s")) {
				input.getAllList();			//전체 회원을 검색하는 서브화면 호출
				continue;
			} else if(menu.equalsIgnoreCase("d")) {
				input.deleteInput();		//회원정보를 삭제하는 서브화면 호출
			} else if(menu.equalsIgnoreCase("a")) {
				input.addrInput();			//주소를 검색하는 서브화면 호출
			} else if (menu.equalsIgnoreCase("e")) {
				System.out.print("정말 종료하시겠습니까(y/n)?");
				String exit = scanner.nextLine();
				if (exit.equalsIgnoreCase("y")) {
					System.out.println("회원관리 프로그램을 종료합니다.\n");
					System.exit(0);
					break;
				} else if (exit.equalsIgnoreCase("n")) {
					continue;
				} else {
					System.out.println("메뉴를 잘못 입력하셨습니다.\n");
					continue;
				}
			} else {
				System.out.println("메뉴를 잘못 입력하셨습니다.\n");
				continue;
			}
			
		}//while
		scanner.close();
		
	}//main()
}//class

 

● MenuInput.java

package com.hanul.member;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;

public class MenuInput {
	private Scanner scanner;
	
	public MenuInput(Scanner scanner) {
		this.scanner = scanner;
	}

	//insertInput() : 회원정보 등록 서브화면
	public void insertInput() {
		System.out.println("회원정보 등록 화면 입니다.");
		
		//DAO와 연동하여 DB에 접속한 후 번호의 중복 검사를 수행해야 한다.
		System.out.print("번호를 입력하세요 : ");
		int num = Integer.parseInt(scanner.nextLine());
		
		MemberDAO dao = new MemberDAO();
		ResultSet rs =  dao.checkNum(num);		//중복 검사를 하기 위해 번호검색
		
		//데이터(하나의 레코드)의 유무를 판별하여 true/false를 반환하는 메소드 : next()
		try {
			if (rs.next()) {	//검색 결과가 있다 → 중복된 번호
				System.out.println("입력하신" + num + "번 자료는 이미 존재합니다.");
				System.out.println("다른 번호를 입력하시기 바랍니다.");
			} else {		//검색 결과가 없다 → 사용가능한 번호
				System.out.print("이름을 입력하세요 : ");
				String name = scanner.nextLine();	//db의 변수 이름과 같아야 함
				System.out.print("나이를 입력하세요 : ");
				int age = Integer.parseInt(scanner.nextLine());
				System.out.print("주소를 입력하세요 : ");
				String addr = scanner.nextLine();
				System.out.print("전화번호를 입력하세요 : ");
				String tel = scanner.nextLine();
				
//				System.out.println("num : " + num);
//				System.out.println("name : " + name);
//				System.out.println("age : " + age);
//				System.out.println("addr : " + addr);
//				System.out.println("tel : " + tel);
				MemberDTO dto = new MemberDTO(num, name, age, addr, tel);
				
				int succ = dao.insertMember(dto);
				if (succ > 0) {		//성공
					System.out.println(num + "번 회원님의 정보가 등록되었습니다.");
				} else {
					System.out.println(num + "번 회원님의 정보가 등록되지 않았습니다.");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}//insertInput()
	
	//전체 회원 목록 검색 서브화면
	public void getAllList() {
		System.out.println("전체 회원 목록 검색 화면입니다.");
		MemberDAO dao = new MemberDAO();
		ArrayList<MemberDTO> list = dao.searchAllMember();
		dao.display(list);
	}//getAllList()y
	
	//회원 정보 삭제 서브화면
	public void deleteInput() {
		System.out.println("회원 정보 삭제 화면입니다.");
		System.out.print("삭제할 회원번호를 입력하세요 : ");
		int num = Integer.parseInt(scanner.nextLine());
		
		MemberDAO dao = new MemberDAO();
		ResultSet rs = dao.checkNum(num);
		
		try {
			if (!(rs.next())) {		//rs.next() == false(검색 결과가 없음 즉, 삭제할 번호가 없음)
				System.out.println("입력하신 " + num + "번 자료는 없습니다.");
			} else {
				System.out.print("정말 삭제하시겠습니까(y/n)? : ");
				String isDelete = scanner.nextLine();
				if (isDelete.equalsIgnoreCase("y")) {
					int succ = dao.deleteMember(num);
					if (succ > 0) {
						System.out.println(num + "번 회원님의 정보가 삭제되었습니다.");
					} else {
						System.out.println(num + "번 회원님의 정보가 삭제 실패되었습니다.");
					}
				} else if(isDelete.equalsIgnoreCase("n")) {
					System.out.println("취소되었습니다.");
				} else {
					System.out.println("잘못 입력하셨습니다.");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("deleteInput() Exception!");
		}
		
	}//deleteInput()

	//주소 검색 서브화면
	public void addrInput() {
		System.out.println("주소 검색 서브화면입니다.");
		System.out.print("검색할 주소를 입력하세요 : ");
		String searchAddr = scanner.nextLine();
		MemberDAO dao = new MemberDAO();
		ArrayList<MemberDTO> list = dao.searchAddr(searchAddr);
		dao.display(list);
	}//addrInput()
	
}//class

 

● MemberDAO.java

package com.hanul.member;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class MemberDAO {
	private Connection conn;		//연결객체
	private PreparedStatement ps;	//전송객체
	private ResultSet rs;			//결과 객체
	
	//DB 접속 메소드
	public Connection getConn() {
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		// jdbc:oracle:thin: → 프로토콜
		// @ → 구분 기호
		// 127.0.0.1 → 자기 자신을 의미하는 ip
		// 1521 → 포트 번호
		// XE → 서비스 이름
		String user = "hanul";
		String password = "0000";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");	
			//동적로딩 : JAVA와 DB를 연결해주는 driver 호출
			//oracle.jdbc.driver라는 패키지에 OracleDriver라는 클래스 제공
			conn = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("getConn() Exception!");
		}
		return conn;
	}//getConn()
	
	//DB 종료 메소드 : conn, ps, rs → 역순으로 종료해야 함
	public void dbClose() {
		try {
			if (rs !=  null) rs.close();
			if (ps !=  null) ps.close();
			if (conn !=  null) conn.close();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("dbClose() Exception!");
		}
	}//dbClose()
	
	
	//번호 중복 검사(번호 검색 메소드) 
	public ResultSet checkNum(int num) {
		conn = getConn();	//DB 접속
		//String sql = "select * from tblMember where num = " + num;	//쿼리 작성(Statement)
		String sql = "select * from tblMember where num = ?";	//쿼리 작성(PreparedStatement)
		try {
			ps = conn.prepareStatement(sql);	//전송객체
			ps.setInt(1, num);			
			//매개변수값을 전달(db는 인덱스가 1부터 시작)
			//여기서 1은 첫번째 ?를 의미
			rs = ps.executeQuery();		//쿼리가 실행 후 결과가 저장된 객체
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("checkNum() Exception!");
		} finally {
			//dbClose();
		}
		return rs;
	}//checkNum()
	
	//회원 등록 메소드
	public int insertMember(MemberDTO dto) {
		conn = getConn();		//DB 접속
		String sql = "insert into tblMember values(?, ?, ?, ?, ?)";		//sql 쿼리 작성
		int succ = 0;		//성공, 실패 여부를 저장할 변수
		try {
			ps = conn.prepareStatement(sql);	//전송객체
			ps.setInt(1, dto.getNum());
			ps.setString(2, dto.getName());
			ps.setInt(3, dto.getAge());
			ps.setString(4, dto.getAddr());
			ps.setString(5, dto.getTel());
			succ = ps.executeUpdate();		//쿼리 실행(성공 시 1 저장)
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("insertMember() Exception!");
		} finally {
			dbClose();
		}
		return succ;
	}//insertMember()
	
	
	//전체 회원 검색 메소드
	public ArrayList<MemberDTO> searchAllMember() {
		conn = getConn();
		String sql = "select * from tblMember";
		ArrayList<MemberDTO> list = new ArrayList<>();
		try {
			ps = conn.prepareStatement(sql);	//전송객체
			rs = ps.executeQuery();		
			
			while (rs.next()) {			//rs.next()가 false가 될 때까지 반복
				//columnLabel vs columnIndex 
				// → 테이블 구조가 바뀌면 index 구조도 바뀌므로 columnLabel을 사용해야한다.
				int num = rs.getInt("num");
				String name = rs.getString("name");
				int age = rs.getInt("age");
				String addr = rs.getString("addr");
				String tel = rs.getString("tel");
				MemberDTO dto = new MemberDTO(num, name, age, addr, tel);
				list.add(dto);
			}//while()
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("searchAllMember() Exception!");
		} finally {
			dbClose();
		}
		return list;
	}//searchAllMember()
	
	//출력 메소드
	public void display(ArrayList<MemberDTO> list) {
		if (list.size() == 0) {		//검색 결과가 없을 때
			System.out.println("검색 결과가 없습니다.");
		} else {
			for (MemberDTO dto : list) {
				System.out.print(dto.getNum() + "\t");
				System.out.print(dto.getName() + "\t");
				System.out.print(dto.getAge() + "\t");
				System.out.print(dto.getAddr() + "\t");
				System.out.print(dto.getTel() + "\n");
			}//for-each
		}//if
	}//display()
	
	//회원 정보 삭제 메소드
	public int deleteMember(int num) {
		conn = getConn();
		String sql = "delete from tblMember where num = ?";
		int succ = 0;
		try {
			ps = conn.prepareStatement(sql);	//전송객체
			ps.setInt(1, num);
			succ = ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("deleteMember() Exception!");
		} finally {
			dbClose();
		}
		return succ;
	}//deleteMember()
	
	// 주소 검색 메소드
	public ArrayList<MemberDTO> searchAddr(String searchAddr) {
		conn = getConn();
		String sql = "select * from tblMember where addr like ? order by num asc";
		ArrayList<MemberDTO> list = new ArrayList<>();
		try {
			ps = conn.prepareStatement(sql);
			ps.setString(1, "%" + searchAddr + "%");
			rs = ps.executeQuery();
			//전체 검색
			while (rs.next()) {			//rs.next()가 false가 될 때까지 반복
				//columnLabel vs columnIndex 
				// → 테이블 구조가 바뀌면 index 구조도 바뀌므로 columnLabel을 사용해야한다.
				int num = rs.getInt("num");
				String name = rs.getString("name");
				int age = rs.getInt("age");
				String addr = rs.getString("addr");
				String tel = rs.getString("tel");
				MemberDTO dto = new MemberDTO(num, name, age, addr, tel);
				list.add(dto);
			}//while()
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("searchAddr() Exception!");
		} finally {
			dbClose();
		}
		return list;
	}//searchAddr()
	
}//class