JPA- 4. Value 타입

roon-replica·2022년 8월 8일
0

JPA

목록 보기
4/5

개요

  • JPA의 데이터 타입을 크게 분류하면 entity 타입, value 타입으로 나눌 수 있다고 함.

  • entity 타입은 식별자를 통해 추적 가능, value 타입은 식별자가 없어서 추적할 수 없다고 함

Value 타입 종류

  • 기본값 타입( int, double, Integer, String)
  • embedded 타입( 복합값 타입?)
  • collection value 타입

기본값 타입

예제 코드

@Entity
public class Member{
  ...
  private String name;
  private int age;
  ...
}

embedded 타입

특징

  • 새로운 값 타입을 직접 정의해서 사용하는 것을 embedded 타입이라 부른다고 함
  • 더 객체지향적으로 코드를 구성하는 법( 더 의미있고 응집력있고 재사용 가능하게..)
  • @Embedded, @Embeddable 둘 중에 하나는 생략해도 된다고 함...
  • Embedded 타입은 기본 생성자가 필수라고 함..

예제 코드

@Entity
public class Member{
  ...
  @Embedded  // Value 타입을 사용하는 곳에 명시
  Period workPeriod;
  
  @Embedded
  Address homeAddress;
  ...
}

@Embeddable // Value 타입을 정의하는 곳에 명시
public class Period{...}

@Embeddable
public class Address{...}

테이블 매핑

embedded 타입 써도 똑같음.

연관관계

...

임베디드 타입의 매핑정보 재정의

@AttributeOverride 이용
테이블에 매핑하는 컬럼명이 중복되는 경우 다른 매핑 정보를 정해줄 수 있음

@Entity
Member{
  @Embedded Address homeAddress;
  
  @AttributeOverrides({
    @AttributeOverride(name="city", column=@Column(name="company_city"))
    @AttributeOverride(name="street", column=@Column(name="company_street"))
    @AttributeOverride(name="zipcode", column=@Column(name="company_zipcode"))
  })
  @Embedded Address companyAddress;
}

불변성

  • Value 타입은 당연히 공유하면 안되지..
    회원1의 주소랑 회원2의 주소를 공유하면 말이 안되니까..

  • 불변 객체

    • 한 번 만들면 변경할 수 없는 객체
  • Value 타입을 불변 객체로 만들어서 부작용을 사전에 차단하라고 한다..

collection value 타입

  • Value 타입을 여러개 저장할 때는 컬렉션에 보관하고
    @ElementCollection, @CollectionTable을 쓰면 된다고 함..

  • RDB의 테이블은 컬럼으로 컬렉션 못 씀.
    그래서 별도의 테이블 만들어야 한다고 함.(@CollectionTable이 그 별도의 테이블 매핑을 담당)

예제 코드

@Entity
class Member{
 ...
 @ElementCollection
 @ColletionTable(name="favorite_foods",
   joinColumns = @JoinColumn(name="member_id"))
 @Column(name="food_name")
 private Set<String> favoriteFoods = new HashSet<>();
 
 @ElementCollection
 @CollectionTable(name="address"
 ,joinColumns = @JoinColumn(name="member_id"))
 private List<Address> addressHistory = new ArrayList<>();
}

사용법

  • Value 타입 다 설정하고 마지막에는 해당 Value 타입을 포함하는 Entity만 영속화해주면,
    JPA는 Entity의 Value 타입들도 다 저장해준다고 함
  • Collection Value 타입은 지연 로딩이 default라고 함..

제약사항?

  • Value 타입은 식별자가 없어서 값을 변경하면 DB에서 원본 찾기 어렵다고 함..
    특정 엔티티에 속한 Value 타입은 엔티티를 찾아서 변경하면 됨

    Collection Value 타입이 문제라고 함..
    Collection Value 타입에 변경이 생기면, 매핑된 테이블의 모든 연관된? 데이터를 삭제,
    현재의 Collection Value 값들을 DB에 다시 저장한다고 함...
    -> Collection Value 값들이 많으면 당연히 성능 문제가 생기겠지

  • 모든 컬럼을 묶어서 기본 키를 구성해야 한다고 하네..?
    그래서 모든 컬럼이 nullable = false..? 라고 함
    (autoincrement id 가능한거 같은데..?)

의문점

  • embedded 타입이 엔티티를 참조할 수 있는데.. 참조 왜 함?
    참조하면 무슨 일 일어나길래..

  • @AttributeOverride 쓸 일 있을까?

  • Value 타입을 불변으로 안 만들면 정말로.. 부작용이 잘 발생하나?

  • Collection value 타입 왜 씀?

  • 영속성 전이, 고아 객체 제거 잘 모름

  • Value 타입은 equals(), hashCode()를 꼭 구현해야 한다??

  • Collection Value 타입과 일대다 관계 차이...

  • Collection Value 타입을 매핑한 테이블의 기본 키가 모든 컬럼을 묶은거라는데...
    아닌거 같은데?

profile
집중 ➝ 프로세서↑ 시간 투자 ➝ 디스크↑

0개의 댓글