STUDY/Spring boot

Spring Boot로 만드는 도서관리시스템웹 프로젝트_05

uragiljay 2022. 6. 29. 00:48
반응형

1주일 정도 하다보면 끝날거라 생각했는데  아직 진행중인 도서관리시스템 프로젝트 5회차

 

반납버튼이 일하게 되었다. 

 

대출리스트 반납버튼 동작

반납확인 버튼 작동시 

1. 대출코드를 확인하여

2. 해당 도서코드 앞에 a를 붙여주고

3. 반납예정일과 반납상태를 null 값으로 업데이트 해주는 작업

4. 작동 후에는  '반납완료' 로 변하고 끝.

 

업데이트가 되면서  (프로젝트 04편에 만들어 둔 bstateDao에 의해 )

도서목록에 대출상태와 반납예정일도 동시에 null 값으로 업데이트 된다.

도서리스트

코드를 보자

먼저 IDao 에 br_updateDao() 과 rbcodeDao() 을 만들었다. 

### IDao ###
public void br_updateDao(String brcode, String rdate, String bstate);
public void rbcodeDao(String brbcode, String brcode);

 

그리고 매퍼로 이동 SQL문 만들기

br_updateDao

param1, 2, 3의 매개변수를 받아 대출코드(brcode)를 확인하여

대출상태(bstate)와  반납일(rdate) 을 업데이트

 

rbcodeDao

대출코드(brcode)를 확인하여 대출테이블.도서코드(brbcode)를

업데이트 해주도록 하였다. 

## mapper ##
<update id="br_updateDao">
    UPDATE b_borrow SET bstate=#{param1}, rdate=#{param2} WHERE brcode=#{param3} 	
</update>

<update id="rbcodeDao">
    UPDATE b_borrow SET brbcode=#{param1} WHERE brcode=#{param2} 	
</update>

 

대출리스트.jsp 에서는

<c:if >문으로 반납일이 비어있으면 반납완료 버튼으로 바꿔주고

반납일이 null이 아니라면 반납확인 버튼이 활성화 된다. 

버튼을 누르면 br_update 로 도서코드와 대출코드를 hidden 값으로 가지고 submit해준다.

 

이전에는 form 없이 button onclick 으로 대출코드 1개만 가져가도록 되어있었는데

도서코드를 같이 보낼 방법을 찾지 못하고있다가 form action 과 submit을 사용하여 성공!

##대출리스트.jsp###
<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>

 

 

컨트롤러에서 위 버튼에서 들어온 /br_update 요청을 받아 맵핑

가지고온 대출코드(brcode)를 받아 저장해두고

도서코드(brbcode)를 받아서 앞에 문자"a"를 더해 저장하고

대출상태(bstate)와 반납일(rdate) 은 null 값으로 저장

그리고 위에 Idao 에서 만들어 놓은 dao를 차례로 불러 일을 시켜준다. 

@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;
        
		dao.br_updateDao(bstate, rdate, brcode);
		dao.bstateDao();
		dao.rbcodeDao(brbcode, brcode);
		return "redirect:br_list";
	}

도서 리스트에서 도서타이틀에 태그 링크를 걸어 수정 페이지를 만들어줬다 

session 이용하여 관리자만 태그가 보이도록 수정이 필요하니까 미래의 나야 부탁해

 

도서정보 수정페이지

 

IDao 에서 수정페이지를 보여주는 modifyViewDao와

수정 정보를 업데이트 해주는 bookModifyDao 두개를 만들어주고

**IDao**
public BookDto modifyViewDao(String bcode);
public void bookModifyDao(String bcode, String bname, String bcategori, String bwriter);

 

매퍼에서 도서코드를 확인하여 도서테이블 전체를 보여주는 modifyViewDao와

도서코드를 확인하여 수정된 타이틀, 장르, 작가 정보를 받아 입력해 주는 bookModifyDao의

SQL문을 만들어 주었다. 

<select id="modifyViewDao" resultType="com.uragil.LMS.dto.BookDto">
    SELECT * FROM b_book WHERE bcode = #{param1}
</select>


<update id="bookModifyDao">
    UPDATE b_book SET bname=#{param1}, bcategori=#{param2}, bwriter=#{param3} WHERE bcode=#{param4} 	
</update>

 

컨트롤러에서는 jsp에서 도서타이틀의 태그와 연결해준 b_modifyView

와 함께 보내진 bcode를 받아받아 저장해두고 

모델에 bDto 정보를 담아 view 페이지에 뿌려줄 준비를 해둔다 

 

수정 버튼과 연결해준 b_modifyOk는

수정된 정보들을 저장하여 업데이트해주는 bookModifyDao 만 불러주면 끝

@RequestMapping(value ="/b_modifyView")
public String b_modify(HttpServletRequest request, Model model) {
    String bcode = request.getParameter("bcode");
    IDao dao = sqlSession.getMapper(IDao.class);
    BookDto bDto = dao.modifyViewDao(bcode);
    model.addAttribute("bDto", bDto);
    return  "b_modifyView";
}

