Dev/Spring boot

스프링부트 미니 프로젝트 : Spring boot 도서관리시스템 웹 만들기 (7. 대출 테이블, 도서반납)

uragil 2022. 11. 30. 18:29
반응형

br_input  

도서의 대출정보를 입력 받는 페이지

 

도서정보 입력과 거의 같고 input name만 맞춰서 작업하였다.

br_inputOk 페이지를 만들어서 입력받은 값들이 DB에 존재하는지 확인하는 작업을 해주었다. 

 

br_input.jsp 전제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">

<script type="text/javascript" src="${pageContext.request.contextPath }/resources/js/input.js"></script>
<title>Insert title here</title>

<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/css/content.css?after">
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/css/main.css?after">
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/css/member.css?after">
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/css/header.css?after">
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/css/menu.css?after">
</head>
<body>
	<%@ include file="include/header.jsp" %>
	<center>	
	<table width="70%" border="0" cellspacing="0" cellpadding="10">
		<tr height="530">
			<td bgcolor="#bbbbbb" align="center" height="500">
				<form action="br_inputOk" method="get" name="brreg_frm">
				<table>
					<table bgcolor="#fff" height="120" width="300" cellspacing="10px">
						
							<tr align="center">
							<td colspan="2" >
							<span class="content05">대출정보 입력</span>
							</td>
						</tr>				
						<tr align="right">
							<td>
									<span class="content03" >도서코드 :</span>
							</td>
							<td>
								<input  type="text" name="brbcode">
							</td>
							
						<tr align="right">
							<td>
									<span class="content03" >회원ID :</span>
							</td>
							<td>
								<input  type="text" name="brmid">
							</td>
						</tr>
				
						<tr>
							<td colspan="2"  align="right">
								<input class="button01" type="button" value="대출정보 입력" onclick="brinputCheck()">	
							</td>
						</tr>
						<tr>
							<td colspan="2"  align="right">
								<input class="button03" type="button" value="도서정보" onclick="location.href='book_list'">
								<input class="button03" type="button" value="대출정보" onclick="location.href='br_list'">
								<input class="button03" type="button" value="HOME" onclick="location.href='home'">
							</td>
						</tr>
						</table>						
					</table>
					</form>
		</tr>
	</table>
	</center>
<%@ include file="include/footer.jsp" %>	
</body>
</html>

 

checkbrbcode 대출 테이블에 들어오는 도서코드가 도서테이블에 있는 도서코드에 들어있는지 확인하는 값

checkhavebcode 대출 테이블에 도서코드가 있는지 확인하는 값 (있으면 이미 대출 중)

checkbrmid 대출 테이블에 들어오는 id가 멤버 테이블에 있는 id인지 확인 하는 값 

 

dao를만들고 mapper에서 query 작성하여 위 값들을 확인하여 걸러주는 역할이다.

 

<%
int checkbrbcode = Integer.parseInt(request.getAttribute("checkbrbcode").toString());
int checkhavebcode = Integer.parseInt(request.getAttribute("checkhavebcode").toString());
int checkbrmid = Integer.parseInt(request.getAttribute("checkbrmid").toString());

 

해당 값들을 순차적으로 체크하여 if문에 안걸리면 입력을 알려주고 db에 저장

 

br_inputOk.jsp 전제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="${pageContext.request.contextPath }/resources/js/join.js"></script>
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/css/member.css?after">
<title>Insert title here</title>
</head>
<body>

