[JPA] 임베디드

밀크야살빼자·2023년 5월 4일
0

임베디드 타입이란?

-> 새로운 값 타입을 직접 정의할 수 있으며, 직접 정의한 임베디드 타입도 int, String처럼 값 타입이다. 주로 기본 값 타입을 모아서 만들기 때문에 복합 값 타입이라고도 불린다. 엔티티가 아닌 값 타입으로, 엔티티 타입의 값일 뿐이다.
JPA에서 정의해서 사용해야 한다.

임베디드 타입 사용 방법

  • @Embeddable : 값 타입을 정의하는 곳에 표시한다.
  • @Embedded : 값 타입을 사용하는 곳에 표시한다.
  • 임베디드 타입은 기본 생성자가 필수이다.
  • 하이버네이트는 임베디드 타입을 컴포넌트라 한다.

장점

  • 재사용 가능하다
  • 응집도가 높아진다.
  • 임베디드 타입을 포함한 모든 값 타입은 자신을 소유한 엔티티에 생명주기를 의존한다.
  • 임베디드 타입의 사용유무는 테이블에 영향을 끼치지 않는다.(클래스 구조만 변함)
  • 임베디드 타입의 객체가 null이면 해당 임베디드 타입과 매핑된 컬럼 값 모두 null이 된다.

임베디드 타입은 엔티티의 값일 뿐이여서 값이 속한 엔티티의 테이블에 매핑한다.

임베디드 타입과 연관관계

임베디드 타입은 값 타입을 포함하거나 엔티티를 참조할 수 있다.

//임베디드 사용 전
@Entity
public class Member{
	private Long id;
    private String name;
    
    //주소 관련
    private String city;
    private String street;
    private String state;

}

//임베디드 사용 후
@Entity
public class Member{
	private Long id;
    private String name;
    
    @Embedded
    Address address; //임베디드 타입 포함
  }
  
  
@Embeddable
public class Address{
    String city;
    String street;
    String state;
    @Embedded
    Zipcode zipcode; //임베디드 타입 포함
  }
  
@Embeddable
public class Zipcode{
  String zip;
   String plusFour;
    }

회원 엔티티에는 이름, 주소, 주문 도시, 주문 번지, 주문 우편번호를 가진다.
하지만 이것은 정보를 풀어서 설명한 것이기때문에 정확히 말하자면 회원엔티티에는 이름, 주문을 가진다. 라고 말해야한다.

임베디드 타입과 연관관계

같은 임베디드 타입 클래스를 두 번 사용할 경우 @AttributeOverrides와 @AttributeOverride 어노테이션을 사용해서 각 필드에 매핑되는 컬럼명을 지정해줘야 한다.

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

@Entity
public class Member{
	private Long id;
    private String name;
    
    @Embedded
    Address userAddress; //주소
    
    @Embedded
    Address  friendAddress; // 주소
    
  }
  
  @Entity
public class Member{
	private Long id;
    private String name;
    
    @Embedded
    Address userAddress; //주소
    
    @Embedded
    @AttributeOverrides({ // 새로운 컬럼에 저장 (컬럼명 속성 재정의)
    @AttributeOverride(name="city", column=@Column(name = "FRIEND_CITY"),
    @AttributeOverride(name="street", column=@Column(name = "FRIEND_STREET"),
    @AttributeOverride(name="zipcode", column=@Column(name = "FRIEND_ZIPCODE")})
    Address  friendAddress; // 주소
    
  }
  
profile
기록기록기록기록기록

0개의 댓글