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

창신동 장첸님의 프로필 이미지
창신동 장첸

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

값 타입 컬렉션

상황별 값타입 컬렉션과 엔티티 구분

해결된 질문

작성

·

194

1

[질문1]

강의시간 28분24초에 치킨을 제거하고 한식을 추가한 경우

delete from FAVORITE_FOOD  where MEMBER_ID=? and favoriteFoods=? 로 특정 행을 한 행만 제거했습니다.

반면, 컬렉션 값타입의 Address테이블에서는  

delete from Address where MEMBER_ID=? 

로 관련 행들을 모두 삭제했습니다.

왜 이런 차이를 보이는건지 고민을 해봤습니다.

후자인 Address테이블은 모든 컬럼의 조합이 pk제약조건을 구성하므로 

WHERE MEMBER_ID=? and 컬럼1 = ? and 컬럼2 = ? and 컬럼3=..... 같은 방식으로는 추적하기 어려울 것 같습니다.

따라서 MEMBER_ID =  ? 조건에만 관련된 모든 행 지웠다가 최종적으로 남아있는 값타입컬렉션의 요소만 Insert하는 방식을 채택한 것으로 보입니다.

반면, 전자인 FAVORITE_FOOD 테이블은 컬럼수가 FK인 MEMBER_ID를 제외하고 FOOD_NAME 하나이므로 WHERE절이 where MEMBER_ID=? and favoriteFoods=? 으로 가볍습니다. 따라서 FOOD_NAME을 조건으로 해당하는 행만 제거하는 것이 가능해 보입니다.

이런 원리라고 생각해도 되는 것인지 궁금합니다.

[질문2] 값타입 컬렉션과 엔티티의 상황별 차이

"값타입컬렉션을 언제 사용하는가? 값이 바뀌어도 update칠 필요가 없을 때" (40분30초)

"주소이력도 엔티티다, 값을 변경하지 않는다 하더라도 DB쿼리 자체를 그 쪽에서 부터 시작해서 가져올 수 도 있다" (41분00초 )

위 두 설명에 대해 감을 못잡고 있습니다.

전자는 질문1에서 말씀 드린 것과 같이 컬렉션의 요소를 바꿔도 모든 요소 관련 행들을 DELETE한 후 남은 요소만 INSERT하는 방식이라 update sql문을 사용하지 않습니다. 그런데 표현을 "update칠 필요가 없을 때"라고 하는 부분이 이상하게 다가옵니다...

후자의 경우 추가로 41분30초에 예를 들어주셨습니다.

"주소가 다 사라져도 이력은 남겨야 될 수 도 있는 상황" --> 엔티티로 설계해야함

이 부분은 상황자체를 이해하지 못했습니다...

선생님, 좀 더 자세한 설명 부탁드립니다.

감사합니다.

답변 1

0

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

안녕하세요. ddoddo님^^

[질문1] [질문2] 다음을 참고해주세요.

(질문 안내에 설명드린 것 처럼 질문 전 미리 인프런 내부 검색을 부탁드립니다.)

https://www.inflearn.com/questions/216545

감사합니다.

감사합니다. 선생님!

질문1에 대한 답은 공유해주신 다른 수강생의 질문글로 이해할 수 있었습니다. 

하지만 질문2에 대해 아직 해소되지 못한 부분이 있습니다.

1. "주소이력도 엔티티다, 값을 변경하지 않는다 하더라도 DB쿼리 자체를 그 쪽에서 부터 시작해서 가져올 수도 있다" (41분00초 )

>> 엔티티를 도입하지 않더라도 값타입컬렉션에 맵핑되는 테이블로부터 sql질의를 통해 데이터셋을 얻을 수 있지 않을까 생각됩니다.

   예) 강의 실습에서 생성한 값타입컬렉션의 Address 테이블로부터 where MEMBER_ID=1 로 회원번호가 1인 회원의 주소이력을 가져올 수 있다.

2. "주소가 다 사라져도 이력은 남겨야 될 수도 있는 상황"(41분30초)

>> 주소가 제거되고 이력은 남긴다....

       죄송스럽게도 공유해주신 글로도 아직 이해가 가지 않았습니다. 엔티티를 도입해야할 상황이 왜 저런 상황이지? 궁금증만 쌓이고 있는 상태입니다ㅠㅠ

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

안녕하세요. ddoddo님

1. >> 엔티티를 도입하지 않더라도 값타입컬렉션에 맵핑되는 테이블로부터 sql질의를 통해 데이터셋을 얻을 수 있지 않을까 생각됩니다.

-> 값 타입 컬렉션만으로 쿼리하는 것은 불가능합니다.

2. "주소가 다 사라져도 이력은 남겨야 될 수도 있는 상황"(41분30초)

-> 값 타입은 단독으로 사용될 수 없습니다. 어딘가에 항상 소속됩니다. 주소 이력이 값 타입이라면 주소에 모두 소속되겠지요? 따라서 주소가 모두 삭제되면 값 타입인 주소 이력도 모두 삭제됩니다. 만약에 주소를 삭제해도 주소 이력을 남기고 싶다면 주소 이력을 엔티티로 사용해야 합니다.

감사합니다.

궁금했던 부분들이 모두 해결됐습니다. 

감사드립니다!!

창신동 장첸님의 프로필 이미지
창신동 장첸

작성한 질문수

질문하기