본문 바로가기

웹 프로그래밍/JPA

기본값 타입, 임베디드 타입

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