Study Web Development

12월 6일

이전으로

자바

17. JDBC

17-2 JDBC(Java Database Connectivity)

VO(Value Object)
  1. 새 패키지 kr.s09.book 생성하고 table.sql 생성
CREATE TABLE member(
	me_num NUMBER PRIMARY KEY,
	me_id VARCHAR2(10) UNIQUE NOT NULL,
	me_passwd VARCHAR2(10) NOT NULL,
	me_name VARCHAR2(30) NOT NULL,
	me_phone VARCHAR2(13) NOT NULL,
	me_regdate DATE DEFAULT SYSDATE NOT NULL
);
CREATE SEQUENCE member_seq;

CREATE TABLE book(
	bk_num NUMBER PRIMARY KEY,
	bk_name VARCHAR2(90) NOT NULL,
	bk_category VARCHAR2(30) NOT NULL,
	bk_regdate DATE DEFAULT SYSDATE NOT NULL
);
CREATE SEQUENCE book_seq;

CREATE TABLE reservation(
	re_num NUMBER PRIMARY KEY,
	re_status NUMBER(1) NOT NULL, /* 0. 미대출/반납, 1. 대출 중 */
	bk_num NUMBER NOT NULL REFERENCES book (bk_num), /* 도서 번호 */
	me_num NUMBER NOT NULL REFERENCES member (me_num), /* 회원 번호 */
	re_regdate DATE DEFAULT SYSDATE NOT NULL, /* 대출일 */
	re_modifydate DATE /* 반납일 */
);
CREATE SEQUENCE reservation_seq;
  1. 새 클래스 BookVO 생성
package kr.s09.book;

import java.sql.Date;

public class BookVO {
	private int bk_num; // 도서 번호
	private String bk_name; // 도서명
	private String bk_category; // 도서 분류
	private Date bk_date; // 도서 등록일
	
	public int getBk_num() {
		return bk_num;
	}
	public void setBk_num(int bk_num) {
		this.bk_num = bk_num;
	}
	public String getBk_name() {
		return bk_name;
	}
	public void setBk_name(String bk_name) {
		this.bk_name = bk_name;
	}
	public String getBk_category() {
		return bk_category;
	}
	public void setBk_category(String bk_category) {
		this.bk_category = bk_category;
	}
	public Date getBk_date() {
		return bk_date;
	}
	public void setBk_date(Date bk_date) {
		this.bk_date = bk_date;
	}
}
  1. 새 클래스 MemberVO 생성
package kr.s09.book;

import java.sql.Date;

public class MemberVO {
	private int me_num; // 회원 번호
	private String me_id; // 아이디
	private String me_passwd; // 비밀번호
	private String me_name; // 이름
	private String me_phone; // 연락처
	private Date me_regdate; // 가입일
	
	public int getMe_num() {
		return me_num;
	}
	public void setMe_num(int me_num) {
		this.me_num = me_num;
	}
	public String getMe_id() {
		return me_id;
	}
	public void setMe_id(String me_id) {
		this.me_id = me_id;
	}
	public String getMe_passwd() {
		return me_passwd;
	}
	public void setMe_passwd(String me_passwd) {
		this.me_passwd = me_passwd;
	}
	public String getMe_name() {
		return me_name;
	}
	public void setMe_name(String me_name) {
		this.me_name = me_name;
	}
	public String getMe_phone() {
		return me_phone;
	}
	public void setMe_phone(String me_phone) {
		this.me_phone = me_phone;
	}
	public Date getMe_regdate() {
		return me_regdate;
	}
	public void setMe_regdate(Date me_regdate) {
		this.me_regdate = me_regdate;
	}
}
  1. 새 클래스 BookDAO 생성
package kr.s09.book;