<%@ include file="include/header.jsp" %>

	<center>	
	<table width="70%" border="0" cellspacing="0" cellpadding="20">
		<tr height="500">
			<td bgcolor="d5d5d5" align="center">
				<%
					int checkbrbcode = Integer.parseInt(request.getAttribute("checkbrbcode").toString());
					int checkhavebcode = Integer.parseInt(request.getAttribute("checkhavebcode").toString());
					int checkbrmid = Integer.parseInt(request.getAttribute("checkbrmid").toString());
					if(checkbrbcode != 1) {
				%>
				<script type="text/javascript">
					alert("입력하신 도서코드가 존재하지 않습니다. 도서코드를 확인해주세요.");
					history.go(-1);
					brreg_frm.brbcode.focus();
				</script>
				<%
					}else if(checkhavebcode ==1){
			 	%>
				<script type="text/javascript">
					alert("이미 대출중인 도서코드 입니다. 도서코드를 확인해주세요.");
					history.go(-1);
					brreg_frm.brbcode.focus();
				</script>
				<%
					}else if(checkbrmid !=1){
			 	%>
				<script type="text/javascript">
					alert("입력하신 ID가 존재하지 않습니다. 회원ID를 확인해주세요");
					history.go(-1);
					brreg_frm.brmid.focus();
				</script>
				<%
					} 
				%>
						
				<span class="content01"> 
				도서코드 '${brbcode }' 의 도서정보가 입력되었습니다.<br><hr>
			
				<input class="button01" type="button" value="계속입력" onclick="location.href='br_input'"><br><br><br>			
				<input class="button03" type="button" value="대출정보열람" onclick="location.href='br_list'">
			</td>		
		</tr>
	</table>
	</center>
	
<%@ include file="include/footer.jsp" %>
</body>
</html>

 

 

dao

	//대출정보 입력 전확인dao
    public int checkbrbcodeDao(String brbcode);
	public int checkhavebcodeDao(String brbcode);
	public int checkbrmidDao(String brmid);
    
    //대출정보 입력dao
    public void br_inputDao(String brbcode, String brmid);

 

