Language/Java

[JPA] 값 타입, 임베디드 타입

JUNGKEUNG 2022. 11. 22. 22:51

JPA의 데이터 타입 분류

1. 엔티티 타입

  • @Entity로 정의하는 객체
  • 데이터가 변해도 식별자로 지속해서 추적이 가능하다
  • 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능

 

2. 값 타입

  • int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본타입이나 객체
  • 식별자가 없고 값만 있으므로 변경시 추적 불가
  • 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체

 

3. 기본값 타입

  • 자바 기본 타입 (int , double)
  • 래퍼 클래스 (integer, Long)
  • String
  • 임베디드 타입 (embedded type, 복합 값 타입)
  • 컬렉션 값 타입 (Conllection value type)

 

 

참고 : 자바의 기본 타입은 절대 공유되지 않는다
int a = 20;
int b = a; // 20이라는 값을 복사
b = 10;
  • int, double 같은 기본 타입(primitive type)은 절대 공유 안함
  • 기본 타입은 항상 값을 복사한다
  • Integer같은 래퍼 클래스나 String 같은 같은 특수한 클래스는 공유 가능한 객체이지만 변경이 안된다.
Integer a = new Integer(10);
Integer b = a; // a의 참조를 복사
a.setValue(20); //Side Effect!!

 

임베디드 타입 (복합 타입)

  • 새로운 값 타입을 직접 정의할 수 있다
  • JPA는 임베디드 타입(embedded type)이라 한다
  • 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 한다
  • int, String과 같은 값 타입이다

 

예시

  • 회원 엔티티는 이름,근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다
    • startDate, endDate/ city, street, zipcode 는 공통 필드로 사용 가능
  • (근무 시작일, 근무 종료일) / ( 주소 도시, 주소 번지, 주소 우편번호) 를 각자 묶어서 사용한다.

 

임베디드 타입 사용법

  • @Embeddable : 값 타입을 정의하는 곳에 표시
  • @Embeddable : 값 타입을 사용하는 곳에 표시
  • 기본 생성자 필수

 

임베디드 타입의 장점

  • 재사용이 가능하다
  • 높은 응집도
  • perid.isWork()처럼 해당 값 타입만 사용하는 의미 이쓴 메소드를 만들 수 있다
  • 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기를 의존하다

 

임베디드 타입과 테이블 매핑

  • 값 타입 / 임베디드 타입에 상관없이 DB 회원 테이블의 형태는 동일하다
  • 하지만 객체의 경우는 데이터 뿐만 아니라 그에 맞는 기능(메서드)를 가지고 있기 때문에 공통으로 묶은 임베디드 타입으로 구성하면 이점이 있다.
@Entity
public class Member {
	...
    @Embedded
    private Address homeAddress;
    @embedded
    private Address workAddress;
    ...
}
@Embeddable
@NoArgsConstructor
public class Address {
	private String city;
    private String street;
    private String zipcode;
    ...
}
@Embeddable
@NoArgsConstructor
public class Period {
	private LocalDateTime startDate;
    private LocalDateTime endDate;
    ...
}
  • 임베디드 타입은 엔티티의 값일 뿐이다
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다
  • 객체와 테이블을 아주 세밀하게 (find- grained) 매핑하는 것이 가능하다
  • 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다

 

임베디드 타입과 연관관계

  • 임베디드 타입은 임베디드 타입을 가질 수 있다
  • e.g.Address<<Value>> 임베디드 타입은 Zipcode <<Value>> 라는 임베디드 타입을 가진다
  • 임베디드 타입은 엔티티 타입을 가질 수 있다
  • e.g.PhoneNumber<<Value>> 임베디드 타입이 PhoneEntity <<Entity>>를 가질 수 있다
  • FK만 가지면 되기 때문이다.

 

참고


https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

'Language > Java' 카테고리의 다른 글

프록시와 연관관계 관계  (0) 2022.11.16
Eclipse Svn 설치  (0) 2022.10.28
Eclipse에 Azure 설치 하기  (0) 2022.10.27
엔티티의 생명주기  (0) 2022.10.10
긴 매개변수 목록  (0) 2022.08.15