import kr.s03.preparedstatement.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class BookDAO {
	// 도서 등록
	public void insertBook(BookVO book) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = null;
		
		try {
			// JDBC 수행 1,2단계
			conn = DBUtil.getConnection();
			// SQL문 작성
			sql = "INSERT INTO book (bk_num, bk_name, bk_category) "
				+ "VALUES (book_seq.NEXTVAL, ?, ?)";
			// JDBC 수행 3단계
			pstmt = conn.prepareStatement(sql);
			// ?에 데이터를 바인딩
			pstmt.setString(1, book.getBk_name());
			pstmt.setString(2, book.getBk_category());
			// JDBC 수행 4단계 : SQL문을 실행해서 테이블에 행을 추가
			int count = pstmt.executeUpdate();
			System.out.println(count+"건의 도서를 등록했습니다.");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			// 자원 정리
			DBUtil.executeClose(null, pstmt, conn);
		}
	}
	
	// 도서 목록 보기
	public void selectListBook() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		
		try {
			// JDBC 수행 1,2단계
			conn = DBUtil.getConnection();
			// SQL문 작성
			sql = "SELECT * FROM book LEFT OUTER JOIN (SELECT bk_num, re_status from reservation WHERE re_status=1)"
				+ "USING(bk_num) ORDER BY bk_num DESC";
			// JDBC 수행 3단계
			pstmt = conn.prepareStatement(sql);
			// JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 결과 집합을 얻고 ResultSet에 담아서 반환
			rs = pstmt.executeQuery();
			
			System.out.println("번호\t분류\t\t등록일\t\t대출 여부\t도서명");
			while(rs.next()) {
				System.out.print(rs.getInt("bk_num")+"\t");
				String bk_category = rs.getString("bk_category");
				if(bk_category.length()>6) System.out.print(bk_category + "\t");
				else System.out.print(bk_category + "\t\t");
				System.out.print(rs.getDate("bk_regdate") + "\t");
				if(rs.getInt("re_status")==0) { // re_status가 NULL일 경우, getInt() 메서드는 0으로 반환하고 getString() 메서드는 null로 반환
					System.out.print("대출 가능\t");
				}
				else {
					System.out.print("대출 중\t");
				}
				System.out.println(rs.getString("bk_name"));
			}
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			// 자원 정리
			DBUtil.executeClose(rs, pstmt, conn);
		}
	}
	
	// 대출 등록
	public void insertReservation(ReservationVO reservation) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = null;
		
		try {
			// JDBC 수행 1,2단계
			conn = DBUtil.getConnection();
			// SQL문 작성
			sql = "INSERT INTO reservation (re_num, bk_num, me_num, re_status)"
				+ "VALUES (reservation_seq.NEXTVAL, ?, ?, 1)";
			// JDBC 수행 3단계
			pstmt = conn.prepareStatement(sql);
			// ?에 데이터를 바인딩
			pstmt.setInt(1, reservation.getBk_num());
			pstmt.setInt(2, reservation.getMe_num());
			// JDBC 수행 4단계 : SQL문을 실행해서 테이블에 행을 삽입
			int count = pstmt.executeUpdate();
			System.out.println(count + "권의 도서를 대출하였습니다.");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			DBUtil.executeClose(null, pstmt, conn);
		}
	}
	
	// 대출 여부 확인
	public int getStatusReservation(int bk_num) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		int count = 0;
		
		try {
			// JDBC 수행 1,2단계
			conn = DBUtil.getConnection();
			// SQL문 작성
			sql = "SELECT re_status FROM book LEFT OUTER JOIN (SELECT * FROM reservation WHERE re_status=1)"
				+ "USING(bk_num) WHERE bk_num=?";
			// JDBC 수행 3단계
			pstmt = conn.prepareStatement(sql);
			// ?에 데이터를 바인딩
			pstmt.setInt(1, bk_num);
			// JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 대출 여부 조회
			rs = pstmt.executeQuery();
			if(rs.next()) { // 있는 도서 번호를 입력한 경우
				count = rs.getInt(1); // re_status의 값을 반환; null일 경우 getInt() 메서드는 0을 반환
			}
			else { // 없는 도서 번호를 입력한 경우
				count = -1;
			}
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			// 자원 정리
			DBUtil.executeClose(rs, pstmt, conn);
		}
		
		return count;
	}
	
	// 반납 여부 체크
	public int getStatusBack(int re_num, int me_num) {
		int count = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		
		try {
			// JDBC 수행 1,2단계
			conn = DBUtil.getConnection();
			// SQL문 작성
			sql = "SELECT re_status FROM reservation WHERE re_num=? AND me_num=?";
			// JDBC 수행 3단계
			pstmt = conn.prepareStatement(sql);
			// ?에 데이터를 바인딩
			pstmt.setInt(1, re_num); // 대출 번호
			pstmt.setInt(2, me_num); // 회원 번호
			// JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 반납 여부 체크
			rs = pstmt.executeQuery();
			if(rs.next()) {
				count = rs.getInt(1);
			}
			else {
				count = -1;
			}	
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			// 자원 정리
			DBUtil.executeClose(rs, pstmt, conn);
		}
		
		return count;
	}
	
	// 반납 처리
	public void updateReservation(int re_num) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = null;
		
		try {
			// JDBC 수행 1,2단계
			conn = DBUtil.getConnection();
			// SQL문 작성
			sql = "UPDATE reservation SET re_status=0, re_modifydate=SYSDATE WHERE re_num=?";
			// JDBC 수행 3단계
			pstmt = conn.prepareStatement(sql);
			// ?에 데이터 바인딩
			pstmt.setInt(1, re_num);
			// JDBC 수행 4단계 : SQL문을 실행해서 테이블에 반납 처리
			int count = pstmt.executeUpdate();
			System.out.println(count + "권의 도서를 반납하였습니다.");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			// 자원 정리
			DBUtil.executeClose(null, pstmt, conn);
		}
	}
	
	// 대출 목록 보기
	public void selectListReservation() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		
		try {
			// JDBC 수행 1,2단계
			conn = DBUtil.getConnection();
			// SQL문 작성
			sql = "SELECT re_num, me_id, bk_name, re_status, re_regdate, re_modifydate "
				+ "FROM reservation JOIN book USING(bk_num) JOIN member USING(me_num) ORDER BY re_num DESC";
			// JDBC 수행 3단계
			pstmt = conn.prepareStatement(sql);
			// JDBC 수행 4단계 : SQL문을 실행하고 테이블로부터 결과 집합을 얻어서 ResultSet에 담아 반환
			rs = pstmt.executeQuery();
			System.out.println("번호\t아이디\t도서명\t대출 여부\t대출일\t\t반납일");
			while(rs.next()) {
				System.out.print(rs.getInt("re_num") + "\t");
				System.out.print(rs.getString("me_id") + "\t");
				if(rs.getString("bk_name").length()>6) { // 도서명이 긴 경우 말줄임표 처리
					System.out.print(rs.getString("bk_name").substring(0, 4) + "..\t");
				}
				else {
					System.out.print(rs.getString("bk_name") + "\t");
				}
				if(rs.getInt("re_status")==0) {
					System.out.print("반납\t");
				}
				else {
					System.out.print("대출 중\t");
				}
				System.out.print(rs.getDate("re_regdate") + "\t");
				if(rs.getDate("re_modifydate")==null) { // 반납하지 않았을 경우 null 대신 빈 문자열 출력
					System.out.println();
				}
				else {
					System.out.println(rs.getDate("re_modifydate"));
				};
			}
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			// 자원 정리
			DBUtil.executeClose(rs, pstmt, conn);
		}
	}
	
	// 내 대출 목록
	public void selectMyList(int me_num) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		
		try {
			// JDBC 수행 1,2단계
			conn = DBUtil.getConnection();
			// SQL문 작성
			sql = "SELECT re_num, bk_name, re_status, re_regdate, re_modifydate "
				+ "FROM reservation JOIN book USING(bk_num) JOIN member USING(me_num)"
				+ "WHERE me_num=? ORDER BY re_num DESC";
			// JDBC 수행 3단계
			pstmt = conn.prepareStatement(sql);
			// ?에 데이터를 바인딩
			pstmt.setInt(1, me_num);
			// JDBC 수행 4단계 : SQL문을 실행하고 테이블로부터 결과 집합을 얻어서 ResultSet에 담아 반환
			rs = pstmt.executeQuery();
			System.out.println("번호\t도서명\t대출 여부\t대출일\t\t반납일");
			while(rs.next()) {
				System.out.print(rs.getInt("re_num") + "\t");
				if(rs.getString("bk_name").length()>6) { // 도서명이 긴 경우 말줄임표 처리
					System.out.print(rs.getString("bk_name").substring(0, 4) + "..\t");
				}
				else {
					System.out.print(rs.getString("bk_name") + "\t");
				}
				if(rs.getInt("re_status")==0) {
					System.out.print("반납\t");
				}
				else {
					System.out.print("대출 중\t");
				}
				System.out.print(rs.getDate("re_regdate") + "\t");
				if(rs.getDate("re_modifydate")==null) { // 반납하지 않았을 경우 null 대신 빈 문자열 출력
					System.out.println();
				}
				else {
					System.out.println(rs.getDate("re_modifydate"));
				};
			}
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			// 자원 정리
			DBUtil.executeClose(rs, pstmt, conn);
		}
	}
	
	// 회원 가입
	public void insertMember(MemberVO member) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = null;
		
		try {
			// JDBC 수행 1,2단계
			conn = DBUtil.getConnection();
			// SQL문 작성
			sql = "INSERT INTO member (me_num, me_id, me_passwd, me_name, me_phone)"
				+ "VALUES (member_seq.NEXTVAL, ?, ?, ?, ?)";
			// JDBC 수행 3단계
			pstmt = conn.prepareStatement(sql);
			// ?에 데이터를 바인딩
			pstmt.setString(1, member.getMe_id());
			pstmt.setString(2, member.getMe_passwd());
			pstmt.setString(3, member.getMe_name());
			pstmt.setString(4, member.getMe_phone());
			// JDBC 수행 4단계 : SQL문을 실행해서 테이블에 행을 추가
			int count = pstmt.executeUpdate();
			System.out.println(count + "건의 회원 정보를 추가했습니다.");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			// 자원 정리
			DBUtil.executeClose(null, pstmt, conn);
		}
	}
	
	// 회원 목록
	public void selectListMember() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		
		try {
			// JDBC 수행 1,2단계
			conn = DBUtil.getConnection();
			// SQL문 작성
			sql = "SELECT * FROM member ORDER BY me_num DESC";
			// JDBC 수행 3단계
			pstmt = conn.prepareStatement(sql);
			// JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 결과 집합을 얻고 ResultSet에 담아서 반환
			rs = pstmt.executeQuery();
			
			System.out.println("번호\tID\t이름\t연락처\t\t가입일"); // 비밀번호의 경우 관리자 페이지에서도 노출하지 않는 것이 안전
			while(rs.next()) {
				System.out.print(rs.getInt("me_num")+"\t");
				System.out.print(rs.getString("me_id") + "\t");
				System.out.print(rs.getString("me_name")+"\t");
				System.out.print(rs.getString("me_phone")+"\t");
				System.out.println(rs.getDate("me_regdate"));
			}
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			// 자원 정리
			DBUtil.executeClose(rs, pstmt, conn);
		}
	}
	
	// 아이디 중복 체크
	public int checkID(String me_id) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		int count = 0;
		
		try {
			// JDBC 수행 1,2단계
			conn = DBUtil.getConnection();
			// SQL문 작성
			sql = "SELECT me_id FROM member WHERE me_id=?";
			// JDBC 수행 3단계
			pstmt = conn.prepareStatement(sql);
			// ?에 데이터를 바인딩
			pstmt.setString(1, me_id);
			// JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 아이디를 조회
			rs = pstmt.executeQuery();
			if(rs.next()) { // me_id는 UNIQUE KEY이므로 최대 한 건만 반환
				count = 1; // 1: 이미 있는 아이디, 0: 없는 아이디
			}
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			// 자원 정리
			DBUtil.executeClose(rs, pstmt, conn);
		}
		
		return count;
	}
	
	// 로그인 체크
	public int loginCheck(String me_id, String me_passwd) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		int me_num = 0; // 로그인이 가능하면 회원 번호 반환; me_num은 1부터 시작
		
		try {
			// JDBC 수행 1,2단계
			conn = DBUtil.getConnection();
			// SQL문 작성
			sql = "SELECT me_num FROM member WHERE me_id=? AND me_passwd=?";
			// JDBC 수행 3단계
			pstmt = conn.prepareStatement(sql);
			// ?에 데이터를 바인딩
			pstmt.setString(1, me_id);
			pstmt.setString(2, me_passwd);
			// JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 회원 번호 구하기
			rs = pstmt.executeQuery();
			if(rs.next()) { // me_id는 UNIQUE KEY이므로 결과를 최대 한 건만 반환
				me_num = rs.getInt(1);
			}
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			// 자원 정리
			DBUtil.executeClose(rs, pstmt, conn);
		}
		
		return me_num;
	}
}
  1. 새 클래스 BookAdminMain 생성
