강의

멘토링

커뮤니티

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

최한슬님의 프로필 이미지
최한슬

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

다음으로

JPA를 배우면서 혼란이 생겨 질문드립니다.

작성

·

427

0

안녕하세요 강사님. 항상 좋은 강의 감사드립니다!

야생형 로드맵을 따라 현재 강의를 완강하였고 기본편을 수강할 계획입니다.

본 강의를 수강하면서 완벽하게 이해하지는 못하였지만 JPA에 대해서 이해하는데 많은 도움이 되었습니다.

다만, Java 코드와 DataBase 관계에 대해서 조금 혼란이 생겨서 질문드립니다.

다음과 같이 회원-장바구니-상품 엔티티가 존재한다고 가정하겠습니다.

먼저 Java 관점입니다.

회원과 장바구니는 일대일 관계이기 때문에 회원은 하나의 장바구니를 가지고 있을것입니다.

class Member {

Cart cart;
}

또한, 장바구니는 여러개의 상품을 가질것이기 때문에 List를 하나 가질것입니다.

즉, 코드의 입장에서는 장바구니와 상품의 관계는 일대다 관계라고 생각합니다.

class Cart {

List<Item> items;
}

만약 회원A의 장바구니에 담긴 상품을 조회하려면 다음과 같이 접근하면 쉽게 해결할 수 있을테니깐요.

Member A = new Member();
List<Item> items = A.getCart().getItems();
for (Item item : items) {
//do Something
}

상품이 여러명의 회원 장바구니에 속해진다고 하여도 회원 B, C 모두 자신의 cart.items를 통해 조회가 가능할 것 이기 때문에 다대다 관계를 가질 필요가 없다고 생각합니다.

하지만 Database 관점에서 다른 부분이 있는것 같습니다.

장바구니가 여러개의 상품을 가질 수 있지만, 상품 역시 여러개의 장바구니에 속해질 수 있으니 DB에서 장바구니와 상품은 다대다 관계입니다.

만약, Java 코드처럼 일대다 관계를 맺어버린다면 상품은 하나의 장바구니 PK를 가지기 때문입니다.

따라서 중간에 장바구니_상품 테이블을 하나 생성하여 다대다 관계를 일대다, 다대일 관계로 풀어서 해결한다고 하였습니다.

만약, 회원 A의 장바구니 목록을 조회하기 위해선 회원의 장바구니_ID로 장바구니_상품 테이블에서 select을 할것입니다.

아직 ORM의 개념을 제대로 학습한 상태가 아니라서 두 관점에 따라 테이블의 구조가 다른 이유를 잘 모르겠습니다.

Java의 입장에서 생각해본다면 회원 각자의 장바구니를 참조하고 있기 때문에 굳이 나눌 필요가 있는지 의문이 들고

DB의 입장에서 생각해보면 회원 A, B, C 각각 장바구니-상품 테이블 구조를 만들어서 관리하지 않고 위처럼 한곳에 모두 모아서 관리할 것이기 떄문입니다.

회원 A의 장바구니 상품을 조회할 경우에도 Java 코드는 단순히 A.cart.items를 탐색하면 되는데

DB의 입장에서는 회원 A, B, C의 장바구니 상품이 모두 들어있는 테이블에서 조회해야하며, 테이블도 하나 추가적으로 생성해야하기 때문에 비효율적인것 같기도 하다는 생각이 듭니다.

제가 ORM에 대한 개념이 잡히지 않아서 오해를 하고 있는것인지, 애초에 Java 코드의 관점도 잘못생각하고 있는것인지 잘모르겠습니다.

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 최한슬님^^

이런 궁금증들이 JPA 기본편을 들어보시면 자연스럽게 해소 되실거에요.

감사합니다.

최한슬님의 프로필 이미지
최한슬
질문자

감사합니다. 이러한 의문점들을 기본편을 통해 해소하러 가겠습니다!

최한슬님의 프로필 이미지
최한슬

작성한 질문수

질문하기