값 타입 컬렉션

Shaun·2021년 11월 2일
1

JPA

목록 보기
24/31

값 타입 컬렉션이란??

  • 값 타입을 컬렉션에 담아서 쓸때 사용하는 것

  • 값 타입이 하나일때는 그냥 컬럼으로 DB에 넣으면 되지만 컬렉션 을 DB에 어떻게 넣을까??라는 것에대한 해결책

  • 별도의 테이블을 만들어야한다

값 타입 컬렉션 특징

  • 식별자 ID 같은 PK가 있으면 값 타입이 아니고 엔티티이다. **값 타입은 테이블의 값들만 저장되고 이걸 묶어서 PK로 구성한다

값 타입 컬렉션 테이블 만들기

  • @ElementCollection, @CollectionTable(NAME=테이블이름) 사용

  • @JoinColumns 로 fk값 설정

  • 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다.-> 컬렉션 테이블 따로만들기

  • 값 타입 컬렉션에 @Column 컬렴명 바꿀때 사용가능 (Address 는 임베디드)

값 타입 컬렉션 저장/조회/수정

값 타입 컬렉션은 영속성 전이+ 고아객체 제거 기능을 필수로 가진다고 볼수 있다.

저장

  • 컬렉션도 다른 테이블인데도 멤버를 저장할떄 같이 저장된다.-> 값 타입 컬렉션은 값 타입이기때문, 본인스스로 라이프 사이클이없고 생명주기 모든게 member에 속해있다

  • 컬렉션들도 값타입이다

  • 이러한 값 타입들은 따로 변경하거나 persist할 필요없다. member에서 값 변경 가능

조회

  • member 조회시 member만 나온다

  • 컬렉션들은 다 지연로딩, 임베디드는 지연로딩 x

수정

  • 수정을 들어가기전 주의 해야할 점이다.
  • 값 타임 필드하나만 바꾼다 x

  • 저번 시간에 설명한것처럼 값타입은 인스턴스 자체를 통쨰로 갈아끼워야 한다. 그렇지 않으면 사이드 이펙트 발생

  • 값 타입은 오류시 추적도 힘듬.

  • 컬렉션만 변경되도 db에 쿼리가 날라가서 JPA가 알아서 변경해준다.

  • 값타임 컬렉션은 Member에게 의존관계(persist, update)를 맡기고 Member라이플 사이클만 관리.

  • 기본적으로 컬렉션들은 값을 찾을떄 equals() 사용한다. -> equals, hashCode가 잘 재정의 되 있어야한다.

값 타입 컬렉션 제약사항

  • 값 타입 컬렉션에 변경 사항이 발생하면, 주인 엔티티와 연관된 모든 데이터를 삭제하고, 값 타입 컬렉션에 있는 현재 값을 모두 다시 저장한다.
    -> 위험하다. 사용 권장 x

  • 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본
    키를 구성해야 함: null 입력X, 중복 저장X

해결방안

  • 실무에서는 상황에 따라 값 타입 컬렉션 대신에 일대다 관계를 고려

  • 일대다 관계를 위한 엔티티를 만들고, 여기에서 값 타입을 사용

  • 영속성 전이(Cascade) + 고아 객체 제거를 사용해서 값 타입 컬
    렉션 처럼 사용

  • 일단 이렇게 값타입을 감쌀 엔티티 하나를 만들어준다.

  • 그 에 따른 member의 값타입 변경

  • 이런걸 값타입을 엔티티로 승급이라 부른다.

  • 이렇게 하면 자체적인 ID값이 추가된다. 그래서 값타입이 아니라 엔티티다.

  • 마음대로 수정 가능,

  • 이렇게 사용해야 값타입 컬렉션 제안사항(주인 엔티티와 연관된 모든 데이터를 삭제하고, 값 타입 컬렉션에 있는 현재 값을 모두 다시 저장)을 해결할수 있다.

그럼 값타입 컬렉션은 언제쓸까?

  • 진짜 단순할떄,
    ->치킨이랑 피자를 멀티로 셀렉트 한다 이렇게 추적할 필요없고 값 바뀌어도 UPDATE 칠 필요없을떄

  • 그게 아닌이상 대부분 엔티티로 감싸서 쓴다.

-정리-

-> 이번 파트는 너무 어렵고 복잡했다.. 내용이 많았지만 반복학습을 했으며 아직도 약간은 이해가 안되는 부분이있다.. 추가적으로 공부할 예정이고 밑에 그림은 보기에 좋지는 않지만 나름 이번파트를 공부하고 어려워서 따로 내가 머리속에 이해한것을 그림으로 그려봤다. 이렇게 나만이 이해한 방법으로 그려놓는것도 나쁘지 않는 방법인것 같다.

profile
호주쉐프에서 개발자까지..

0개의 댓글