강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

커디널스님의 프로필 이미지
커디널스

작성한 질문수

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

35강에서 returnBook 에서 userLoanHistory 값 중복에 관하여

작성

·

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강 책 대출 반납 기능 리팩토링과 지연로딩 적용 후의 문제

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

커디널스님의 프로필 이미지
커디널스

작성한 질문수

질문하기