자바 기능 복습 [도사관 대여프로그램] insert, selectAll, selectOne, delete + 도서 대여 및 반납 기능
Main 화면
[첫 구성]
1. ui화면에서 사용자로부터 정보를 입력 받을 것이기 때문에 scanner를 사용하고, VO별 서비스를 다르게 사용할 것이기 때문에 VO 이름에 맞게 Manager 객체 생성
2. BookUI 기본 생성자 안에 무한루프 안에 메인화면 코드를 집어넣고, switch~case를 이용해 시용자로부터 입력받은 번호에 해당하는 기능을 가진 함수로 이동한다.
사용자가 0을 누를 경우, 프로그램 종료 안내를 하고 while문을 돌게 하는 run변수에 false를 집어넣어 더 이상 프로그램이 돌아가지 않게 종료시킨다. 해당 번호가 아닐 경우 멈추고 다시 While문을 돈다.
[sql]
--도서 정보 테이블 생성 SQL
CREATE TABLE com_book
(
isbn varchar2(10) primary key
, bname varchar2(30) not null
, bcount number not null
);
--대여 정보 테이블 생성 SQL
CREATE TABLE com_loan
(
num number primary key
, inputdate date default sysdate
, isbn varchar2(10) not null references com_book(isbn)
, quantity number not null
);
--대여 정보 일련번호 생성 SQL
CREATE SEQUENCE com_loan_seq;
<순서> UI → SERVICE → DAO → MAPPER → MAPPER.xml → DB
[1번. 도서 등록] insert
사용자가 1번을 누르면, bookInsert(); 함수가 작동하게 된다.
사용자로부터 입력 받을 정보인 도서 isbn, 도서명, 수량을 입력 받을 수 있게 스캐너를 이용하고, isbn, bname, bcount라는 변수를 선언해 사용한다. 입력받은 정보인 isbn, bname, bcount를 Book라는 객체에 book라는 변수로 새로 생성해 준다. productInsert라는 함수를 통해 bookManager 객체의 bmgr로 전달인자 book과 함께 전달하고 그 값을 int타입 result라는 변수로 받는다.
BookDAO를 새로 생성하고 생성된 DAO로 book 전달인자와 함께 전달
리턴값은 int타입이다.
insert, delete, update와 같이 데이터의 변화가 발생하는 기능들은 반드시 session.commit();을 해줘야 한다.
완료되면 Mapper.xml로 이동해서 ;를 제외하고 쿼리를 작성!
id는 Mapper.java 인터페이스 안의 함수명이다.
[2번 도서 전체 보기] selecctAll
도서 정보를 전부 출력할 것이기 때문에 Book객체를 ArrayList에 담는다.
Book 객체를 bookSelect()함수를 통해 조회할 것이다.
도서 전체 정보를 출력할 것이기 때문에 리턴 타입은 ArrayList<Book>이고, 전달인자는 없다.
ui, service, dao까지는 함수명이 달라도 되지만 반드시 mapper.java와 mapper.xml에서는 함수명이 같아야 한다.
쿼리문
[3. 도서 대여]
대여를 하기 위해서 대여하고자 하는 책의 정보를 조회하고 이후 그 책이 존재한다면 update로 대여한 책과 이후 해당 책의 대여가능한 책의 수를 변경해주어야 한다.
private void loanRegist() {
sc.nextLine();
System.out.println(" [도서 대여 ] ");
String isbn;
System.out.println("도서 ISBN: ");
isbn = sc.next();
Book book = bmgr.selectOne(isbn);
if(book == null) {
System.out.println("**도서 정보가 존재하지 않습니다.");
return;
}
int bcount = book.getBcount();
System.out.println("대여 가능 수량 : " + bcount);
int quantity;
System.out.println("대여 수량 :");
quantity = sc.nextInt();
if(bcount < quantity) {
System.out.println("대여 가능한 수량을 다시 확인해주세요.");
return;
}
Loan loan = new Loan(0, null, isbn, quantity);
int result = lmgr.update(loan);
if(result ==0) {
System.out.println("대여 실패");
}
bcount -= quantity;
book.setBcount(bcount);
int result2 = bmgr.modify(book);
if(result2 == 0) {
System.out.println("대여 실패");
}
System.out.println("대여 성공!");
}
먼저 책이 있는지 isbn으로 조회
조회한 정보가 없다면 그 책은 존재하지 않는 것이기 때문에 알림
조회 selectOne(isbn)으로 가져온 Book 객체의 변수 book를 통해 대여 가능한 수량을 변수 bcount에 대입 후,
대여 가능 수량으로 사용자에게 알린다.
대여 가능한 수량을 확인하고 대여 원하는 수량을 사용자가 입력하면 getter를 통해 가져온 Book의 bcont 대여 가능 수량보다 작은 경우만 대여 가능하게 설정
대여하고 싶은 숫자가 대여 가능한 숫자보다 작을 경우에 한해 정보 수정을 위해
Loan loan = new Loan(0, null, isbn, quantity)의 형태로
입력받은 값이 없는 컬럼의 경우 초기화된 값 0 혹은 null로 만들어 새로운 객체를 생성한다.
그 객체(loan)를 전달인자로 수정하러 gogo!
입력받은 값이 있을 경우 #{변수명}으로 값을 수정한다.
다시 UI로 돌아와 수정이 되었다면 DB에서 1행 수정 완료로 숫자를 리턴 받게 되고
int result 안에 값이 대입된다.
그 값이 0이라면 수정되지 않았다는 것을 의미해 대여 실패라는 알림을 날려주고,
아닐 경우인 result ==1이라면
밑의 행으로 내려와
대여한 수만큼 대여가능한 도서의 수를 차감하기 위해
bcount -= quantity;
bcount = bcount -quantity; 를 수행!
이후 setter를 통해 차감된 수를 book 객체에 값을 넣어준다.
값이 변경된 도서 수량을 의미하는 bcount의 값을 DB에도 수정하기 위해 modify라는 함수를 이용, 전달인자는 Book의 변수 book이다. 여기서도 int result를 통해 업데이트 여부를 확인한다.
0이라면 대여 실패, 1이라면 대여 성공이다.
[4.대여정보 전체 보기]
함수 loanSelect를 통해 가져온 값을 List<Loan> list에 넣고,
만약 List<List>의 변수 list가 비어있다면 대여정보가 없다고 알림창
null이 아니라면 아래로 실행되어 향상된 for문을 통해 반복하면서 대여정보를 출력한다.
[도서 반납]
조회 후 수량 정보 변경
private void loanReturn() {
sc.nextLine();
System.out.println(" [도서 반납 ] ");
int num;
System.out.println("반납할 번호: ");
num = sc.nextInt();
sc.nextLine();
Loan loan = lmgr.selectOne(num);
if(loan == null) {
System.out.println("**반납할 도서 정보가 없습니다.");
return;
}
int quantity = loan.getQuantity();
System.out.println("반납 가능 수량 :" + quantity);
System.out.println("반남 수량: ");
int inputnum = sc.nextInt();
if(inputnum > quantity) {
System.out.println("다시 입력해주세요.");
return;
}
int result = 0;
if(inputnum <= quantity) {
result = lmgr.quantityModify(num);
}
if(result == 0) {
System.out.println("반납 실패");
return;
}
String isbn = loan.getIsbn();
Book book = bmgr.selectOne(isbn);
int bcount = book.getBcount();
bcount += inputnum;
book.setBcount(bcount);
int result2 = bmgr.modify(book);
if(result2 == 0) {
System.out.println("반납 실패");
}
System.out.println("반납 성공!");
}
대여 정보를 불러오도록 num을 사용자에게 입력받고,
입력받은 num을 가지고 대여 정보를 조회한다.
조회된 정보는 Loan loan에 대입한다.
함수를 통해 가져온 값이 없다면 loan == null
반납할 도서가 없다고 알림창
null이 아니라면 반납 가능 수량을 의미하는 Loan의 컬럼 중 하나인 quantity를 getter를 통해 가져와 사용자에게 보여준다. 이후 사용자가 현재 반납하고 싶은 수량을 의미하는 inputnum을 선언해 스캐너를 통해 입력 받음
입력 받은 수량이 반납 가능한 수량보다 많으면 안되기 때문에 if을 통해 검사하고 입력받은 숫자 inputnum이 quantity보다 크다면 다시 입력해달라는 입력창을 띄어준다.
대여수량보다 반납할 책의 권수가 적어도 반납 가능해야한다.
Loan loanloan = new Loan(num, null, null, quantity);를 setter를 이용해 아래와 같이 넣을 수 있다.
수정완료
입력 받은 반납 수량이 반납 가능 수량과같을 경우에는 그 값을 delete 해준다.
이 때의 전달인자는 num이다.
왜냐하면 대여정보에 더 이상 남아있을 필요가 없기 때문이다.
반납 가능 수량과 반납수량이 동일할 경우는 더 이상 대여 정보에 있을 필요가 없다.
그저 수량에 추가만될뿐!!
책이 반환되어 돌아온만큼 대여 가능한 책의 수 bcount를 변경해주어야 한다.
변경되고 returm값이 1이 되면 변경 완료! 끝!!