JPA 값 타입 : 임베디드 타입

  • 기본값 타입
  • 임베디드 타입
  • 값 타입과 불변 객체
  • 값 타입의 비교
  • 값 타입 컬렉션



임베디드 타입

  • 새로운 값 타입을 직접 정의할 수 있음
  • JPA는 임베디드 타입(embedded type) 이라 함
  • 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
  • int, String과 같은 값 타입


  • 회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다.

임베디드 타입 사용X

@Entity
public class Member extends BaseEntity {
  
  @Id
  @GeneratedValue
  @Column(name = "MEMBER_ID")
  private Long id;
  
  @Column(name = "USERNAME")
  private String username;
  
  // 기간 Period
  private LocalDateTime startDate;
  private LocalDateTime endDate;
  
  // 주소 address
  private String city;
  private String street;
  private String zipcode;
}

임베디드 타입 사용O

@Embeddable
public class Period {
  private LocalDateTime startDate;
  private LocalDateTime endDate;
  
  public boolean isWork() {
    // 현재 일하는 중인지에 대한 비즈니스 로직 작성 가능
  }
}

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


@Entity
public class Member extends BaseEntity {
  
  @Id
  @GeneratedValue
  @Column(name = "MEMBER_ID")
  private Long id;
  
  @Column(name = "USERNAME")
  private String username;
  
  // 기간 Period
  @Embedded
  private Period period;
  
  // 주소 address
  @Embedded
	private Address address;
}



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

  • 임베디드 타입은 엔티티의 값일 뿐이다.
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
  • 객체와 테이블을 아주 세밀하게 매핑하는 것이 가능
  • 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많음

@AttributeOverride : 속성 재정의

  • 하나의 엔티티에서 같은 값 타입을 사용하면?
  • 컬럼 명이 중복됨
  • @AttributeOverrides, @AttributeOverride 를 사용해서 컬럼명 속성을 재정의
@Embeddable
public class Period {
  private LocalDateTime startDate;
  private LocalDateTime endDate;
  
  public boolean isWork() {
    // 현재 일하는 중인지에 대한 비즈니스 로직 작성 가능
  }
}

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


@Entity
public class Member extends BaseEntity {
  
  @Id
  @GeneratedValue
  @Column(name = "MEMBER_ID")
  private Long id;
  
  @Column(name = "USERNAME")
  private String username;
  
  // 주소 address
  @Embedded
	private Address workAddress;
  
  @Embedded
  @AttributeOverrides({
    @AttributeOverride(name="city", column=@Column(name = "home_city")),
    @AttributeOverride(name="street", column=@Column(name = "home_street")),
    @AttributeOverride(name="zipcode", column=@Column(name = "home_zipcode")),
  })
	private Address homeAddress;
}




Django 와 비교

  • 위에서 배운 내용을 Django 에서 정의한다면 아래와 같이 될 것이다.
class BaseModel(models.Model):
  class Meta:
    abstract = True
  
  created_at = ...
  updated_at = ...
  
  
class BaseWorkModel(models.Model):
  class Meta:
    abstract = True
  
  started_at = ...
  ended_at = ...
  
  
class BaseAddressModel(models.Model):
  class Meta:
    abstract = True
  
  city = ...
  street = ...
  zipcode = ...
  
  
class User(BaseModel, BaseWorkModel, BaseAddressModel, models.Model):
  ...

댓글남기기