package kr.s09.book;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class BookAdminMain {
	private BufferedReader br;
	private BookDAO dao;
	
	public BookAdminMain() {
		dao = new BookDAO();
		try {
			br = new BufferedReader(new InputStreamReader(System.in));
			callMenu();
		}
		catch(IOException e) {
			e.printStackTrace();
		}
		finally {
			if(br!=null) try {br.close();} catch(IOException e) {}
		}
	}
	
	public void callMenu() throws IOException {
		while(true) {
			System.out.println("메뉴 : 1. 회원 목록, 2. 도서 등록, 3. 도서 목록, 4. 대출 목록, 5. 종료");
			System.out.print("메뉴 > ");
			try {
				int menu = Integer.parseInt(br.readLine());
				if(menu==1) { // 회원 목록
					dao.selectListMember();
				}
				else if(menu==2) { // 도서 등록
					BookVO vo = new BookVO();
					System.out.print("도서명 > ");
					vo.setBk_name(br.readLine());
					System.out.print("분류 > ");
					vo.setBk_category(br.readLine());
					dao.insertBook(vo);
				}
				else if(menu==3) { // 도서 목록
					dao.selectListBook();
				}
				else if(menu==4) { // 대출 목록
					System.out.println("대출 내역");
					dao.selectListReservation();
				}
				else if(menu==5) { // 종료
					System.out.println("프로그램을 종료합니다.");
					break;
				}
				else {
					System.out.println("메뉴 번호를 잘못 입력했습니다!");
				}
			} catch (NumberFormatException e) {
				System.out.println("숫자만 입력 가능합니다!");
			}
		}
	}
	
	public static void main(String[] args) {
		new BookAdminMain();
	}
}
  1. 새 클래스 BookUserMain 생성
    • 이클립스에서 ctrl을 누른 채 메서드명에 커서를 올리면 메서드 선언부로 이동 가능
