Java/Spring Data Jpa
          
임베디드 타입
          
            by o3oppp
            2023. 12. 30.
            
          
        
       
      
                    
            임베디드 타입(복합 값 타입)
- 새로운 값 타입을 직접 정의할 수 있음
- 주로 기본 값 타입을 모아서 만들기때문에 복합 값 타입이라고도 함
- @Embeddable : 값 타입을 정의하는 곳에 표시
- @Embedded : 값 타입을 사용하는 곳에 표시
- 기본 생성자 필수
import javax.persistence.Embeddable;
import java.time.LocalDateTime;
@Embeddable
public class Period {
    //기간
    private LocalDateTime startDate;
    private LocalDateTime endDate;
    public Period() {
    }
    public Period(LocalDateTime startDate, LocalDateTime endDate) {
        this.startDate = startDate;
        this.endDate = endDate;
    }
    ...
}
@Embeddable
public class Address {
    private String city;
    private String street;
    private String zipcode;
    public Address() {
    }
    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }
    ...
}
@Entity
public class Member {
    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    @Column(name = "USERNAME")
    private String userName;
    //기간
    @Embedded
    private Period workPeriod;
    //주소
    @Embedded
    private Address homeAddress;
    ...
}
장점
- 재사용성
- 높은 응집도
- 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기에 의존
-   예를 들어 회원을 삭제하면 이름, 나이 필드도 함께 삭제
 
테이블 매핑
- 임베디드 타입은 엔티티의 값일 뿐
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같음
- 단지 객체와 테이블을 아주 세밀하게 매핑하는 기능
한 엔티티에서 같은 값 타입 사용
- 컬럼명 중복 시 에러
- @AttributeOverrides
- @AttributeOverride
@Entity
public class Member {
    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    @Column(name = "USERNAME")
    private String userName;
    //기간
    @Embedded
    private Period workPeriod;
    //주소
    @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 = "WORK_ZIPCODE"))
    })
    private Address workAddress;
    ...
}
 
