JPA의 데이터 타입 2가지
1) 엔티티 타입
2) 값 타입
- 기본값 타입(basic value type) : 자바기본타입(예:int, double), 래퍼클래스(예:Integer), String
- 임베디드 타입(embeddedtype, 복합 값 타입) : JPA에서 사용자가 직접 정의한 값 타입. 자바의 기본타입이 아닌 객체 타입이다.
- 컬렉션값 타입(colection value type) : 하나 이상의 값 타입을 저장할 때 사용.
엔티티 타입
특징
식별자(@id)가 있다. 엔티티 타입은 식별자가 있고 식별자로 구별 할 수 있다.
생명 주기가 있다. 생성, 영속화, 소멸하는 생명 주기가 있다. em.persist (entity)로 영속화한다. em. remove(entity)로 제거한다.
공유할 수 있다(공유 참조)
임베디드 타입
임베디드 타입을 사용하기 위한 2가지 어노테이션
- @Embeddable : 값타입을 정의하는 곳에 표시
- @Embedded : 값타입을 사용하는 곳에 표시
특징
식별자가 없다
생명 주기를 엔티티에 의존한다. 의존하는 엔티티가 제거되면 같이 제거된다.
오직 하나의 주인만이 관리해야 한다.
임베디드 타입은 기본 생성자가 필수이다.
임베디드타입을 포함한 모든 값타입은 엔티티의 생명주기에 의존하므로 엔티티와 임베디드 타입의 관계를 UML로 표현하면 컴포지션composition 관계가 된다
임베디드 타입은 값타입을 포함하거나 엔티티를 참조 할 수 있다.
임베디드타입이 null이면 매핑한 컬럼값은 모두 null이 된다.
임베디드타입 같은 값타입을 여러 엔티티에서 공유하면 위험하다. (부작용 현상. side effect). 값 타입 공유 참조로 인한 버그는 발견하기 어렵다. 부작용을 막으려면 값(인스턴스)을 복사해서 사용해야 한다. 기본타입은 완전히 독립된 값을 가지고 부작용도 없으나, address같은 객체 타입은 자바는 값을 대입하면 항상 참조값을 전달한다. 객체의 공유 참조는 피할 수 없으므로, 예를들어 Adress 객체의 setCity() 같은 수정자메소드를 모두 제거하게 되면 공유 참조를 해도 값을 변경하지 못하므로 부작용 발생을 막을 수 있다. 따라서 값타입은 될 수 있으면 불변객체(immutable Object)로 설계하는 것이 안전하다.
* 불변객체 : 한 번 생성되면 절대 변경할 수 없는 객체. 불변객체 값은 조회는 가능하나 수정할 수 없다. 불변객체도 객체이므로 참조 값 공유는 피할 수 없지만, 공유해도 인스턴스 값을 수정할 수 없으므로 부작용이 없다. 생성자로만 값을 설정하고 수정자를 만들지 않으면 된다.
* 식별자가 필요하고 지속해서 값을 추적하고 구분하고 변경해야 한다면 그것은 값타입이 아닌 엔티티다.
값 타입 비교
- 동일성(identity) 비교 : 인스턴스의 참조값을 비교, ==사용.
- 동등성(equivalence) 비교 : 인스턴스의 값을 비교, equals() 사용.
값 타입 컬렉션
값 타입을 하나 이상 저정하려면 컬렉션에 보관하고 @ElementCollection, @CollectionTable 어노테이션을 사용하면 된다.
회의록 후기
- 워크벤치란? - MySQL 워크벤치(MySQL Workbench)는 SQL 개발과 관리, 데이터베이스 설계, 생성 그리고 유지를 위한 단일 개발 통합 환경을 제공하는 비주얼 데이터베이스 설계 도구
- id는 왜 베이스엔티티로 안하는가? - 가끔 JPA가 인식을 못할때가 있다? 디비 마이그레이션할때 꼬였었다?
- 일대일 관계에서 식별관계로 pk를 줘본적이 있는가? - 어차피 꼭 하나만 생기니까, 어차피 연결도 해야하니까 라고 생각되서 시도하셨다(유림님)
'🖤 Book Study > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
12장. 스프링 데이터 JPA (나중에작성) (0) | 2023.06.29 |
---|---|
10장. 객체지향 쿼리 언어 (0) | 2023.05.30 |
8장. 프록시와 연관관계 관리 (0) | 2023.05.16 |
7장. 고급 매핑 (0) | 2023.05.09 |