whitt
116
2022-05-05 00:37:08
3
180

spring boot 기능구현 막힘 질문


안녕하세요 선배님들

취업 포폴용프로젝트 1인으로 진행중인데 구현하다가 막힌곳이 있어서

혹시나 다른분의 조언이나 힌트를 얻을수 있을까 싶어서 질문드립니다. 최대한 구글링과

혼자서 그림판으로 로직을 그리면서 해봤는데 도저히 모르겠어서 질문드려요 ㅠㅠ

제가 구현하고자 하는 기능은 책을 검색하면 해당책 정보들이 나오고 사용자는 원하는 책을 대출하기 버튼을클릭합니다. 대출된 책은 내서재 대출이력을 통해서 조회하는 기능입니다.


대출하기 버튼을 클릭하면 해당 책의 제목 지은이 출판사 도서관 정보를 담아서 해당 테이블에 insert 시키려고합니다. 어떤 사용자가 대출했는지 알기 위해 사용자 아이디의 기본키를 해당 대출하는 정보에 같이 넣어서 insert 시킵니다. 아래 사진으로 자세히 설명드리겠습니다.


DB 에서 대출이력을 조회할때 해당 유저의 아이디값과 일치하는 데이터만 조회가 되도록 SELECT 하였습니다. tdc2428 이라는 사용자가 내서재 - 대출이력을 들어갔을때 해당 유저가 대출한 책만 조회가 가능합니다.



req 클래스 파일에서는 해당사용자가 빌린 책 정보를 담아서 entity 객체로 변환 시키고 현재 로그인된

유저정보의 key 값을 들고와서 해당 테이블의 user_key 변수에 유저키값을 저장하게 됩니다.



문제는 여기서 부터입니다. 다음과같이 책을 검색하면  DB에 해당 키워드에 맞는 책들이 검색되어서

리스트가 나오게 됩니다. 여기서 사용자는 원하는 책을 대출하기를 클릭하게 되는데 대출한 책의 정보를

req에 담아서 보내야 하는데 


jquery 문법으로 해당 클래스의 값을 가져오면 전부다 들고와버립니다.

저의 생각은 현재 사용자가 대출하기 클릭한것만 값을 가져와서 컨트롤러에 값을 넘겨주고

req에 데이터를 담아야지 라고 생각했는데 어떻게 사용자가 선택한것만 값을 들고오게 처리해야할지 

도저히 제머리로 생각이 안나는거같습니다. 

Req 도 값찍어 보니 해당 책 전체 리스트가 다담겨버립니다.


해당 책정보가 나오는 jsp 코드 입니다.

<!-- 책정보 Start-->

                <ul class ="book-result">
              	   <c:forEach var = "book" items = "${Serch }">
                    <li>
                        <span class = "chk">
                            <input type="checkbox" title="선택" name = "chk">
                        </span>
                        <div class="thmb">
                            <span class = "book-cover-img">
                                <img src="/image/ready_img.png" alt="">
                            </span>
                        </div>
                        <div class = "book-clip">
                           <a href = "#"> <p class = "book-name">제목 : "${book.BOOK_NAME }"</p></a>
                            <p class = "book-author">저자 : "${book.AUTHOR }"</p>
                            <p class = "book-publisher">출판사 : "${book.PUBLISHER }"</p>
                            <p class = "book-location">도서관 : "${book.LOCATION }"</p>                                             
                            <p>코드 : "${book.CALL_SIGN }"</p>
                        </div>
                        <div class = "brow-book-view">
                            <span>
                                <a href="#" style= "color : #0459d7; font-weight: bold;">대출가능</a>
                            </span>
                            <p style = "display: none;">대출 불가</p>
                            <div class = "brow-book-btn">
                            <span>
                              	<button class = "brow-bt" onclick =  "BookBorrow()">대출하기</button>
                            </span>
                            </div>
                        </div>
                    </li>
                 </c:forEach>             
                </ul>

ajax 요청한 js 코드입니다.


let Book_Name = $('.book-name').text();
let Book_Author = $('.book-author').text();
let Book_Publisher = $('.book-publisher').text();
let Book_Loction = $('.book-location').text();

function BookBorrow() {
	
	console.log(Book_Name);
	console.log(Book_Author);
	console.log(Book_Publisher);
	console.log(Book_Loction);	
	
	let BookObj = {
		bookname : Book_Name,
		bookauthor : Book_Author,
		bookpublisher : Book_Publisher,
		bookloction : Book_Loction
	}
	
	$.ajax({
		type : "post",
		url : "book-search/borrow",
		data : BookObj,
		dataType : "text",
		success : function(data) {
			alert('대출이 완료되었습니다.');
		},
		error : function () {
			alert('에러');
		}	
	});
	
	
	
}

