엔티티 타입
- @Entity 객체를 엔티티 타입이라한다.
- 데이터가 변해도 식별자로 지속해서 추적가능
값 타입
- int, String, Integer 단순히 값으로 사용하는 자바 기본타입이나 객체
- 식별자가 없고 값만 있으므로 변경시 추적불가( int a= 100; a = 200; 으로 값 변경하면 다른값으로 대체)
값 타입 분류
기본값 타입
- 자바 기본타입( primitive type) : int , double ...etc
- 래퍼클래스 : Integer, Long
- String
Integer같은 래퍼 클래스나 String 같은 특수 클래스는 공유는 가능하지만 변경은 X
임베디드 타입
- 새로운 값 타입을 직접 정의할 수 있음
- JPA는 임베디드 타입이라함
- 주로 기본값 타입을 모아서 만들어서 복합값 타입이라고도 함
- int, String과 같은 값 타입
- 장점
- 재사용 가능
- 높은 응집도
- Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드 만들 수 있음
- 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기를 의존함
임베디드 사용법
- @Embeddable : 값 타입을 정의하는곳에 표시
- @Embedded : 값 타입을 사용하는 곳에 표시
- 기본 생성자 필수
객체타입의 한계
- 항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있다.
- 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입이다.
- 자바 기본 타입에 값을 대입하면 값을 복사한다.
- 객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없다.
- 객체의 공유 참조는 피할 수 없다.
// 기본타입 값
int a = 10;
int b = a;
b=4;
//결과 : a==10, b==4
//객체 타입
Member m1 = new Member("하켱");
Member m2 = m1;
m2.setName("하켱켱");
//결과 : m1==하켱켱, m2==하켱켱
불변객체
- 객체 타입을 수정할 수 없게 만들면 부작용을 원천 차단
- 값타입은 불변 객체로 설계해야함
- 불변 객체 : 생성 시점 이후 절대 값을 변경할 수 없는 객체
- 생성자로만 값을 설정하고 수정자를 만들지 않으면 됨
- Integer, String은 자바가 제공하는 대표적인 불변 객체
값 타입 컬렉션
- 값 타입을 하나 이상 저장할때 사용
- @ElementCollection, @CollectionTable사용
- 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다.
- 컬렉션을 저장하기 위한 별도의 테이블이 필요함
@ElementCollection
@CollectionTable(name = "FAVORITE_FOOD", joinColumns = @JoinColumn(name = "MEMBER_ID"))
@Column(name = "FOOD_NAME")
private Set<String> favoriteFoods = new HashSet<>();
@ElementCollection
@CollectionTable(name = "ADDRESS", joinColumns = @JoinColumn(name = "MEMBER_ID"))
private List<Address> addressHistory = new ArrayList<>();
'Java' 카테고리의 다른 글
[JPA] 중급 JPQL (0) | 2022.05.18 |
---|---|
[JPA]JPQL (0) | 2022.05.11 |
[JPA] 상속관계 매핑 (1) | 2022.04.10 |
[JPA] Proxy, 즉시로딩, 지연로딩 (0) | 2022.04.01 |
[JPA] 양방향 관계 (0) | 2022.03.30 |