[JPA] 임베디드 타입(embedded type)

Harry park·2022년 6월 22일
0

JPA

목록 보기
6/8
post-thumbnail

임베디드 타입(복합 값 타입)

여러 개의 값을 묶어 새로운 값 타입을 직접 정의하여 사용 할 수 있는데, 이를 JPA에서는 임베디드(embedded type)이라 정의한다.
직접 정의한 임베디드 타입도 int, String 처럼 값 타입이다.

임베디드 타입 예시

📖 임베디드 타입을 지정하지 않은 경우

회원 엔티티는 이름, 주소를 가진다.

@Entity
public class Member {
  
  @Id @GeneratedValue
  private Long id;
  private String name;
  
  // 집 주소 표현
  private String city;
  private String street;
  private String zipcode;
  // getter.. setter..
}

임베디드 타입을 지정하지 않은 경우에는 코드가 위와 같은데, 이는 객체지향적이지 않으며 응집력이 상대적으로 약한 코드이다.

📖 임베디드 타입을 지정한 경우

@Entity
public class Member {
  
  @Id @GeneratedValue
  private Long id;
  private String name;
  
  // 집 주소 표현
  @Embadded
  private Address address;
}

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

코드가 더욱 명확해지고 객체지향성을 높이며, 응집력이 상대적으로 높다.


임베디드 타입 적용방법

값 타입을 정의하는 곳에 @Embeddable을 표시
값 타입을 사용하는 곳에 @Embedded 표시

  • 임베디드 타입이 Null이면, 매핑된 컬럼 값도 모두 Null이다.
    🚨 임베디드 타입은 기본 생성자가 필수로 정의되어 있어야 한다.
    또한, 엔티티와 다르게 식별자도 없으며, 생명주기는 자신을 소유하는 엔티티에 의존한다.

임베디드 타입 장점

  • 높은 재사용성
  • 높은 응집도
  • 해당 값 타입만 사용하는 의미있는 메서드를 만들어 사용할 수 있다.

hibernate에서는 embedded를 composition이라 부른다.

회원-컴포지션 관계 UML - 김영한님 강의 중 member-composition UML

임베디드 타입 특징

  • 식별자가 없다.
  • 생명주기가 사용된 엔티티에 의존한다.
  • 객체이기 때문에 여러 엔티티에서 공유해서 사용하면 사이드 이펙트가 생길 수 있다.
  • 자바의 String 처럼 값 타입은 불변 객체로 만들어야한다.
    생성자로만 값을 설정하고 Setter 허용하지 말것
  • 인스턴스가 달라도 값이 같으면 같은 것으로 봄.
    equals()로 비교
  • 임베디드 타입은 값 타입을 포함하거나 엔티티를 참조할 수 있다.
@Embedded
private Address homeAddress;

@Embedded
private Address workAddress;
  • 컬럼을 재정의 할 수 있다.
    @AttributeOverrides, @AttributeOverride

@AttributeOverrides와 @AttributeOverride

@Entity
public class Member {
  
  @Id @GeneratedValue
  private Long id;
  private String name;
  
  @Embedded
  Address homeAddress;
  
  @Embedded
  @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"))
  })
  Address companyAddress;
}


참고 사이트

tstory - developer_hm님 블로그
velog - conatuseus님 블로그


개인적으로 공부하며 기록한 내용으로, 틀린 내용이 있는 경우 덧글을 달아주시면 감사하겠습니다. 😍

profile
Jr. Backend Engineer

0개의 댓글