inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

35강. 책 대출/반납 기능 리팩토링과 지연 로딩

User와 loanhistory 관계

283

gang01

작성한 질문수 2

1

User가 UserLoanHistory를 가지게 됨으로써 대출하는 로직이 간단해지지만 UserLoanHistory관련 CRUD를 전부 User에서 비즈니스 로직을 처리해야하는 건가요? User가 처리하는 로직이 너무 많아지는 것 같아 이게 객체지향적인 게 맞나 고민이 되네요  현재 경우는 C U 밖에 없지만 만약 예를 들어서 작가와 책 엔티티가 있을 때 연관관계의 주인은 책에 있지만 작가가 보유한 책을 조회하는 로직을 더 간편하게 처리하기 위해 작가는 책을 리스트로 가지면서 생명주기를 관리하면, 책을 수정하거나 삭제할 때도 무조건 작가의 도메인에서 로직을 처리하게 되는 건가요? 단일책임원칙을 위배하는 것이 아닌가 고민이 되어 질문드립니다!

java spring aws mysql spring-boot jpa

답변 1

2

최태현

안녕하세요! gang01님! 🙂 좋은 질문 감사드립니다.

하나씩 답변 드려볼게요! 👍

 

User가 UserLoanHistory를 가지게 됨으로써 대출하는 로직이 간단해지지만 UserLoanHistory관련 CRUD를 전부 User에서 비즈니스 로직을 처리해야하는 건가요?

제 생각에는 그렇지 않습니다! UserList<UserLoanHistory> 를 갖게 되면서 간단하게 구현할 수 있는 부분은 간단히 구현하는 것이고, 굳이 User 를 거쳐 UserLoanHistory 를 접근할 필요가 없다면 바로 UserLoanHistory 를 접근해도 된다고 생각합니다.

 

따라서 예시로 주신 경우에도, 각 기능에 더 맞는 좋은 방법을 선택하면 된다고 생각합니다! 꼭 1 : N 으로 연결이 되었다고 해서 N을 제어하려 할 때 1을 반드시 거칠 필요는 없어요!

예를 들어 작가 : 책 = 1 : N 으로 연결된 상황에서, "현재 우리 시스템에 등록된 책 권수"를 확인하는 기능을 만드려면 select count(1) from book 이라는 SQL을 바로 책 쪽에 적용함으로써 굳이 작가를 거치지 않고 기능을 구현할 수 있습니다. 😊

 

그렇다면 이런 궁금증이 생기실 수도 있습니다.

  • 만약 1 : N 연관관계에서 N 쪽만 사용할 일이 많다면, 굳이 연관관계를 맺어야 할까? 🤔

저는 개인적으로 N 쪽만 사용할 일이 많다면, 특히 수정/삭제/생성이 1을 거치지 않고 N에서만 발생한다면, 연관관계를 맺지 않는 편입니다. 즉, 두 도메인의 Life Cycle이 상당 부분 일치해야 연관관계를 사용하는 것이죠!

(유사한 질문 글 : https://www.inflearn.com/questions/1219585/%EA%B7%B8%EB%9F%BC-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B4-%ED%95%AD%EC%83%81-%EC%A2%8B%EC%9D%84%EA%B9%8C-%EB%9D%BC%EB%8A%94-%EB%A7%90%EC%94%80%EC%97%90-%EC%A7%88%EB%AC%B8%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4)

이와 관해서는 아무래도 정답이 없다 보니, gang01님께서도 나름대로의 기준을 찾아보셔도 좋을 것 같습니다! 😊

 

추가로, 언급해주신 "단일 책임 원칙"에 대해서도 제 의견을 말씀드려보면, 어떤 객체가 "단일 책임 원칙"을 위배했는가? 위배 하지 않았는가? 는 객관적으로 판단하기 꽤 어렵다고 생각합니다. 결국 무엇까지를 "단일 책임"으로 볼 것인지 사람마다 의견이 다를 수 있기 때문이죠.

 

예를 들어, 우리가 만든 UserService 클래스도 단일 책임을

  • "유저와 관련된 비즈니스 로직을 처리하기 위한 트랜잭션, 도메인 제어와 관련된 책임" 이라고 생각하면 단일 책임 원칙을 지키고 있다고 생각할 수 있지만,

  • "유저를 생성도 하고, 수정도 하고, 삭제도 하고, 조회도 하네?" 라고 바라보면 무려 네 가지 책임을 갖고 있어 단일 책임 원칙을 지키지 못하고 있다고 생각할 수도 있습니다.

 

결론적으로, "이렇게 하면 된다"라는 100% 완벽한 정답이 없지만, 그렇기에 각자의 기준을 고민하고 서로 의견을 교환하는게 중요하지 않나 싶습니다! 😊

답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇

리액트 관련 질문이 있습니다.

0

58

2

스프링부트 버전

0

64

2

7강 강의를 들으려고 했는데 오류가 나서 서버가 안 켜지는거 같아요.

0

52

2

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

1

50

2

Java JDK 버전 문의의 건

0

126

2

ec2 에서 Linux버전이 달라져서 설치가 안되는것 같은데 자료 최신화좀 해주세요.

0

81

3

h2 console 접속했을 테이블 질문

1

62

1

ec2 서버에서 스프링 실행도 되고 인바운드 설정까지 했는데 index.html 안됨

0

71

2

15강. updateUser() 질문

0

51

2

깃허브 질

0

77

2

여기까지 다 끝냈다고 하셨는데

0

75

2

왜안될까요

0

67

2

MySQL 창이안ㄴ뜹니다

0

53

2

포스트맨

0

46

1

spring 개념적인 질문

0

68

2

인텔리제이 샘플코드 실행 안됨 오류

0

138

2

aws 배포할때 .env 파일에 저장한 환경변수에 관하여 여쭤볼게 있습니다

0

81

1

마이그레이션 오류입니다.

0

165

3

Whitelabel Error Page 오류가 났습니다.

0

153

2

안녕하십니까! 오류가 났습니다.. 도와주세요 ㅜㅜ

1

85

3

궁금한게 있습니다.

0

53

2

DTO 관련

0

65

2

궁금한게 있습니다!

0

59

2

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

0

51

2