mapper 

	<select id="checkbrbcodeDao" resultType="int">
		SELECT COUNT(*) FROM b_book WHERE bcode = #{param1}
	</select>
	
	<select id="checkhavebcodeDao" resultType="int">
		SELECT COUNT(*) FROM b_borrow WHERE brbcode = #{param1}
	</select>
	
	<select id="checkbrmidDao" resultType="int">
		SELECT COUNT(*) FROM b_member WHERE mid = #{param1}
	</select>
    
   	<insert id="br_inputDao">
		INSERT INTO b_borrow(brcode, brbcode, brmid) VALUES(b_borrow_seq.nextval, #{param1}, #{param2})
	</insert>

 

Controller

inputOk에서는  request.getParameter에서 빼서 brbcode/ brmid 에 저장

 

String brbcode = request.getParameter("brbcode");
String brmid = request.getParameter("brmid");

 

mapper에서 쿼리를 돌려 나온 값들을 저장하고 model.addAtrribute에 담아 내보낸다.

int checkbrbcode = dao.checkbrbcodeDao(brbcode);
int checkhavebcode = dao.checkhavebcodeDao(brbcode);
int checkbrmid = dao.checkbrmidDao(brmid);

 

model.addAttribute("checkbrbcode", checkbrbcode);     
model.addAttribute("checkhavebcode", checkhavebcode);
model.addAttribute("checkbrmid", checkbrmid);

 

세가지 조건을 만족하면 순차적으로 dao를 호출하여 query를 실행

if (checkbrbcode == 1 & checkhavebcode !=1 & checkbrmid ==1) {
dao.brcountDao(brbcode);  
dao.br_inputDao(brbcode, brmid);
dao.bstateDao();

 

대출 도서코드와 대출자 아이디를 model.addAttribute에 담아 내보내기 
model.addAttribute("brbcode", brbcode);
model.addAttribute("bname", brmid);

 

Controller(input, inputOk)

@RequestMapping(value="/br_input")
	public String br_input() {
		return "br_input";
	}
	
	
@RequestMapping(value ="/br_inputOk")
	public String br_inputOk(HttpServletRequest request, Model model) {
		String brbcode = request.getParameter("brbcode");
		String brmid = request.getParameter("brmid");
								
		IDao dao = sqlSession.getMapper(IDao.class);
		
		int checkbrbcode = dao.checkbrbcodeDao(brbcode);
		int checkhavebcode = dao.checkhavebcodeDao(brbcode);
		int checkbrmid = dao.checkbrmidDao(brmid);
		if (checkbrbcode == 1 & checkhavebcode !=1 & checkbrmid ==1) {
			dao.brcountDao(brbcode);	 	
			dao.br_inputDao(brbcode, brmid);
			dao.bstateDao();
						
			model.addAttribute("brbcode", brbcode);
			model.addAttribute("bname", brmid);
		}
		model.addAttribute("checkbrbcode", checkbrbcode);	    
		model.addAttribute("checkhavebcode", checkhavebcode);
		model.addAttribute("checkbrmid", checkbrmid);
		
		return  "brinputOk";
	}

 

br_list 대출정보 리스트 페이지

구현하느라 가장 해멨던 부분이다.  

seq로 부여되는 대출코드와 도서코드, 대출회원ID, 대출일, 반납예정일, 반납상태를 보여준다. 

 

옵션 검색 submit은  br_list로 보내는 action과

반납확인 버튼의 submit은 br_update로 보내는 action 으로 두 개의 form으로 나누어 주었다.

한 페이지에서 복수의 form을 사용한 경험이 없어서 생각하는데 고생했다.

 

세션 id를 확인하여 admin 이면 대출 리스트 전체를 보여주고 

admin이 아닌 경우 해당 id의 대출정보만 보이도록 만들었다. 

 

String id=(String)session.getAttribute("id");
if(id.equals("admin")){
<input type="text" name="searchKeyword" >
<input type="submit" value="검색">
    } else {
     ${id}님의 대출정보

 

book_list와 같은 방법으로 brdto를 forEach문으로 돌려 출력하였다..

<c:forEach items="${br_list}" var="brdto">

<td class="board02">${brdto.brcode}</td>
<td class="board02">${brdto.brbcode}</td>
<td class="board03">${brdto.brmid}</td>

 

fn을 사용하여 날짜는 두자리 년도와 월, 일까지만 출력 
<c:out value="${fn:substring(brdto.sdate,2,11)}"/>
<c:out value="${fn:substring(brdto.rdate,2,11)}"/>

 

세션id가 admin 이면 반납버튼이 보여지도록 if문 작성

if(id.equals("admin")){

 

c:if문을 사용하여 반납예정일이 비어있으면 반납완료를 표시하는 버튼을 만들어주었다
<c:if test="${brdto.rdate == null}">
<td colspan="5" align="right">
<input class="button06" type="button" value="반납완료" >
</c:if>

 

다시 c:if문으로 반납예정일이 나와있으면 대출도서 반납 update를 위한 반납확인 버튼이 보여진다. 

<c:if test="${brdto.rdate != null}">

 

반납확인 버튼은 두번째 form으로 대출코드를 받아 br_update로 보낸다.
<form action='br_update?brcode=${brdto.brcode}'> 

 

input type='hidden'

실제 화면에서는 보이지 않지만  value 값을 전달하기 위해 사용된다. 

 

submit 발생하면 대출코드와 대출도서코드를  hidden으로 전달한다. 

<input type="hidden" name= "brcode" value="${brdto.brcode}">
<input type="hidden" name= "brbcode" value="${brdto.brbcode}">
<input class="button02" type="submit" value="반납확인">
</form>

br_list.jsp 전체

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="${pageContext.request.contextPath }/resources/js/input.js"></script>
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/css/menu.css?after">
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/css/board.css?after">
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/css/header.css?after">
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%@ include file="include/header.jsp" %>

	<center>	
	<table width="70%" border="0" cellspacing="0" cellpadding="10">
		<tr>
			<td align="center"></td>
		</tr>
		<tr>
			<td align="center" height=""></td>
		</tr>
					<table border="0" cellspacing="0" cellpadding="10">
					
						<form action="br_list"> 
							<tr>
								<td colspan="2"align="left">
								<span class="content01">대출정보 목록</span></td>
								<td colspan="5" align="right">
								<select name="searchOption">
           							<option value="brmid">아이디</option>
          						</select>
									
          						<%
								String id=(String)session.getAttribute("id");
								if(id.equals("admin")){
								%>
									<input type="text" name="searchKeyword" >
									<input type="submit" value="검색">
							    <%
							    } else {
						    	%>
							    	${id}님의 대출정보 
						    	<%
						    	}
						    	%>				      
							   </td>
							</tr>								
						</form>											
							<tr class="board01" >
								<td >대출코드</td>
								<td >도서코드</td>
								<td >회원ID</td>
								<td >대출일</td>
								<td >반납예정일</td>
								<td >반납상태</td>
								<td > </td>
							</tr>
							<c:forEach items="${br_list}" var="brdto">
							<tr>
								<td class="board02">${brdto.brcode}</td>
								<td class="board02">${brdto.brbcode}</td>
								<td class="board03">${brdto.brmid}</td>
								
								<td class="board02">
								<c:out value="${fn:substring(brdto.sdate,2,11)}"/>
								</td>
								
								<td class="board02">
								<c:out value="${fn:substring(brdto.rdate,2,11)}"/>
								</td>
								
								<td class="board03">${brdto.bstate}</td>
								
								<%
								
								if(id.equals("admin")){
								%>
								<c:if test="${brdto.rdate == null}">
								<td colspan="5" align="right">
								
									<input class="button06" type="button" value="반납완료" >
								</td>
								</c:if>
								<c:if test="${brdto.rdate != null}">
								<td colspan="5" align="right">
								
								<form action='br_update?brcode=${brdto.brcode}'> 
									<input type="hidden" name= "brcode" value="${brdto.brcode}">
									<input type="hidden" name= "brbcode" value="${brdto.brbcode}">
									<input class="button02" type="submit" value="반납확인">
								</form>	
								
								</td>
								</c:if>
								<%
								}
								%>								
							</tr>
							</c:forEach>
							<tr>
							<td colspan="7"  align="right">
								<hr>	

								<%
								
								if(id.equals("admin")){
								%>
								
								<input class="button07" type="button" value="대출입력" onclick="location.href='br_input'">&nbsp;&nbsp;
								<%
								}
								%>
								
								<input class="button03" type="button" value="도서열람" onclick="location.href='book_list'">&nbsp;&nbsp;	
								<input class="button03"type="button" value="홈으로" onclick="location.href='home'">
							</td>
						</tr>						
					</table>
				</form>
			
		</tr>
	</table>
	</center>
<%@ include file="include/footer.jsp" %>
</body>
</html>

 

Dao

	public ArrayList<BorrowDto> br_listDao();//리스트 가져오기
	public ArrayList<BorrowDto> IdSearchlistDao(String keyword);
	
	public void br_updateDao(String brcode, String rdate, String bstate);

mapper

br_listDao 전체 리스트를 불러오는 query

IdSearchlistDao param으로 받은 id값에 해당되는 리스트만 불러오는 query

br_updateDao 대출코드를 받아 대출상태와 반납예정일을 update 하는 query(도서 반납처리) 

 

bstateDao 

b_book 도서테이블의 bstate대출상태와 rdate반납일을 where 조건이 (b_book.bcode==b_borrow.brbcode) 두개 같은 것을 찾아 b_borrow 반납테이블의 bstate 대출상태와 rdate 반납일로 업데이트 하는 query

trigger를 사용하면 좀 더 깔끔할거 같은데 나중에 고쳐봐야겠다 .

	<select id="br_listDao" resultType="com.uragil.LMS.dto.BorrowDto">
		SELECT * FROM b_borrow ORDER BY sdate DESC
	</select>
	
	<select id="IdSearchlistDao" resultType="com.uragil.LMS.dto.BorrowDto">
		SELECT * FROM b_borrow WHERE brmid LIKE '%'|| #{param1} ||'%' ORDER BY brmid DESC, sdate DESC  
	</select>    
    
    <update id="br_updateDao">
		UPDATE b_borrow SET bstate=#{param1}, rdate=#{param2} WHERE brcode=#{param3} 	
	</update>
    
    <update id="bstateDao">
		UPDATE b_book T1 SET T1.bstate = (SELECT DISTINCT T2.bstate FROM b_borrow T2 WHERE T2.brbcode = T1.bcode),T1.rdate = (SELECT DISTINCT T2.rdate FROM b_borrow T2 WHERE T2.brbcode = T1.bcode) WHERE T1.bcode IN (SELECT DISTINCT T2.brbcode FROM b_borrow T2 WHERE T2.brbcode = T1.bcode)
	</update>

 

 

Controller

controller에서 admin br_list 와 일반회원 mbr_list로 나누어 받아주었다.

네비 메뉴에서 session id 확인하여 admin 일때는 br_list로  그렇지 않으면 mbr_list로 링크를 걸었다.

 

option과 keyword를 받아 저장하고 

String searchKeyword = request.getParameter("searchKeyword");
String searchOption = request.getParameter("searchOption");

 

option값이 없을때 br_listDao를 호출하고

ArrayList<BorrowDto> brDtos = null;

if(searchOption == null || searchKeyword == null) {

brDtos = dao.br_listDao();

 

brmid-대출자id가 키워드로 들어왔을때 IdSearchlistDao를 호출한다. 

if(searchOption.equals("brmid")) {
brDtos = dao.IdSearchlistDao(searchKeyword);

 

세션 id를 받아 해당 id를 키값으로 IdSearchlistDao를 호출

HttpSession session = request.getSession();
IDao dao = sqlSession.getMapper(IDao.class);

String sessionId = (String) session.getAttribute("id");
String mid = sessionId;
ArrayList<BorrowDto> brDtos = dao.IdSearchlistDao(mid);
 

반납을 위한 br_update 에서는 

hidden으로 넘겨 받은 brcode (대출코드)와 brbcode(대출도서 코드)를 받아 저장하고

bstate(대출상태), rdate(반납예정일)를 null값으로 바꾸어 저장해주었다. 

대출도서 코드 앞에 'a' 문자를 더해주어, 반납 완료된 도서코드와 반납 전의 대출 코드를 구분해 주었다.

 

String brcode = request.getParameter("brcode");
String bstate = "";
String rdate = "";
String brbcode = request.getParameter("brbcode");
brbcode = "a"+ brbcode;

 

null값으로 세팅된 대출상태와 반납예정일과 대출코드를 인수로 br_updateDao를 호출
dao.br_updateDao(bstate, rdate, brcode);

 

bsateDao로 도서테이블 update

dao.bstateDao();

 

문자열 a가 붙은 brcode를 brbcode로 update하는 rbcodeDao를 호출

dao.rbcodeDao(brbcode, brcode);

 

controller(br_list, br_update)

@RequestMapping(value ="/br_list")
	public String br_list(HttpServletRequest request, Model model) {
		String searchKeyword = request.getParameter("searchKeyword");
		String searchOption = request.getParameter("searchOption");
		IDao dao = sqlSession.getMapper(IDao.class);
		
		ArrayList<BorrowDto> brDtos = null;
		if(searchOption == null || searchKeyword == null) {
			brDtos = dao.br_listDao();
		} else {
			if(searchOption.equals("brmid")) {
				brDtos = dao.IdSearchlistDao(searchKeyword);
			}
		}					
		model.addAttribute("br_list", brDtos);
		return "br_list";
	}
    
@RequestMapping(value ="/mbr_list")
	public String mbr_list(HttpServletRequest request, Model model) {
	
		HttpSession session = request.getSession();
		IDao dao = sqlSession.getMapper(IDao.class);
		
		String sessionId = (String) session.getAttribute("id");
		String mid = sessionId;
		ArrayList<BorrowDto> brDtos = dao.IdSearchlistDao(mid);
		model.addAttribute("br_list", brDtos);	
		return "mbr_list";
		
	}
    
    
@RequestMapping(value = "/br_update")
	public String br_update(HttpServletRequest request) {
	
		IDao dao = sqlSession.getMapper(IDao.class);	
		String brcode = request.getParameter("brcode");
		String bstate = "";
		String rdate = "";
		String brbcode = request.getParameter("brbcode");
		brbcode = "a"+ brbcode;
		
		//brbcode 업데이트 문자열 붙여주기 
		dao.br_updateDao(bstate, rdate, brcode);
		dao.bstateDao();
		dao.rbcodeDao(brbcode, brcode);
		return "redirect:br_list";

 

프로젝트 구현은 이렇게 끝.

다음은 oracle cloud를 통한 배포 과정

 

 

 
반응형