우리는 엔티티에 대해 설명할 때 보통 아주 상세 하게 설명하기 보단 추상적으로 설명한다.
ex ) 회원 엔티티에는 이름, 근무 시작 날짜 , 근무 종료 날짜 , 주소 도시, 주소 번지, 주소 우편번호가 있다가 아닌
→ 회원엔티티는 이름, 근무일, 집주소를 가지고 있다라고 추상적으로 설명
→ 이렇게 묶어 낼 수 있는걸 객체로 뽑아내는게 임베디드 타입!
임베디드 타입
- 새로운 값 타입을 직접 정의할 수 있음
- JPA는 임베디드 타입이라 함
- 주로 기본 값 타입을 모아서 만들어서 복합값 타입이라고도 함
- 여기서 기본 값 타입이란 int, String과 같은 값 타입
임베디드 타입 사용법
- @Embeddable : 값 타입을 정의하는 곳에 표시
- @Embedded : 값 타입을 사용하는 곳에 표시
- 기본생성자 필수
임베디드 타입의 장점
- 재사용성
- 높은 응집도
- Period.isWork()처러 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있다.
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함

Member.java
@Entity
public class Member{
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String username;
// 기간 Period
@Embedded
private Period workPeriod;
// 주소 Address
@Embedded
private Address homeAddress;
// Embedded를 사용하지 않으면 아래처럼 선언해줘야함
/* private LocalDateTime startDate;
private LocalDateTime endDate;
private String city;
private String street;
private String zipcode; */
}
Period.java
@Embeddable // 값 타입이라고 지정
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
// 기본생성자 필수!
public Period(){}
public Period(LocalDateTime startDate, LocalDateTime endDate) {
this.startDate = startDate;
this.endDate = endDate;
}
}
Address.java
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
// 엔티티를 가져와서 사용할 수 있다!
// private Member member;
public Address(){}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
}
임베디드 타입과 테이블 매핑
- 임베디드 타입은 엔티티의 값일 뿐이다.
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
- 객체와 테이블을 세밀하게 매핑하는 것이 가능
- 잘 설계한 ORM 애플리케이션 = 매핑한 테이블의 수 < 클래스의 수
임베디드 타입과 null
- 임베디드 타입의 값이 null 이면 매핑한 컬럼 값은 모두 null
// null로 주면 startDate, endDate 값 모두 null 이다.
@Embedded
private Period workPeriod = null;
@AttributeOverride : 속성 재정의
- 한 엔티티에서 같은 값 타입을 사용하면? → 컬럼명이 중복됨
- @AttributeOverrides, @AttributeOverride 사용해서 컬럼 명 속성을 재정의
// 주소 Address
@Embedded
private Address homeAddress;
// 만약 Address를 한 엔티티에서 여러번 사용하려면??? -> 컬럼명을 변경해줘야함(AttributeOverrides 사용)
@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;

'JAVA' 카테고리의 다른 글
[JAVA] 값 타입 컬렉션 (0) | 2022.01.13 |
---|---|
[JAVA] 값 타입과 불변객체 (0) | 2022.01.11 |
[JAVA] 영속성 전이(CASCADE) + 고아객체 (0) | 2022.01.06 |
[JAVA] 즉시로딩과 지연로딩 (0) | 2022.01.05 |
[JAVA] 프록시 (0) | 2022.01.04 |