inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

31강. 대출 기능 개발하기

31강 대출기능에서 테이블 생성에 대한 질문입니다.

해결된 질문

463

Dompoo

작성한 질문수 14

2

 대출기능을 개발하려고 하니,

저희가 가진 두 테이블, User와 Book은 서로를 가리킬 필드가 없어서 '대출했다.'라는 정보를 표시할 수 없었습니다.

그래서 user_loan_history 테이블을 새로 만드는 내용이 강의의 주된 내용이 되는데요,

제가 궁금한건 여기서 User와 Book 테이블을 수정하여, 예를들면 User테이블에는 OneToMany로 Book의 id를 가리킬 수 있는 필드를, Book테이블에는 ManyToOne으로 User의 id를 가리킬 수 있는 필드를 추가하여 개발할 수도 있지 않나 싶어서요!

객체지향적으로 생각했을 때 User와 Book은 객체지만, '대출기록'은 객체가 아니라 객체간의 관계 같아서 테이블로 만드는 것에 거부감이 생기는 것 같습니다.

어떤 이유에서 기존의 테이블을 수정하지 않고, 새로운 테이블을 만들었는지 궁금합니다!

spring spring-boot JPA java aws jpa mysql

답변 1

1

최태현

안녕하세요, Dom poo님!! 정말 좋은 질문 감사합니다! 😊

제가 궁금한건 여기서 User와 Book 테이블을 수정하여, 예를들면 User테이블에는 OneToMany로 Book의 id를 가리킬 수 있는 필드를, Book테이블에는 ManyToOne으로 User의 id를 가리킬 수 있는 필드를 추가하여 개발할 수도 있지 않나 싶어서요!

라고 말씀해주셨는데요!!!

두 가지를 나눠서 생각해볼게요!

  • User 테이블 : OneToMany로 Book의 id를 가리킬 수 있는 필드

  • Book 테이블 : User의 id를 가리킬 수 있는 필드

 

[Uesr 테이블]

결론부터 말씀드리면, User 테이블에 OneToMany로 Book의 id를 가리킬 수 있는 필드를 넣기는 애매합니다!

그 이유는, OneToMany (즉 1 : N 관계) 때문인데요!! 표 데이터를 생각해보시면 하나의 유저 데이터가 여러개의 책 데이터를 가리키는 것은 다소 어려움이 있어요! 만약 하나의 유저 데이터가 여러 책 데이터를 가리키게 하고 싶다면, 1) 책 데이터가 추가될 때마다 필드가 추가로 생기거나 2) 책 데이터가 추가될 때마다 특정 필드가 업데이트 되어야 합니다.

전자의 경우 테이블의 필드를 동적으로 추가하는 것은 애매하고요!! (계속해서 alter table add column 이 수행되어야 하기 때문이죠!) 후자의 경우 특정 필드를 계속 업데이트 할 수는 있지만, 코드가 깔끔하지 않고 유지보수가 어렵게 됩니다.

 

[Book 테이블]

Book 테이블 역시 user_id만 가지고 있기에는 애매한 부분이 있습니다.

책 A를 1번 유저가 빌렸다가 반납했다가~ 2번 유저가 다시 빌렸다가 반납하는 경우 책 A를 1번 유저도 빌리고 2번 유저도 빌렸다는 기록이 필요합니다. 또한 대출과 반납 여부를 기록하고 있어야 하고요!

 

결론적으로 말씀해주신 방법이 불가능한 것은 아니나, 확장성이나 유지보수성을 고려하면 개발하기 어려운 형태가 됩니다!! 😭😭 관련해서 정규화, 역정규화 라는 키워드로 자료를 조금 더 찾아보시면 좋을 것 같아요!

 

[추가적인 의견]

객체지향적으로 생각했을 때 User와 Book은 객체지만, '대출기록'은 객체가 아니라 객체간의 관계 같아서 테이블로 만드는 것에 거부감이 생기는 것 같습니다.

아~ 어떤 말씀인지 공감됩니다! 관련해서, 이 말씀을 꼭 드리고 싶어요!

객체지향적인 프로그래밍을 할 때에, 객체는 현실세계의 객체와 꼭 대응될 필요가 없습니다.

예를 들어 현재 우리의 대출기록은 대출기록만의 고유한 정보를 가지고 있습니다. 반납되었는지 / 대출되었는지 말이죠. 또한 요구사항에 따라 대출기록의 고유한 정보는 얼마든지 추가될 수 있습니다. 도메인 관점에서 대출기록 역시 하나의 객체로 생각할 수 있는거죠!!!

 

오히려 대출기록을 하나의 객체로 인정하지 않으면 문제가 생기게 됩니다! 본래 대출기록 객체가 가져야할 (관리해야할) 정보는 유저가 관리해야 할지~ 책이 관리해야 할지... 대출기록이 가지고 있어야 할 기능은 유저 쪽에 넣어야 할지~ 책 쪽에 넣어야 할지 등 현실세계에서는 '대출기록'이라는 유형의 물체가 존재하지 않지만 SW 세계에서는 '대출기록'이라는 무형의 객체가 있어야 객체간의 관계가 쉽게 표현되는 느낌이죠!!

객체지향에 대한 시각을 더 넓히고 싶으시다면, 다소 어려울 수는 있지만 <오브젝트>라는 책을 추천드립니다!!!! 👍

 

다소 추상적인 레벨에서 답변을 드려보았는데요!! 혹시나 더 궁금하신 부분이 있으시다면 편하게 질문 남겨주세요 ㅎㅎㅎ 좋은 질문 남겨 주셔서 다시 한 번 감사드립니다.

행복한 하루 되세요!!! 🙏 🙇

0

Dompoo

항상 좋은 답변 감사드립니다!

테이블을 계속 업데이트하는 비용을 고려하지 못했네요! 덕분에 궁금증이 싹 해소되었습니다!!

0

최태현

아이고~~ 다행입니다 ㅎㅎㅎㅎ 개인적으로는 이런 부분이 확실히 재밌는 것 같아요!!! 똑같은 요구사항을 달성하는 A / B / C 3가지 방법의 특징과 장단점이 모두 다르거든요!!

언제든지 궁금한 점 있으시면 말씀해주세요~~~ 감사합니다!!!! 🙏 화이팅!!! 🔥

패키지 구분에 대해 궁금한게 있습니다

0

20

2

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

0

64

2

스프링부트 버전

0

73

2

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

0

59

2

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

1

56

2

Java JDK 버전 문의의 건

0

133

2

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

0

89

3

h2 console 접속했을 테이블 질문

1

65

1

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

0

75

2

15강. updateUser() 질문

0

55

2

깃허브 질

0

82

2

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

0

79

2

왜안될까요

0

70

2

MySQL 창이안ㄴ뜹니다

0

59

2

포스트맨

0

50

1

spring 개념적인 질문

0

71

2

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

0

140

2

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

0

85

1

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

0

171

3

Whitelabel Error Page 오류가 났습니다.

0

163

2

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

1

93

3

궁금한게 있습니다.

0

60

2

DTO 관련

0

70

2

궁금한게 있습니다!

0

68

2