사용자가 대출하면 위와같이 나오도록 하는게 제 목표입니다. 위는 테스트로 인해 임시로 넣은 임의의 값

테이블 태그안에 값을 넣어놓았습니다.


개발방향이나 힌트 조언주시면 열심히 구현해보겠습니다 ㅠㅠㅠ







0
  • 답변 3

  • 한국은역시자바
    1k
    2022-05-05 01:29:14

    위에 작성해주신 코드를 참조해서 작성드리겠습니다. 본인이 생각해서 구현해서 하는것도 좋지만 예제를 한번보고 그걸 응용해서 푸시는 것 도 중요합니다.


    1. 사용자가 선택한 책의 정보들만 조회해오기

    <p class="book-name" data-book-name='${book.BOOK_NAME}'>제목 : </p>
    <p class="book-author" data-book-author='${book.AUTHOR}'>~~ : </p>
    <p class="book-publisher" data-book-publisher='${book.PUBLISHER}'>~~ : </p>
    <p class="book-location"data-book-location='${book.LOCATION}'>~~ : </p>


    function BookBorrow() { 
      const array = [];
      $("[name='chk']:checked").each(function() {
        const target = $(this);
        const bookInfo = target.closest(".book-clip");
        const bookName = bookInfo.find(".book-name").data("book-name");
        const bookAuthor = bookInfo.find(".book-author").data("book-author");
        const bookPubliser = bookInfo.find(".book-publiser").data("book-publisher");
        const bookLocation = bookInfo.find(".book-location").data("book-location");
        const obj = {bookName, bookAuthor, bookPubliser, bookLocation};
        array.push(obj)
      });
    
      $.ajax({
          url ~~~
          method : "POST"
          data : JSON.stringify(array)
          contentType : "application/json"
      });
    }


    public method(@RequestBody List<Book> books)
    
    class Book {
        private String bookName;
    ~~get, set
    }

    Field네임 그대로 유지하세요

  • yeori
    3k
    2022-05-05 03:52:05

    "책"을 나타내는 dto나 엔티티가 없네요. 있는데 언급을 안하신건지...?

    대출을 일으키는 사용자는 있고(TB_USER_MST)

    대출이라는 행위는 테이블 TB_LOAN 과 클래스 BookBorrow~ 로 표현하신거 같은데, 책이 없네요?

    도서대출 시스템은 기본적으로 아래의 엔티티가 존재해야합니다.

    * 사용자 - 책을 대출하려는 주체

    * 책 - 대출되는 대상

    * 도서관 - 책을 관리하고 대출 서비스를 제공하는 주체

    이 세명으로부터 [대출], [대출예약], [반납지연] 같은 이벤트들이 파생됩니다.

    수많은 이벤트 중에 위 코드에서는 [대출]이 언급됐고, 이를 나타내는 클래스가 BookBorrowBoard 라면 최소한 아래와같은 생김새이어야 합니다.

    // 도서대출
    public BookBorrowBoard {
      User borrower;
      BookSpec bookSpec;
      Date checkOutTime;
      Date expiredTime;
    }


    검색 화면에서는 BookSpec 을 출력하는 형태가 되어야 대출 버튼을 눌렀을때 로직을 전개 하기가 수월합니다.

    그리고 위에서 Book이 아니라 BookSpec이라고 이름을 지었는데, 우리가 도서관에서 대출받아서 손에 들고 가는 "실물로서의 책"과 구별하기 위해서입니다.

    "살인자의 기억법" 이라는 책을 예로 들면 출판일, 출판사, 저자, isbn같은 메타 정보가 있을겁니다. 이 책의 대출이 매우 빈번하면 추가로 5권을 더 구비해서 총 10권을 보유하고 현재 7권이 대출중일겁니다(나중에 실물책 말고 전자책도 존재할 수 있음)

    만일 나머지 3권도 모두 대출되면 이 책은 대출 불가능한 "상태"가 될테고, [대출예약] 이벤트를 발생시킬 수 있는 상태이기도 합니다.

    위 화면에서는 css selector를 잘못 먹여서 막힌듯 보이지만 근본적인 문제는 핵심 엔티티인 "도서(책)"가 등장하지 않아서 문제가 발생하고, 앞으로도 또다른 문제가 계속 파생될겁니다(그러니까, 뭘 좀 해보려고 하면 계속 막히고 걸림)

  • whitt
    116
    2022-05-05 11:41:56

    두분다 너무감사합니다 dto 있는데 제가 따로 언급을 안한거같네요 죄송합니다  ㅠㅠ 한번 더시 구현해보겠습니다 감사합니다!

  • 로그인을 하시면 답변을 등록할 수 있습니다.