기본값 타입
- 자바 기본 타입 (int, double)
- 래퍼 클래스(Integer, Long)
- String
- 생명주기를 엔티티의 의존
- 예) 회원을 삭제하면 이름, 나이 필드도 함께 삭제
- 값 타입은 공유하면 x
- 예) 회원 이름 변경시 다른 회원의 이름도 함께 변경되면 안됨
임베디드 타입(Embedded type, 복합 값 타입)
- 새로운 값 타입을 직접 정의 할 수 있다.
- JPA 는 임베디드 타입이라고 한다
- 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
- Int String과 같은 값 타입
- @Embeddable: 값 타입을 정의하는 곳에 표시
- @Embedded: 값 타입을 사용하는 곳에 표시
- 기본 생성자 필수
- 장점
- 재사용
- 높은 응집도
- Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함
- 임베디드 타입은 엔티티 값일 뿐이다
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
- 객체와 테이블을 아주 세밀하게 매핑하는 것이 가능
- 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많음
컬렉션 값 타입(Collection value type)
값 타입은 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념이다. 따라서 값 타입은 단수하고 안전하게 다룰 수 있어야 한다.
값 타입 비교
- 동일성 비교 인스턴스의 참조 값을 비교 == 사용
- 동등성 비교: 인스턴스의 값을 비교, equals() 사용
- 값 타입은 a.equals(b) 를 사용해서 동등성 비교를 해야함
- 값 타입의 equals()메소드를 적정하게 재정의(주로 모든 필드 사용)
값 타입 컬렉션 대안
실무에서는 상황에 따라 값 타입 컬렉션 대신에 일다대 관계를 고려
일대다 관계를 위한 엔티티를 만들고, 여기에서 값 타입을 사용