@RequestMapping(value = "/b_modifyOk")
public String b_modifyOk(HttpServletRequest request) {
    IDao dao = sqlSession.getMapper(IDao.class);
    String bcode = request.getParameter("bcode");
    String bname = request.getParameter("bname");
    String bcategori = request.getParameter("bcategori");
    String bwriter = request.getParameter("bwriter");
    dao.bookModifyDao(bname, bcategori, bwriter, bcode);
    return "redirect:book_list";
}

 

도서정보수정.jsp 뷰페이지에서는 EL표기법으로 bdto에 담긴 내용만 적어주면 끝

<c:forEach items="${b_list }" var="bdto">
    <tr class="board02" align="center">
        <td  class="board02">${bdto.bcode}</td>
        <td  class="board03"><a href="b_modifyView?bcode=${bdto.bcode }">${bdto.bname}</a></td>
        <td  class="board02">${bdto.bcategori}</td>
        <td  class="board02">${bdto.bwriter }</td>

 


에러노트

 

1. single row subquery returns more than one row.... 

어제는 잘 작동하던 반납버튼이 갑자기 일을 안하고 에러를 뱉기 시작

에러 내용은 컬럼이 1개만 나와야 sql문을 수행할 수 있는데 2개이상의 컬럼이 나왔다는 것

 

아래 도서테이블의 대출상태와 반납일을 반납테이블의 대출상태와 반납일로 업데이트 하는 중에 발생

where 조건이 (도서테이블.도서코드==대출테이블.도서코드) 두개 같은 것을 찾아 업데이트 해야하는데

대출이 쌓이면서 반납된 책이 재대출되면 도서코드가 중복으로 생성되어 발생한다는 것을 알게되었다.

 

<update id="bstateDao">
		UPDATE b_book T1 SET T1.bstate = (SELECT T2.bstate FROM b_borrow T2 WHERE T2.brbcode = T1.bcode),T1.rdate = (SELECT T2.rdate FROM b_borrow T2 WHERE T2.brbcode = T1.bcode) WHERE T1.bcode IN (SELECT T2.brbcode FROM b_borrow T2 WHERE T2.brbcode = T1.bcode)
	</update>

 

해결방법은 

대출도서 반납시에  도서코드에 문자 a를 추가하여 도서코드 중복문제를 해결 하였다. 

반납된 'a도서코드'는 위 작업시 찾을 필요가 없으니 겹치더라도 문제가 없다.

 

2. dao.bstateDao 호출전에 도서코드를 업데이트 해버려서
bstateDao 가 일할때 도서코드를 못찾고 에러가 발생했다.
 

도서코드 업데이트를 dao.bstateDao(); 이후에 하도록 분리해 주었더니 해결 됨

## 에러났던 컨트롤러 ##
@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;
		dao.br_updateDao(brbcode, bstate, rdate, brcode);
		dao.bstateDao();
    return "redirect:br_list";
	}
    
    요렇게 나누어줌 IDao와 매퍼 새로 만들어주고 귀찮았지만 성공해서 다행
        //dao.br_updateDao(bstate, rdate, brcode);
        //dao.bstateDao();
        //dao.rbcodeDao(brbcode, brcode);

 

3. 외래키 문제 발생

위에서 대출테이블의 도서코드를 변경하려고 하니 도서테이블의 도서코드에 없다고

parent key not found 에러가 떴다. 일 잘하던 외래키였는데 이제 떠나보내주었다.

외래키 제약을 삭제하니 문제가 해결은 되었지만

대출정보 작성시 도서테이블의 도서코드에 없는 도서코드를 입력해도

더이상 막아주지 못하고 들어간다. 해결 해야되는 부분

 

4. 'a도서코드' 가 되어야 하는데 

반납된 도서코드가 'anull' 로 들어온다.

도서코드 값을 가져와야 하는데  button onclick 으로 작동하게 만들어뒀더니

대출코드값 1개만 가져가도록 되어있어 도서코드값이 null 값으로 계속 들어온 것

form action 과 submit 으로 바꿔 해결 하였지만 과정에 엄청난 뻘짓들이 스쳐지나간다. 

## brbcode 전달 실패방법##

//쉼표 찍고 같이 보내기 실패
<input type="button" value="반납확인" onclick="location.href='br_update?brcode=${boardDto.brcode}', ${boardDto.brbcode"> 
<input type="button" value="반납확인" onclick="location.href='br_update?brcode=${boardDto.brcode}', =${boardDto.brbcode">

//form없이 onclick 밑에 쓰면 혹시나 갈까해서 해봄. 좀창피 
<input type="button" value="반납확인" onclick="location.href='br_update?brcode=${boardDto.brcode}'">
<input type="hidden" name="brbcode" value=${boardDto.brcode}"

 

결국 모든 에러가 불완전한 테이블 때문에 시작된 것

이제 필요한 페이지들은 거진 다 만들어졌다. 

앞으로 세션이용한 관리자/회원/비회원의 접근 구분과 

당장은 없지만 문제가 예상되는 이곳저곳들의 보완작업이 필요하다.

 

조회수도 안나오는 도서관리시스템 개나줘버리고 로또 분석이나 하고싶다 

오늘은 여기까지. 

 

반응형