본문 바로가기

JPA

2월 3일 JPA 임베디드 타입

임베디드 타입 (복합값 타입) (내장 타입)
-새로운 갑 타입을 직접 정의할 수 있다.
-JPA는 임베디드 타입(EmbaddedType) 라고 한다.
-주로 기본값 타입을 모아서 만들어서 복합값 타입이라고도 한다,
-int , String같은 값타입들을 모아서 만든다.
-엔티티가 아니라 그냥 "값" 이라 추적도 안되고 변경하면 끝이다. (하드코딩 값과 같음)

ex) 회원 엔티티는 이름 , 근무시작일, 근무종료일 , 주소도시 , 주소번지 , 주소우편번호를 가진다.

{Member}
-id
-name
-startDate
-endDate
-city
-street
-zipCode

// 여기서 시작일, 종료일이 형식이 같고 , 도시주소 , 주소번지 ,주소 우편번호 등도 비슷한 형태이며 여기저기서 사용된다.
그래서 위같이 형태가 비슷하고 여기저기서 사용되는 값을 묶어줄수 있다 
그것이 임베디드 타입이다.

{Member (entity)}
-id : Long (레퍼 타입이라 값이 변해도 주소값이 남음)
-name : String
-workPeriod : period
-workAddress : address
여기서 Period 와 Address 는 따로 정의한 임베디드 타입이다.

{Member (entity)}

-id : long
-name : String 
-workPeriod : period
-workAddress : address

{period (valueType)}
startDate : date
endDate : date

{address (valueType)}
city : String
street : String
zipCode : String

임베디드로 사용할 클래스를 새로 만든것으로
문제는 이 클래스를 JPA 엔티티에서 필드값으로 사용하는 방법이다.
@Embeddable : 값 타입을 정의하는 곳(클래스)에 표시
@Embedded : 값타입을 사용하는곳(엔티티)에 표시
*기본생성자가 필수적으로 필요하다.

임베디드 타입의 장점

-재사용이 가능하다
-높은 응집도
-period.isWork 처럼 해당 값타입만 사용하는 의미있는 메소드를 만들수 있다.
-임베디드 타입을 포함한 모든 값타입은 값타입을 소유한 엔티티에 생명주기에 의존한다.
(임베디드를 가진 엔티티가 없어지면 임베디드 필드도 사라져서 추적이 불가능하다. 임베디드도 결국은 그냥 값, 레퍼 처럼 주소값을 받는게 아니다)