값 타입 분류
- 기본 값 타입
- 자바 기본 타입(int,double…)
- 래퍼(Wrapper)클래스(Integer,Long)
- String
- 임베디드 타입
- 컬렉션 값 타입
임베디트 타입
- 새로운 값 타입을 직접 정의할 수 있음
- 기본 값 타입을 모아서 만들어서 복합값 타입이라고 함
위의 사진에서 Member라는 엔티티 안에서 Period, Address라는 객체를 새로 만들어서 아래의 코드 처럼 객체 선언
public class Member{
...
//임베디드 타입
private Period workPeriod;
private Address homeAddress;
}
임베디드 타입 사용법
- @Embeddable → 값 타입을 정의하는 곳에 표시
@Embeddable
public class Period{
private LocalDateTime start;
pricate LocalDateTime end;
}
- @Embedded → 값 타입을 사용하는 곳에 표시
public class Member{
...
//임베디드 타입
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
}
- 기본 생성자 필수
임베디드 타입의 장점
- 재사용 용이
- 높은 응집도
- 해당 값 타입만 사용하는 의미있는 메소드 생성 가능
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존
임베디드 타입과 테이블 매핑
- 임베디드 타입은 엔티티의 값일 뿐
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블 동일
- 객체와 테이블을 아주 세밀하게 매핑하는 것이 가능
임베디드 타입 vs MappedSuperClass
- 임베디드 타입
- 타입 별로 사용될 메소드들이 나뉘어져야할 때 사용
- MappedSuperClass
- 다른 엔티티에도 공통적으로 사용되는 부분일 때 사용
- ex) BaseTimeEntity(시간을 나타낼때 사용)
그럼 무엇을 사용하는 게 좋을까?
- 자바에서는 상속보다는 위임을 선호함 그 이유는 자바는 다중상속을 할 수 없고, 객체의 유연성도 떨어지기 때문
- 하지만 단순히 엔티티의 중복된 필드를 재사용하는 것이 목적이라면 상속을 사용하는 것이 JPQL을 사용할 때 보다 편리함
정리
- MappedSuperClass로 정의하면 Entity로 정의하는 것이고, 여러 Entity에 공통적으로 적용할 때 사용, 상속 사용
- 임베디드 타입으로 정의하면 Value타입으로 정의하는 것이고 비슷한 속성을 가지는 애트리뷰트를 하나의 값으로 만들어 재사용성 증가하는 방법, 위임 사용
'JPA' 카테고리의 다른 글
JPA_DataSource (1) | 2023.10.17 |
---|---|
JPA_프록시와 연관관계관리 (0) | 2023.09.26 |
JPA_연관 관계 매핑 (0) | 2023.09.23 |
JPA_영속성 컨텍스트 & 객체와 테이블 (0) | 2023.09.19 |