강의

멘토링

커뮤니티

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

Hyeok Jin Park님의 프로필 이미지
Hyeok Jin Park

작성한 질문수

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

33강. 조금 더 객체지향적으로 개발할 수 없을까?

33강. UserLoanHistory의 관계성에 대한 질문

작성

·

27

1

안녕하세요 선생님.
강의를 듣던 중 궁금한 점이 생겨서 이렇게 글을 남기게되었습니다.


UserLoanHistory라는 Entitiy는 강의에서 말씀하셨듯이 User와 ManyToOne의 관계를 가져가는데,

이게 또 Book과의 관계를 보더라도 ManyToOne이 성립할수 있지 않나 싶습니다.(물론 UserLoanHistory의 변수로 pk인 bookId가 아닌 bookName을 쓰셔서 조금 다를수 있지만...)

 

  1. 따라서 user_loan_history 테이블을 설계할때 칼럼을 book_name이 아닌 book_id로 해서 만든다면 그게 좋은 선택일지 궁금합니다

  2. 만일 1번의 테이블 설계가 나쁘지 않은 방식이라면 UserLoanHistory Entity에 Book에 대해서도 ManyToOne을 무조건 해주는게 좋은지,
    아니면 '유저'의 대출기록만 자주 쓰이고
    '책'의 대출기록은 거의 조회되지않을거 같으면 굳이 ManyToOne을 해줄 필요가 없을지 궁금합니다.





답변 2

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요! Hyeok Jin 님 정말 좋은 질문 감사합니다

질문 주신 것처럼 테이블 구조라는 것은 어떻게 설계하는지에 따라 수용할 수 있는 요구사항이 달라지기도 하고, 시스템의 복잡도가 올라가기도 하는 등 실제로 많은 고민을 하게 되는 부분입니다. 하나씩 답변 드려 볼게요!!

 

  1. 따라서 user_loan_history 테이블을 설계할때 칼럼을 book_name이 아닌 book_id로 해서 만든다면 그게 좋은 선택일지 궁금합니다

테이블의 성격에 따라 달라질 것 같습니다. 만약 user_loan_history 데이터를 단순히 기록을 쌓아두는 로그성 테이블로 볼 것인지, 아니면 대출 이력과 관련된 다양한 비즈니스 로직을 처리하려는 목적인지에 따라 좋은 선택이 될 수도 좋지 않은 선택이 될 수도 있을 것 같아요.

전자의 경우는 book_name 을 기록하는 것이 조금 더 좋아 보이고 후자의 경우는 book_id 를 기록하는 것도 조금 더 좋아 보입니다. 어느 한 쪽이 나쁘다 보다는 수용할 수 있는 요구사항의 성격이 달라서 그런 것 같아요.

예를 들어 book_id 를 갖게 했다면, 같은 이름의 책에 대해 정확히 특정한 책을 가리킬 수 있기도 하고 book_id 를 기준으로 통계를 내는 등 조금 더 활용할 여지가 많아지는데요! 반대로 책의 다른 속성이 변경되면 (ex. 책의 이름이 A 였다가 B 로 바뀌는 둥..) 내가 빌릴 당시의 데이터와 최신 데이터가 달라질 수 있기에 이걸 어디까지 고려할 것인지, 대출 기록에 연결되어 있는 책이 완전히 DB에서 사라진다면 (book_id는 5라고 되어 있지만 정작 5번 책이 없는 상황) 어떻게 할 것인지 등 고려할게 늘어나기도 합니다. 그래서 결국 모든 것은 Trade-Off 이고, 따라서 이러이러한 요구사항에서 어떤 선택을 할지 결정하는 것이 지금까지도 사람의 역할인 것 같아요

 

  1. 만일 1번의 테이블 설계가 나쁘지 않은 방식이라면 UserLoanHistory Entity에 Book에 대해서도 ManyToOne을 무조건 해주는게 좋은지,
    아니면 '유저'의 대출기록만 자주 쓰이고
    '책'의 대출기록은 거의 조회되지않을거 같으면 굳이 ManyToOne을 해줄 필요가 없을지 궁금합니다.

앞서 많이 말씀드린 것처럼 상황에 따라 다를 것 같은데요! book_id 를 연결하는게 좋다는 결론이 나왔다면 ManyToOne 을 해주는 것도 좋아 보입니다. 다만 여기서 추가적으로

  • private final Long bookId 를 사용할지

  • 아니면 JPA 연관관계인 ManyToOne 을 사용할지

는 조금 더 고민해봐도 좋을 것 같아요! 답변이 도움이 되었으면 좋겠습니다! 감사합니다. 🙇

0

안녕하세요, 인프런 AI 인턴입니다. Hyeok Jin Park님!

UserLoanHistory 테이블의 설계와 관련해 궁금한 점을 남겨주셨네요. 질문하신 내용에 대해 하나씩 답변 드리겠습니다.

  1. UserLoanHistory 테이블의 칼럼 설정: UserLoanHistory 테이블에서 book_name 대신 book_id를 사용하는 설계에 대해 고민하고 계신 것 같습니다. book_id를 사용하는 것이 더 나은 선택이 될 수 있습니다. 그 이유는, book_name은 중복될 가능성이 있으며, 데이터를 식별하고 참조할 때 book_id를 사용하는 것이 더 일관성 있고 신뢰할 수 있기 때문입니다. 또한, book_id를 사용하면 Book 엔티티와의 관계 설정이 명확해지고, 데이터베이스에서 성능 면에서도 더 효율적일 수 있습니다.

  2. ManyToOne 관계 설정의 필요성: UserLoanHistory와 Book 간의 ManyToOne 관계 설정은 요구사항에 따라 달라질 수 있습니다. 만약 ‘유저’의 대출 기록만 자주 참조하고 ‘책’의 대출 기록은 거의 조회되지 않는다면, 실제로 ManyToOne 관계를 설정하지 않을 수도 있습니다. 이는 시스템의 복잡성을 줄이는 데 도움이 될 수 있습니다. 그러나, 양방향 참조가 필요해질 가능성이 있거나, ‘책’의 대출 기록을 조회하는 기능이 추가될 가능성이 있다면 관계를 설정하는 것이 좋습니다.

관련된 주제에 대해 더 알고 싶으시면, 다음의 게시글들도 도움이 될 수 있습니다:

이를 통해 연관 관계 설계에 있어 다양한 시각과 옵션을 고려해볼 수 있습니다.

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

Hyeok Jin Park님의 프로필 이미지
Hyeok Jin Park

작성한 질문수

질문하기