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

조원진님의 프로필 이미지
조원진

작성한 질문수

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

Entity 연관관계 관련하여 질문드립니다.

작성

·

398

0

안녕하세요 강사님.

늘 강사님 강의 잘 듣고 있습니다.

강사님의 JPA 강의를 듣고 실무에 적용하는 도중에 막히는 부분이 있어서 질문을 좀 드립니다.
실제 비즈니스 모델을 전부 설명 드리기는 복잡해서 강사님 강의의 Entity 다이어그램으로 설명을 드리자면
아래 Album Book Movie가 각각 Detail Entity를 1:N 관계로 갖고 있습니다.
이 때 OrderItem 안에 OrderItemDetail을 가져야하는 상황인데 각각의 Detail 컬럼 성격이 달라서 하나의 Detail Entity로 합칠 수는 없고
데이터 보존이 필요하여 OrderItemDetail이 각각 Detail Entity를 Id로 참조하는 방식으로 갖고 있을 수도 없습니다.
우선 제가 진행한 방식은 OrderItem Entity 안에 OrderAlbumDetail, OrderBookDetail, OrderMovieDetail 모두를 갖게하는 방식으로 진행을 했는데
서로 겹칠 일이 없는 Entity를 모두 OrderItem 안에 넣어놓으니 영 찜찜해서 문의 드립니다ㅜ
이런 경우 주문할 때 각각 Detail Entity를 어떤 형태로 OrderItem에 넣는게 좋을까요?

답변 4

1

조원진님의 프로필 이미지
조원진
질문자

좋은 조언해주셔서 너무 감사합니다!

앞으로도 좋은 강의들 부탁드리겠습니다!

1

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

1번은 OrderItemDetail의 자식 타입으로 AlbumItemDetail이 존재할 것이기 때문에 이상적으로는 다형성 + 오버라이딩을 활용하는 것이 좋지만, 그렇지 않다면 자바 다운 케스팅을 사용해서 OrderItemDetail 타입을 AlbumItemDetail 타입으로 형 변환 하시면 됩니다. 그러면 AlbumItemDetail에 접근할 수 있겠지요?

2번은 이렇게 되면 1:N 관계가 되는데요. 상속관계는 1:1 관계만 가능합니다^^

감사합니다.

1

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

안녕하세요. 조원진님

고민이 되시겠네요. AlbumDetail의 현재 상태를 주문시점에 스냅샷 처럼 저장해두어야 해서 그런거지요?

그렇다면

OrderItemDetail을 부모 클래스로 만들고, AlbumItemDetail, BookItemDetail, MovieItemDetail을 상속관계로 만들면 됩니다. 마치 Item과 Album 처럼요.

그러면 OrderItem -> OrderItemDetail 이렇게 참조하면 되겠지요?

도움이 되셨길 바래요^^

0

조원진님의 프로필 이미지
조원진
질문자

우선 강사님의 친절한 답변에 감사드립니다.

강사님의 답변사항에 2가지 궁금점이 추가로 생겨서 질문을 드립니다.

1. 강사님이 말씀해주신대로 OrderItemDetail을 부모클래스, AlbumItemDetail, BookItemDetail, MovieItemDetail을 상속관계로 만들고 OrderItem -> OrderItemDetail 을 참조하도록 만들었는데

혹시 Order를 save하는 비즈니스 로직 도중에 AlbumItemDetail에만 존재하는 멤버변수 또는 메소드를 참조해야할 때에는 Order를 먼저 Save하고 AlbumItemDetailRepository를 만들고 조회하여 참조를 해야할까요?

2. 그리고 혹시 OrderItem을 부모클래스로 두고 OrderAlbumItem, OrderBookItem, OrderMovieItem을 상속관계로 만들고 각각 AlbumItemDetail, BookItemDetail, MovieItemDetail을 OneToMany 연관관계로 갖는 방식으로 해도 괜찮은지 궁금합니다.

조원진님의 프로필 이미지
조원진

작성한 질문수

질문하기