• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

35강 책 대출/반납 기능 리팩토링과 지연로딩 적용 후의 문제

23.03.01 23:55 작성 조회수 593

3

안녕하세요 공부하는 개발자 최태현님!

재미있게 강의 듣던 중 질문 드릴 부분이 있어 또 찾아오게 되었네요 ㅎㅎ

이번에는 '35강 책 대출/반납 기능 리팩토링과 지연로딩' 적용 후의 문제 에 대해서 질문 남겨보겠습니다!

user_loan_history의 대출 / 반납 시,

대출(book_name : java / user_id : 22)
반납 (book_name : java / user_id : 22)

위와 같이 '처음' 한번의 '대출과 반납' 에는 문제가 없으나,

아래와 같이 '이미' '대출과 반납'이 진행되었던 [id: 7 / book_name : java] 를 가지고 '대출과 반납 '다시' 진행해보면,,

대출이 된 상태(is_return : 0)는 정상적으로 유지가 됩니다. (대출 시도 시, 이미 이미 대출된 책이라는 에러 메시지 정상 출력)

반면 반납의 경우, 브라우저 alter창에서는 반납 되었다고 뜨지만 DB에서는 정상적으로 적용되지 않네요., ㅠㅠ

(브라우저통해 반납 시도 시, 무한 성공 but DB 미적용 )

(위 이미지 상의 '일기'라는 책은 검증용으로 '대출과 반납'을 단 1회만 해둔 상태)

추가 테스트 (history 데이터 삭제 후 진행)

책 반납 시, 해당 책에 관한 데이터가 user_loan_history에서 기록이 삭제 되도록 따로 구현이 필요한 부분일까요..??

(강의에 있는데 제가 놓친 부분이라면 죄송합니다..!!)

그럼, 오늘 하루도 잘 마무리 하시고 행복한 밤 되시길 바라며이번에도 미리 답변 감사드리며 배포 진행하고 있을게요!

행복하세요 감사합니다!

답변 1

답변을 작성해보세요.

2

안녕하세요, jk s님~~~!!!! 😊😊 크으~~ 정말 정말 좋은 질문이십니다!!!!! 👍👍

결론부터 말씀드리자면, 이런 경우는 본 프로젝트에서 고려되어 있지 않습니다! 따라서 jk s님께서 짚어주신 것처럼 현재는 한 책을 한 유저가 여러번 대출 받으려고 한다면 문제가 생길 수 있습니다.

본 프로젝트에 이 내용을 고려하지 않은 이유는 다음과 같습니다.

 

현실 세계에서도 이와 비슷한 문제가 정말 많습니다. 기획자 분께서는 최대한 요구사항을 정리해서 전달해 주시겠지만, 실제 코드를 작성하는 개발자가 보기에는 많은 구멍이 있을 수 있습니다.

예를 들어

  • jk s님께서 짚어주신 것처럼 한 유저가 한 책을 여러번 대출하려 한다면?!

  • 똑같은 이름의 책이 시간 차이를 두고 등록된다면?!

  • 한 권의 책을 정말 동시에 (0.001초의 차이도 없이) 10명이 대출을 하려고 한다면?!

등등.. 단순히 "도서 대출이 이루어지게 해주세요!" 라는 글로는 설명할 수 없는 여러 예외 케이스나 시나리오가 있을 수 있습니다.

이런 부분은 결국 개발자가 경험이나 탐구를 통해 구현 전, 혹은 구현 중에 문제를 확인하고 기획자와 커뮤니케이션을 통해 적절히 해결해야 합니다.

 

예를 들어, 한 유저가 한 책을 여러번 대출하려 한다면

  1. 대출 기록 자체를 지우고 새로 대출을 해줄 수도 있고

  2. 대출 기록을 여러번 가질 수 있게끔 적절히 구조를 바꿀 수도 있고,

  3. (조금 너무하지만..) 한 번 빌렸던 책은 다시 빌릴 수 없도록 처리할 수도 있습니다.

이 외에도 여러 방법이 있을 수 있습니다. 각 방법에 따라 구현 난이도와 구현 시간 등이 모두 달라지고, 기획적으로 유저에게 영향이 가는 부분도 달라집니다. 여러 선택지들 중에 기획, 개발적으로 적절한 타협을 거쳐 기능이 조금씩 생기는 것이죠!!! ㅎㅎㅎ

