본문 바로가기
JPA with 김영한

값 타입

by wonseok99 2021. 9. 27.

JPA 에서 사용하는 대표적인 두 가지 타입으로 엔티티 타입과 값 타입이 있다.

- 엔티티 타입

  • @Entity 로 정의하는 객체
  • 데이터가 변해도 식별자(identify) 로 지속해서 추적 가능

- 값 타입

  • int, Long, String 처럼 단순히 값으로 사용하는 기본 타입 혹은 객체
  • 식별자가 없으므로 변경시 추적 불가능

 

기본값 타입

기본 값 타입은 생명주기를 엔티티에 의존한다. 회원에 존재하는 String name 값은 회원[엔티티] 을 삭제해버리면 같이 삭제 된다.
또한 값 타입은 공유할 수 없다.

memberA 와 memberB의 String name 값은 공유되지 않아야 하기 때문이다.

 

 

임베디드 타입

  • 새로운 값 타입을 직접 정의할 수 있다.
  • JPA는 임베디드 타입이라고 한다.
  • 주로 기본 값 타입을 모아 만들어 복합 값 타입이라고도 한다.

ex) Member 엔티티의 여러 속성(Column)들 중, 묶거나 응집해서 사용 가능한 컬럼들을 따로 값 타입을 지정하여 사용하면
그것이 임베디드 타입!

 

[Member]         --->       [Member] ,  [Address]
@Embedded                        @Embedable
ID(PK)                              ID(PK)          CITY
NAME                              NAME           STREET
CITY                                                      ZIPCODE
STREET
ZIPCODE

 

- 장점 :

  1.  재사용성과 높은 응집도.
  2. 특정 임베디드 타입의 값 타입만을 사용하는 메소드를 만들 수 있다.
  3. 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존한다. 

 

@Embedded :  값 타입을 사용하는 곳에 표시
@Embedable : 값 타입을 정의하는 곳에 사용

@AttributeOverride 를 통하여 임베디드 타입을 한 엔티티에서 여러가지로 재정의하여 사용 가능하다.

 

 

값 타입의 공유와 참조

임베디드 타입과 같은 값 타입을 여러 엔티티에서 공유하게 되면 위험할 수 있다. (side effect) 부작용이 발생할 수 있다.

ex) Member1 과 Member2 에서 같은 Address 값 타입을 공유하다가, Member1 의 Address 를 수정하게 되면
Member2 도 함께 수정된다.

객체 타입의 한계 : 자바에서 제공하는 기본 타입과 다르게 객체 타입은 참조를 전달하고 공유하기 때문에 이러한 문제가 발생한다.
따라서, 생성 시점 이후에 절대로 값을 변경 할 수 없는 불변 객체를 생성해야 한다.
[ 생성자로만 값을 설정하고, 그 후에는 수정이 불가하게 Setter를 생성하지 않는다. ]

'JPA with 김영한' 카테고리의 다른 글

JPQL  (0) 2021.09.27
영속성 전이와 고아객체  (0) 2021.09.13
즉시로딩 과 지연로딩  (0) 2021.09.10
프록시(Proxy)  (0) 2021.09.09
상속관계의 매핑  (0) 2021.09.08