package kr.s09.book;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class BookUserMain {
	private BufferedReader br;
	private BookDAO dao;
	private boolean flag; // 로그인 여부
	private int me_num; // 회원 번호
	
	public BookUserMain() {
		dao = new BookDAO();
		try {
			br = new BufferedReader(new InputStreamReader(System.in));
			callMenu();
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			if(br!=null) try {br.close();} catch(IOException e) {}
		}
	}
	
	public void callMenu() throws IOException {
		while(true) {
			System.out.println("메뉴 : 1. 로그인, 2. 회원 가입, 3. 종료");
			System.out.print("메뉴 > ");
			try {
				int menu = Integer.parseInt(br.readLine());
				if(menu==1) { // 로그인
					System.out.print("아이디 > ");
					String me_id = br.readLine();
					System.out.print("비밀번호 > ");
					String me_passwd = br.readLine();
					me_num = dao.loginCheck(me_id, me_passwd);
					if(me_num!=0) {
						System.out.println(me_id + "님 로그인되었습니다.");
						flag = true;
						break;
					}
					System.out.println("아이디 또는 비밀번호를 잘못 입력했습니다!");
				}
				else if(menu==2) { // 회원 가입
					MemberVO vo = new MemberVO();
					System.out.print("아이디 > ");
					vo.setMe_id(br.readLine());
					if(dao.checkID(vo.getMe_id())==1) { // 아이디 중복 체크
						System.out.println("중복된 아이디입니다.");
						continue; // 메뉴로 되돌아감
					}
					System.out.print("비밀번호 > ");
					vo.setMe_passwd(br.readLine());
					System.out.print("이름 > ");
					vo.setMe_name(br.readLine());
					System.out.print("연락처 > ");
					vo.setMe_phone(br.readLine());
					dao.insertMember(vo);
				}
				else if(menu==3) { // 종료
					System.out.println("프로그램을 종료합니다.");
					break;
				}
				else {
					System.out.println("메뉴 번호를 잘못 입력했습니다!");
				}
			}
			catch(NumberFormatException e) {
				System.out.println("숫자만 입력 가능합니다!");
			}
		}
		
		while(flag) { // 로그인시에만 동작
			System.out.println("메뉴 : 1. 도서 목록, 2. 도서 대출하기, 3. 내 대출 목록, 4. 종료");
			System.out.print("메뉴 > ");
			try {
				int menu = Integer.parseInt(br.readLine());
				if(menu==1) { // 도서 목록
					dao.selectListBook();
				}
				else if(menu==2) { // 도서 대출하기
					System.out.println("도서 검색");
					dao.selectListBook();
					ReservationVO vo = new ReservationVO();
					vo.setMe_num(me_num);
					while(true) {
						System.out.println("대출할 도서 번호를 입력하세요(입력 중지: 0)");
						System.out.print("번호 > ");
						vo.setBk_num(Integer.parseInt(br.readLine()));
						if(vo.getBk_num()==0) break; // 메뉴로 되돌아가기
						int reserved=dao.getStatusReservation(vo.getBk_num()); // 대출 여부 확인
						if(reserved==1) {
							System.out.println("대출 중인 도서는 신청할 수 없습니다.");
						}
						else if(reserved==-1) {
							System.out.println("도서 번호를 잘못 입력했습니다.");
						}
						else {
							dao.insertReservation(vo);
							break;
						}
					}
				}
				else if(menu==3) { // 내 대출 목록
					dao.selectMyList(me_num);
					System.out.println("반납할 도서의 대출 번호를 입력하세요(입력 중지: 0)");
					System.out.print("대출 번호 > ");
					int re_num = Integer.parseInt(br.readLine());
					if(re_num==0) continue; // 메뉴로 되돌아가기
					int bk_status = dao.getStatusBack(re_num, me_num);
					if(bk_status!=1) {
						System.out.println("대출하지 않은 도서는 반납할 수 없습니다.");
						continue; // 메뉴로 되돌아가기
					}
					dao.updateReservation(re_num);
				}
				else if(menu==4) { // 종료
					System.out.println("프로그램을 종료합니다.");
					break;
				}
				else {
					System.out.println("메뉴 번호를 잘못 입력했습니다!");
				}
			}
			catch (NumberFormatException e) {
				System.out.println("숫자만 입력 가능합니다!");
			}
		}
	}
	
	public static void main(String[] args) {
		new BookUserMain();
	}
}

