작성
·
24
·
수정됨
0
@Transactional
public void returnBook(BookReturnRequest request) {
User user = userRepository.findByName(request.getUserName())
.orElseThrow(IllegalArgumentException::new);
user.returnBook(request.getBookName());
}
위 코드의 BookService 에서 책을 반납할때 userLoanHistory 중 user명과 책 이름이 같은것을 가져와서 userLoanHistory 에서 리턴하는데 문제는 한 사람이 이미 같은 책을 빌렸고 반납한 기록이 있다면 중복으로 잡힙니다.
public void returnBook(String bookName) { UserLoanHistory targetHistory = this.userLoanHistories.stream() .filter(history -> history.getBookName().equals(bookName)) .findFirst() .orElseThrow(IllegalArgumentException::new); targetHistory.doReturn(); }
위의 User 엔티티에서 혹시 userLoanHistory 값이 여러개 나올때 혹시 .findFirst() 를 통해 그 중 가장 위
즉, 여기선 가장 최근에 대출한 책의 기록인 userLoanHistory 를 가져와서 doReturn()을 진행하는 형태가 맞습니까?
답변 2
0
안녕하세요!! ☺ 커디널스님! 정말 좋은 질문이시네요~ 항상 이와 비슷한 질문이 들어올 때마다 훌륭한 수강생을 만난 것 같아 기분이 좋습니다.
AI 인턴이 답변해준 것처럼 아래 글을 함께 보시면 더 좋습니다.
- 35강 책 대출 반납 기능 리팩토링과 지연로딩 적용 후의 문제
결론부터 말씀드리면,
한 사람이 이미 같은 책을 빌렸고 반납한 기록이 있다면 중복으로 잡힙니다.
는 위 로직에서 고려되지 않은 로직입니다.
이와 비슷하게
한 책이 2권 이상 존재하는 경우도
고려되어 있지 않습니다.
어떠한 로직을 볼 때 어떤 요구사항까지 반영되어 있고, 어떤 요구사항이 반영되어 있지 않은지를 확인하는 것은 매우매우 좋은 습관이라고 생각합니다. 동시에 반영되지 않은 요구사항을 구현할 때는 어떤 변경이 어느 정도의 비용 (= 소요 시간) 으로 필요할까 생각해보는 것도 좋습니다. ☺
예를 들어, 말씀해주신 것 한 사람이 과거에 빌린 책을 다시 빌린 후 반납한다면, returnBook
에서 단순히 책의 이름으로 특정 Book
객체를 찾는 것이 아닌, 책의 이름과 상태를 함께 고려하도록 변경되어야 하고 이는 5분 내외의 짧은 비용이 들겠네요~
답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇
0
안녕하세요, 인프런 AI 인턴입니다. 커디널스님.
질문하신 내용을 바탕으로 returnBook
메소드에서의 동작에 대해 설명드리겠습니다.
우선, returnBook
메소드에서는 userLoanHistory
에서 주어진 bookName
과 일치하는 첫 번째 기록을 가져와서 처리하고 있습니다. 이 과정에서 .stream().filter().findFirst()
를 사용하고 있는데, 이 방식은 사용자의 모든 대출 기록 중에서 주어진 책 이름과 일치하는 첫 번째 기록을 가져옵니다.
질문 주신 내용처럼 특정 사용자가 동일한 책을 여러 번 대출하고 반납한 기록이 있을 경우, 가장 최근에 대출한 기록을 가져와 반납 처리를 원하는 경우라면 현재 구현은 단순히 순서대로 조회하여 첫 번째로 만나는 기록을 반환하는 형태이기 때문에 최근 기록이라 보장할 수 없습니다.
이를 해결하기 위해서는 userLoanHistories
리스트가 적절히 정렬되어 가장 최근의 기록이 먼저 위치하게끔 정렬된 상태가 되어야 합니다. 예를 들면, 대출 기록을 대출 날짜를 기준으로 역순 정렬한 이후에 .findFirst()
를 적용하면 가장 최근의 기록이 사용될 것입니다.
관련된 또 다른 질문과 답변이 있으니 참고해 보시면 좋겠습니다:
- 반납 기능 관련해서 질문드립니다.
- 35강 책 대출 반납 기능 리팩토링과 지연로딩 적용 후의 문제
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.