제 강의를 들으시는 분들께서는 이런 부분을 직접 경험해 보시면 좋겠다고 생각했습니다! 강의에서 OOO와 같은 문제가 있어요~~ 라고 말씀드리는 것보다, 직접 허점이 있는 경우를 찾아 탐구해보시는게 기억에도 오래 남고 확실하게 습득하실 수 있기 때문입니다. jk s님 처럼 능동적으로 학습하시는 분들께서는 이런 edge case를 직접 떠올리시고 고민해보시면서 더 성장하실 수 있을거라 생각했습니다 🙂

또한 강의에서 이런 내용을 모두 다루게 된다면 자바만 알고 계시는 분들께는 첫 올인원 강의로써 난이도가 너무 높아지는 단점이 있고, 기술적으로도 많은 설명이 필요하게 됩니다. 예를 들어, 똑같은 이름의 책 등록을 막기 위해서는 스프링 부트의 멀티스레드 구조와 단일 인스턴스 - 서버가 1대인 경우 - 일 때의 synchronized 구문, 멀티 인스턴스 - 서버가 N>=2 대 인경우 - 일 때의 DB unique key 등을 언급해야 하고, (이 과정에서 서버의 인프라도 설명이 들어갑니다!) 동시 대출을 방어하기 위해서는 DB의 Lock(잠금) 종류와 원리에 대해 설명해야 합니다. 공부해야 할 부분이 참 많죠 😅

 

결론적으로, 말씀해주신 허점은 1) 현실세계의 SW와 비슷한 모습을 보여드리고 싶었고 2) 더 날카롭고 능동적으로 공부하시는 분들이 직접 생각해보시길 개인적으로 원했고 3) 서버공부의 첫 강의로써 난이도가 급격히 올라가는 것을 방지하기 위해 의도된 부분이 맞습니다 ㅎㅎㅎㅎ

jk s님께서도 해결책들에는 무엇이 있을지, 각 해결책마다 어떤 방식으로 코드가 달라지는지 한 번쯤 생각해보시면 좋겠습니다. 정말 좋은 포인트 질문 주셔서~ 감사합니다!!!!! 👍👍

오늘도 편안한 밤 되세요! 🙏🙏🙇

jk s님의 프로필

jk s

질문자

2023.03.03

이번에도 태현님의 상세하고 정성스런 설명에 감탄하여 이마와 무릎까지 쳐버렸네요..와우 🙇

강의 내용도 당연히 너무너무 알차고 소중하지만, 태현님 강의의 또다른 묘미(?)를 뽑자면 질의응답 내용이 또 알차버리는 부분이네요 증말... 👍👍

이번에도 답변 주신 내용을 통해 많은 것들을 얻어갈 수 있었는데, 뭔가 머리를 한대 맞은 기분이 들었네요ㅎㅎ

현실세계의 SW와 비슷한 모습,,

어느 문제와 그에 대한 해결책을 다양하게 바라보고 생각하는 법..

그동안 개발을.. 취업하기 위한 공부에 쫓겨서 본분을 망각하고 있던건 아닐까? 라는 생각과 함께,, 저의 편협한 사고를 반성해보게 되는 시간이었네요...🙏

이런 좋은 강의와 답변을 접할 수 있어 정말정말 행운입니다

다시 한번 감사드리며,

앞으로도 공부하는 개발자 태현님의 멋진 지식공유활동 기대하며 기다리고 있겠습니다!

(새로운 강의들이 나온다면 다 사버릴거예요..)

그럼, 오늘 하루도 행복하시길 바랍니다 ~ 🙏🙏🙇

 

안녕하세요, jk s님~~ 아이고~~ 좋아해주시고 응원해주셔서 정말 감사드립니다!! 😭 (감동의 눈물...)

jk s님 덕분에 저도 힘이 많이 나네요!! 앞으로도 좋은 컨텐츠 많이 전달드릴 수 있도록 노력하겠습니다. 감사합니다!!!! 🙏🙏🙇