반응형
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만 가지면 되기 때문이다.
참고
'Language > Java' 카테고리의 다른 글
Java 정리 (0) | 2024.12.08 |
---|---|
프록시와 연관관계 관계 (0) | 2022.11.16 |
Eclipse Svn 설치 (0) | 2022.10.28 |
Eclipse에 Azure 설치 하기 (0) | 2022.10.27 |
엔티티의 생명주기 (0) | 2022.10.10 |