JPA의 데이터 타입 분류
-엔티티 타입
-@Entity로 정의하는 객체
-데이터가 변해도 식별자로 지속해서 추적가능
-값 타입
-int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본타입이나 객체
-식별자 없으므로 변경시 추적 불가
값 타입 분류
-자바 기본타입(int, double)
-래퍼 클래스(Integer, Long)
-String
-임베디드 타입(embedded type, 복합 값타입) e.g. 좌표등 커스텀 데이터
-컬렉션 값타입(자바 컬렉션)
기본값 타입
-생명주기를 엔티티에 의존 (e.g. 회원 삭제시 싹다 삭제됨)
-값 타입은 공유 X
임베디드 타입
-새로운 값타입을 직접 정의
-주로 기본값타입을 모아서 만들어서 복합값 타입
값 타입 사용법
-@Embeddable: 값 타입을 정의하는 곳에 표시
-@Embedded: 값 타입을 사용하는 곳에 표시
-기본 생성자 필수
-장점
-재사용, 높은 응집도, 값타입을 소유한 엔티티에 생명주기를 의존
-DB는 바뀔게 없음(매핑만 해주면 됨)
-임베디드 타입과 테이블 매핑
-임베디드 타입을 사용하기 전후 매핑하는 테이블은 같음
-한 엔티티에서 같은 값 타입을 사용하면?
-컬럼 명이 중복됨(@AttributeOverrides를 사용해서 컬럼 명 속성을 재정의)
값타입과 불변객체
-값 타입 공유 참조
-객체는 공유참조를 피할수 없음
-임베디드 타입 같은 값타입을 여러 엔티티에서 공유하면 위험함
-값(인스턴스) 복사해서 사용해야함
불변객체
-객체 타입을 수정을 못하게 만들면 부작용을 원천 차단
-값 타입은 불변 객체(immutable object)로 설계해야함
-생성자로만 설정, 수정자를 없애거나 private
-그냥 무조건 불변으로 만듦(실무)
값 타입의 비교
-인스턴스가 달라도 그 안에 값이 같으면 같아야함
-동일성 비교: 참조값을 비교, == 사용
-동등성 비교: 인스턴스의 값을 비교, equals() 사용
-equals()를 재정의(Override) 해야함, 해시코드 함수도 재정의
값 타입 컬렉션
-값 타입을 하나이상 저장할때 사용
-@ElementCollection. @CollectionTable 사용
-@CollectionTable(name = "FAVORIRTE_FOOD", joinColumns = @JoinColumn(name = "MEMBER_ID"))
-데이터베이스는 컬렉션을 같은 테이블에 저장할수 없음
-컬렉션을 저장하기 위한 별도의 테이블이 필요함
값 타입 컬렉션 사용
-멤버를 persist할때 컬렉션도 같이 persist됨(라이프 사이클이 같음, 멤버에 모든것을 맡김)
-값 타입 컬렉션은 영속성 전이에(Cascade) 고아 객체 제거 기능을 필수로 가진다고 볼수 있음
-디폴트로 지연로딩(LAZY)임
-진짜 단순할때 외에는 실무에서 잘 안쓰임
값 타입 컬렉션의 제약사항
-값 타입은 엔티티와 다르게 식별자 개념이 없음(모든 값을 퉁쳐서 멤버로 의존)
-값은 변경하면 추적이 안됨
-값 타입 컬렉션에 변경 사항이 발생하면, 주인 엔티티와 연관된 모든 데이터를 삭제하고,
값타입 컬렛션에 있는 현재 값을 모두 다시 저장함
-값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본키를 구성해야함(null 입력X, 중복 저장X)
값 타입 컬렉션 대안
-실무에서는 값타입 컬렉션 대신에 일대다 관계를 고려(AddressEntity)
-일대다 관계를 위한 엔티티를 따로 만들고, 여기에서 값 타입을 사용
-영속성 전이(Cascade) + 고아 객체 제거를 사용해서 값 타입 컬렉션처럼 사용
-엔티티승급이 되면 값 수정은 자유롭게 할수있음
정리
-엔티티 타입의 특징(식별자O, 생명주기 관리, 공유가능)
-값 타입의 특징(식별자X, 생명 주기를 엔티티에 의존, 공유하지 않는것이 안전, 불변객체로 만드는것이 안전)
'웹 프로그래밍 > JPA' 카테고리의 다른 글
객체 지향 쿼리 언어_중급 (0) | 2023.03.08 |
---|---|
객체 지향 쿼리 언어_기본 (0) | 2023.03.07 |
영속성 전이(CASCADE)와 고아 객체 (0) | 2023.03.04 |
즉시로딩과 지연로딩 (0) | 2023.03.04 |
프록시 (1) | 2023.03.04 |