설치

https://www.egovframe.go.kr/home/sub.do?menuNo=41

  1. 개발자용 개발환경 64bit 3.10.0 버전을 다운로드하고 C:\javaWork\apps로 이동
  2. 압축 해제 후 이클립스를 실행하고 경로를 C:\javaWork\apps\eGovFrameDev-3.10.0-64bit\workspace로 변경
  3. Create a Project...-Java Project 선택하고 새 프로젝트 ch15-jdbc 생성 후 Open Perspective 선택
  4. src 폴더 오른쪽 클릭하고 New-Other...-AmaterasERD-ER Diagram 선택하여 member.erd 생성

ERD(Entity-Relationship Diagram)

ERD

  1. 빈 화면을 오른쪽 클릭하여 Change Database Type 선택하고 Oracle 선택
  2. 좌측 메뉴에서 Table을 선택하고 빈 화면을 클릭하여 TABLE_1 생성
  3. TABLE_1을 더블 클릭하고, Logical Table Name을 회원 관리, Physical Table Name을 member로 변경
  4. Column 탭 선택하고 Add Column 선택 후, Logical Column Name을 회원 번호, Physical Column Name을 num, Type을 NUMBER - Numeric으로 지정하고, Size 값 삭제하고 PK 체크 후 OK
  5. 좌측 메뉴에서 Table을 선택하고 빈 화면을 클릭하여 TABLE_2 생성
  6. TABLE_2를 더블 클릭하고, Logical Table Name을 게시판, Physical Table Name을 board로 변경
  7. Column 탭 선택하고 Add Column 선택 후, Logical Column Name을 번호, Physical Column Name을 bo_num, Type을 NUMBER - Numeric으로 지정하고, Size 값 삭제하고 PK 체크
  8. 좌측 메뉴에서 Reference 선택 후 boardmember를 차례로 클릭하여 FK 설정
  9. 저장

다음으로