JPA

임베디드 타입

salmon16 2023. 8. 31. 22:39

임베디드 타입

  • 새로운 값 타입을 직접 정의할 수 있음
  • JPA는 임베디드(embedded type) 타입이라 함
  • 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
  • int,  String과 같은 특성의 값 타입
    • 엔티티가 아니어서 변경하면 추적이 안된다

 

위와 같은 회원 엔티티가 있다고 보자 

회원 엔티티의 필드를 보면 (startDate, endDate) = workPeriod, (city, street, zipcode) = homeAddress필드를 묶을 수 있다.

이렇게 묶을 수 있는 것이 임베디드 타입이다.

Period, Address를 클래스를 만들어서 저장하면 된다.

임베디드 타입 사용법

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

임베디드 타입의 장점

  • 재사용이 가능하다.
  • 높은 응집도를 가진다.
  • Period.isWork()같은 (현재 기간이 근무기간에 속하는지 확인하는 메서드) 해당 값 타입만 사용하는 의미 있는 메서드를 만들 수 있다.
  • 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티의 생명주기를 의존한다.
    • 엔티티가 생성되면 생성되고 엔티티가 삭제되면 같이 삭제된다.

임베디드 타입과 테이블 매핑

 

테이블 입장에서는 바뀌는게 없다. 매핑만 해주면 된다.

 

코드를 작성해 보자

 

@Entity
public class Member {

    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String name;
    
    @Embedded
    private Period workPeriod;

    @Embedded
    private Address homeAddress;
@Embeddable
public class Period {

    private LocalDateTime startDate;
    private LocalDateTime endDate;


    public Period() {
    }
@Embeddable
public class Address {
   private String city;
   private String street;
   private String zipcode;

    public Address() {
    }

Member 테이블 생성 SQL

테이블이 잘 생성된 것을 확인할 수 있다.

 

  • 임베디드 타입은 엔티이의 값일 뿐이다.
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블이 같다.
  • 객체와 테이블을 아주 세밀하게 매핑하는 것이 가능하다.
  • 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 매핑한 클래스의 수가 더 많다.
  • 임베디드 타입은 필드에 Entity를 가질 수 있다. ex) Address 클래스의 필드에 Member member가능
  • 임베디드 타입이 null이면 매핑된 칼럼이 모두 null이다.

@AttributeOverride 속성

한 엔티티에서 같은 값 타입을 사용하면??

만약 위 예시에서 Member에  Address를 2개 사용하려면 어떻게 해야 할까?? 그냥 사용하면 칼럼이 중복되므로 에러가 발생한다. 이때 @AttributeOverride를 사용해 준다.

 

@Embedded
private Address homeAddress;
@Embedded
@AttributeOverrides( {
      @AttributeOverride(name = "city",
            column = @Column(name = "WORK_CITY")),
      @AttributeOverride(name = "street",
            column = @Column(name = "WORK_STREET")),
        @AttributeOverride(name = "zipcode",
                column = @Column(name = "WROK_ZIPCODE"))
})
private Address workAddress;

테이블이 잘 생성된 것을 볼 수 있다.

 

'JPA' 카테고리의 다른 글

JPQL(Java Persistence Query Language)  (0) 2024.01.03
값 타입, 값 타입 컬렉션  (0) 2023.09.01
기본값 타입  (0) 2023.08.31
영속성 전이 : CASCADE, 고아객체  (0) 2023.08.31
즉시 로딩과 지연 로딩  (0) 2023.08.30