7. 임베디드 타입

신명철·2022년 2월 12일
0

JPA

목록 보기
7/14

JPA 의 데이터 타입 분류

값 타입

  • int, Integer, String 처럼 단순히 값으로 사용한느 자바 기본 타입이나 객체
  • 식별자가 없고 변경시 추적이 불가능함

엔티티 타입

  • @Entity 로 정의하는 객체
  • 데이터가 변해도 식별자로 추적 가능

임베디드 타입

  • 복합 값 타입
    • JPA 는 Embedded Type 이라고 함
  • 주로 기본 값 타입을 모아서 만들어짐
  • 비슷한 성격의 값 타입들을 모아 만듦

테이블 매핑

  • 임베디드 타입은 엔티티의 값일 뿐임
  • 임베디드 타입 사용 전과 후의 테이블은 동일
  • 잘 설계한 ORM 어플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다

사용

  • @Embeddable: 값 타입을 정의하는 곳에 표시
  • @Embedded: 값 타입을 사용하는 곳에 표시
  • 기본 생성자가 필수다

엔티티 내 중복

  • 한 엔티티에서 같은 값 타입을 사용하는 경우는 어떻게 해야할까?
    • e.g)
      private Address home
      private Address work
  • @AttributeOverrides, @AttrbitueOverride 로 컬럼 명 속성을 재정의할 수 있다.

side-effect

  • 같은 임베디드 타입 객체를 공유하는 경우 문제가 발생할 수 있다.
    • 수정 시 객체를 공유하는 모든 엔티티의 값이 변경됨
    • 값을 복사해서 사용함
  • 객체 타입을 수정할 수 없게 만드는 방법으로 부작용을 원천에 차단할 수 있다.
    • 값 타입은 불변 객체로 설계해야 한다.
    • 생성자로만 값을 설정하고 수정자를 만들지 않거나 수정자를 private 으로 만듦
    • 필요하면 통으로 갈아끼우는 방식으로 만들어야 함
  • 공유를 하고 싶다면 엔티티로 공유해야 함
    // 의도적으로 같은 Address를 넣는 경우
    Address address = new Address("Seoul");
    
    member1.setAddress(address);
    member2.setAddress(address);
    • 값 타입이 아닌 처음부터 공유하도록 의도되어 있는 엔티티로 만들어서 사용해야 함

컬렉션

임베디드 타입을 컬렉션으로 관리하고 싶은 경우가 있을 것이다.

e.g) FavoriteFood

이런 경우는 그냥 일대다 연관관계를 통해서 구현하도록 하자


출처

profile
내 머릿속 지우개

0개의 댓글