티스토리 뷰
JPA 데이터 타입 분류
- 엔티티 타입
- @Entity로 정의하는 객체
- 데이터가 변해도 식별자로 지속해서 추적이 가능하다.
- 값 타입
- 단순히 값으로 사용하는 자바 기본 타입이나 객체
- 별도의 식별자(id)가 없고 값만 존재하므로 변경시 추적이 불가하다.
값 타입 분류
기본 값 타입
- 원시타입(int, boolean..), 래핑 타입(String, Integer..)
- 생명주기를 엔티티에 의존한다.
- 회원을 삭제하면 이름, 나이 필드도 함께 삭제된다.
- 값 타입은 공유하면 안된다.
- 회원 이름 변경 시 다른 회원의 이름도 함께 변경되면 안된다. → 불변 객체로 만들어야 함.
- 그렇기 때문에 자바의 기본 타입은 항상 값을 복사하는 특징이 있다.
- 래퍼 클래스는 기본 타입이 아니지만 특수한 케이스로 변경할 수 없다.
임베디드 타입
- 사용자 정의 참조형 타입으로 새로운 값 타입을 직접 정의할 수 있다.(복합 값 타입이라고도 함)
- @Embeddable : 값 타입을 정의하는 곳에 표시
- @Embedded : 값 타입을 사용하는 곳에 표시
- JPA 스펙상 public 기본 생성자가 필수이다.
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
- 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티의 생명주기를 의존한다.
- 재사용과 높은 응집도가 장점이다.
@AttributeOverride
- 한 엔티티에서 같은 값 타입을 사용하면 컬럼 명이 중복되기 때문에 속성을 재정의 해줘야 한다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Embedded
private Address homeCity;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "city",
column = @Column("WORK_CITY")),
@AttributeOverride(name = "street",
column = @Column("WORK_STREET")),
@AttributeOverride(name = "zipcode",
column = @Column("WORK_ZIPCODE"))
})
private Address officeCity;
// getter, setter ...
}
값 타입과 불변 객체
값 타입 공유 참조
- 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다.
- 아래 예시처럼 의도치않게 member1과 member2의 city가 모두 바뀌어버린다.
- 이러한 부작용을 막기 위해서 값 타입은 항상 불변해야 한다.
member1.setHomeAddress(new Address("OldCity"));
Address address = member1.getHomeAddress();
address.setCity("NewCity");
member2.setHomeAddress(address);
값 타입 복사
- 불변 객체인 값 타입을 수정하고 싶을 때는 새로운 인스턴스를 생성해서 갈아끼워야 한다.
- 불변 객체(immutable object) : 생성 시점 이후 절대 값을 변경할 수 없는 객체
값 타입 컬렉션
- 값 타입을 하나 이상 저장할 때 사용
- @ElementCollection, @CollectionTable 어노테이션을 사용한다.
- 데이터베이스는 컬렉션 필드를 같은 테이블에 저장할 수 없기 때문에 별도의 테이블이 필요하다.
- 값 타입은 엔티티와 다르게 식별자 개념이 없기 때문에 값은 변경하면 추적이 어렵다.
- 따라서 값 타입 컬렉션에 변경 사항이 발생하면, 주인 엔티티와 연관된 모든 데이터를 삭제하고, 값 타입 컬렉션에 있는 현재 값을 모두 다시 저장한다. 엄청난 비효율이다.
- 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본키를 구성해야 한다. : null x, 중복 저장 x
'BackEnd > JPA 스터디' 카테고리의 다른 글
[JPA 스터디 3주차] - 프록시와 연관관계 정리 (0) | 2021.07.14 |
---|---|
[JPA 스터디 3주차] - 다양한 연관관계 매핑 (0) | 2021.07.12 |
[JPA 스터디 2주차] - 엔티티 매핑 (0) | 2021.07.05 |
[JPA 스터디 1주차] - 영속성 관리 (0) | 2021.06.26 |
[JPA 스터디 1주차] - JPA 시작 (0) | 2021.06.24 |