Back-End/JPA

JPA - 값타입

Meluu_ 2024. 7. 12. 14:07

 

엔티티 타입

@Entity 로 정의하는 객체
데이터가 변해도 식별자로 지속해서 추적 가능 

 

 

값 타입

int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체
식별자가 없고 값만 있으므로 변경시 추적 불가

 

💠 기본값 타입

primitive type, wrapper type

생명주기를 엔티티에 의존

값타입은 공유 금지

 

 

primitive type(기본 타입)절대 공유 금지

기본 타입은 항상 값을 복사 

 

wrapper 클래스나 String 같은 특수한 클래스는 공유 가능 객체지만 변경 X

Integer a = 10;
Integer b = a;
System.out.println("a = " + a);
System.out.println("b = " + b);
        
b = 20;
System.out.println("a = " + a);
System.out.println("b = " + b);

 

공유는 되나 기존 b를 바꿔도 a의 값이 변경되지 않음

 

 

✔️ 임베디드 타입(복합 값 타입)


새로운 값 타입을 직접 정의 가능

JPA는 임베디드 타입이라 함

주로 기본 값 타입을 모아서 만듦 (복합 값 타입)

 

주소같은 공용으로 자주 쓰이는 것을 임베디트 타입으로 생성

 

사용법

@Embeddable // 값 타입 정의
public class Address {
    private String city;
    private String street;
    //...
}

 

@Entity
public class Member {
	@Id @GeneratedValue
    private Long id;
    
    @Embedded   // 값 타입을 사용하는 곳에 표시
    private Address address;
    
    //...
}

 

 

 

💠 장점

  • 재사용
  • 높은 응집도
  • 해당 값 타입만 사용하는 의미있는 메서드 만들기 가능
  • 임베디드 타입을 포함한 모든 값 타입은 소유한 엔티티의 생명주기를 의존

강의 예시

 

 

 

임베디드 타입은 엔티티의 값일 뿐이다.

임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.

잘 설계한 ORM 애플리케이션 :  매핑한 테이블 수 < 클래스 수

 

 

한 엔티티에서 같은 값 타입을 사용하면 컬럼 명이 중복되기에

@AttributeOverrides, @AttributeOerride 를 사용해서 컬럼 명 속성을 재정의

임베디드 타입의 값이 null 이면 컬럼 값은 모두 null

 

💠 참고
값 타입은 값 타입, 엔티티를 가질 수 있음

 

 

 

 

✔️ 값 타입과 불변 객체


값 타입 공유 금지, 복사해서 사용할 것

 

 

객체 타입의 한계

직접 정의한 값 타입은 자바의 기본 타입이 아닌 객체 타입

객체 타입은 참조 값을 대입하는 것을 막을 방법이 없기에 공유 참조는 피할 수 없다.

 

 

 

 

💠 불변 객체

생성 시점 이후 절대 값을 변경할 수 없는 객체

 

객체 타입 수정을 막아 부작용을 원천 차단

값 타입은 불변객체로 설계

생성자로만 값을 설정, setter는 막음

 

 

참고
Integer, String은 자바가 제공하는 대표적인 불변객체

 

 

 

 

 

 

💠 값 타입 비교

동일성(identity) 비교 : 인스턴스의 참조 값을 비교, == 사용

동등성(equivalence ) 비교 , equals() 사용

 

값 타입은 equals()를 사용해서 동등성을 비교 

값 타입의 equals() 메소드를 재정의

 

객체는 항상 equals and hascode를 구현하고 쓰자

 

✔️ 값 타입 컬렉션


 

데이터 베이스는 컬렉션을 테이블에 저장 불가

별도의 테이블이 필요

 

 

참고
값 타입 컬렉션은 영속성 전이 + 고아 객체 제거 기능을 필수로 가진다.

 

 

 

💠 제약사항

  • 식별자 개념이 없기에 값 변경시 추적 어려움
  • 값 타입 컬렉션에 변경 사항이 발생하면, 주인 엔티티와 연관된 모든 데이터를 삭제하고, 
    값 타입 컬렉션에 있는 현재 값을 모두 다시 저장
  • 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본 키를 구성해야함
    null 입력 x, 중복 저장 x 

 

값 타입 컬렉션 대신에 일대다 관계를 고려 

값 타입 컬렉션은 진짜 단순한 것에만 사용

 

 

 

 

임베디드와 @MappedSuperclass

  • 임베디드                          위임,  has - a 관계
  • @MappedSuperclass      상속,    is - a 관계

 

부모의 속성을 물려받기 때문에 구현이 쉬움

다만 부모와 강한 결합도를 가지게 되어 변화에 대응하기 어려움

 

변화가 자주 일어난다 : 위임 사용

 

🔖 학습내용 출처


자바 ORM 표준 JPA 프로그래밍 - 기본편 / 김영한

https://sorjfkrh5078.tistory.com/282

김영한. (2021). 자바 ORM 표준 JPA 프로그래밍. 에이콘출판사

'Back-End > JPA' 카테고리의 다른 글

API 학습 내용  (0) 2024.07.15
JPA - JPQL  (0) 2024.07.12
JPA - 프록시와 연관관계 관리  (0) 2024.07.10
JPA - 고급 매핑  (0) 2024.07.09
JPA - 1:N 단방향과 양방향에 대해서  (0) 2024.07.09