인프런 강의 < 자바 ORM 표준 JPA 프로그래밍 - 기본편 > 정리
엔티티 타입
@Entity로 정의하는 객체
- 데이터가 변해도 식별자로 지속해서 추적 가능
기본값 타입
- int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체
- 식별자가 없고 값만 있으므로 변경시 추적 불가
- 생명주기가 엔티티에 의존한다.
- 회원을 삭제하면 이름 나이(기본값) 필드도 함께 삭제
- 값 타입은 공유하지 않는다.
임베디드 타입
- 새로운 값 타입을 직접 정의할 수 있다.
- JPA는 임베디드 타입이다.
- int, String과 같은 값 타입
사용법은 값 타입을 정의하는 곳에 @Embeddable, 값 타입을 사용하는 곳에 @Embedded를 사용하며, 기본 생성자가 필요하다.

- 위 그림과 같이 묶어낼 수 있는 속성들을 모아서
임베디드 타입이라고 한다.
해당 엔티티를 테이블과 매핑을 하는 방법은 아래 그림과 같다.

임베디드 타입 장점
- 재사용성
- 높은 응집도
- Period.isWork() 처럼 해당값 타입만 사용하는 의미 있는 메소드 구현 가능
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함
값 타입과 불변 객체
임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다.
값 타입의 실제 인스턴스인 값을 공유하는 것을 위험하므로 대신 값을 복사해서 사용한다.
불변 객체
- 객체 타입을 수정할 수 없게 애초에 부작용을 차단한다.
- 값 타입은 불변객체로 설계해야한다.
- 생성자로만 값을 설정하고
setter를 만들지 않는다.
값을 바꾸고 싶을때는 기존 객체에서 바꾸고 싶지 않은 정보는 get으로 가져오고 수정하고 싶은 파라미터만 수정해서 새로운 객체를 생성한다.
값 타입의 비교
값 타입은 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 본다.
동일성 비교: 인스턴스의 참조 값을 비교, ==사용
동등성 비교: 인스턴스의 값을 비교, equals()사용
값 타입 컬렉션
- 값 타입을 하나 이상 저장할 때 사용
@ElementCollection, @CollectionTable 사용
- 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다.
- 컬렉션을 저장하기 위한 별도의 테이블이 필요하다.

- 값 타입 컬렉션도 지연 로딩 전략을 사용한다.
- 값 타입 컬렉션은 영속성 Cascade + 고아 객체 제거 기능을 필수로 가진다.
< 자료 출처: 자바 ORM 표준 JPA 프로그래밍 - 기본편 >