- @Entity로 정의하는 객체
- 데이터가 변해도 식별자로 지속해서 추적 가능
- 예 ) 회원 엔티티의 키나 나이 값을 변경하여도 식별자로 인식가능
- 자바 기본 타입
- 예 : String name, int age
- !! 생명주기를 엔티티의 의존
- 예 ) 회원을 삭제하면 이름, 나이 필드도 함께 삭제
- !! 값 타입은 공유하면 X
- 예 ) 회원 이름 변경시 다른 회원의 이름도 함께 변경되면 안됨
- 참고 : 자바의 기본 타입은 절대 공유 X
- int, double 같은 기본타입 절대 공유 X
- 기본 타입은 항상 값을 복사함
- Integer 같은 래퍼 클래스나 String 같은 특수한 클래스는 값이 공유 가능한 객체이지만 변경 X
// 기본값 타임 예시 코드
int a = 10;
int b = a;
a = 20;
System.out.println("a = " + a) // a = 20
System.out.println("b = " + b) // b = 10
- int, Integer, String처럼 단순한 값으로 사용하는 자바 기본 타입이나 객체
- 식별자가 없고 값만 있음으로 변경시 추적 불가
- 예 ) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체
- 새로운 값 타입을 직접 정의할수 있음
- JPA는 임베디드 타입이라한다.
- 주로 기본 값 타입을 모아 만들어서 복합 값 타입이라 한다.
- int, String과 같은 값 타입
1
- 회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 우편번호를 가진다.
- 공통된 속성이 눈에 보일것이다. (startDate, endDate)
2
- 공통된 속성으로 묶어 이름, 근무기간, 집 주소로 하는것을 임베디드 타입이라고한다.
- 재사용
- 높은 응집도
- 해당 값 타입만 사용하는 의미있는 메서드를 만들수 있다.
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존한다.
- @Embeddable : 값 타입을 정의하는 곳에 표시
- @Embedded : 값 타입을 사용하는 곳에 표시
- !! 기본 생성자 필수
- 임베디드 타입은 엔티티의 값일 뿐이다.
- !!! (중요) 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다
- 객체와 테이블을 아주 세밀하게 매핑하는것이 가능
- 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다.
- 값 타입을 하나 이상 저장할 때 사용
- @ElementCollection, @Collection Table사용
- 컬렉션을 저장하기 위한 별도의 테이블이 필요하다.
- 객체 타입을 수정할수 없게 만들면 부작용을 미리 차단.
- 값 타입은 불변 객체로 설계해야함
- 불변 객체 : 생성 시점 이후 절대 값을 변경할수 없는 객체
- 생성자로만 값을 설정하고 수정자 (Setter)를 만들지 않으면된다.
- 참고 : Integer, String은 자바가 제공하는 대표적인 불변객체
- !!! 값 타입은 웬만하면 불변으로 제약을 걸어야된다.
엔티티 타입의 특징
- 식별자 O
- 생명 주기 관리
- 공유
값 타입의 특징
- 식별자 X
- 생명 주기를 엔티티에 의존
- 공유 하지 않는것이 안전 (복사해서 사용)
- 불변 객체로 만드는것이 안전