JPA

JPA_값 타입

EJUN 2023. 10. 5. 10:19

값 타입 분류

  • 기본 값 타입
    • 자바 기본 타입(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사용한 경우 쿼리
임베디드 타입을 사용한 경우 쿼리

정리

  • 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