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

 
@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() { }
}
@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;
}
JPA에서 임베디드 타입 사용법
- @Embeddable 	: 값 타입을 정의하는 곳에 표시
 
- @Embedded 	: 값 타입을 사용하는 곳에 표시
 
- 기본 생성자 필수
 
임베디드 타입의 장점
- 재사용
 
- 높은 응집도
 
- 객체지향적인 설계 가능하다
- 임베디드 타입을 통해 객체를 분리하더라도 테이블은 하나만 매핑된다

 
 
임베디드 타입과 테이블 매핑
- 임베디드 타입은 엔티티의 값일 뿐이다.
 
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
 
- 잘 설계된 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많음
 
@AttributeOverride : 속성 재정의
- 한 엔티티에서 같은 값 타입을 사용하면 -> 컬럼명이 중복됨
 
@Attributeoverrides, @AttributeOverride를 사용해서 컬렁 명 속성을 재정의 
Member안에 동일한 임베디드 타입이 있다면 어떻게 될까?
@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;
		
		@Embedded
    private Address workAddress;
		
	
}
@AttributeOverride 를 사용해서 컬러 명 속성을 재정의 해준다. 
@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_STREET"))
    })
    private Address workAddress;

불변객체
- 객체 타입을 수정할 수 없게 만들면 부작용을 원천 차단
 
- 값 타입은 불변 객체로 설계해야함
 
- 생성 시점 이후 절대 값을 변경할 수 없는 객체
 
- 생성자로만 값을 설정하고 수정자(setter)를 만들지 않으면 됨