값 타입

개발하는 도비·2023년 4월 29일

JPA

목록 보기
7/13
post-thumbnail

JPA의 데이터 타입 분류

  • entity 타입
    • @Entity로 정의하는 객체
    • 데이터가 변해도 식별자로 지속해서 추적 가능
  • 값 타입
    • 단순히 값으로 사용하는 자바 기본 타입이나 객체(int, Integer, String)
    • 식별자가 없고 값만 있으므로 변경시 추적 불가

기본값 타입

  • 자바 기본 타입(int, double)

  • 래퍼 클래스(Integer, Long)

  • String

  • 생명주기를 entity의 의존

  • 값 타입 공유 x

    • int, double 같은 기본 타입은 항상 값을 복사하기에 값을 공유하지 x
    • Integer같은 래처 클래서, String 같은 특수 클래스는 변경 X

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

  • 새로운 값 타입을 직접 정의 가능
  • 사용법
    • @Embeddable -> 클래스 쪽에
    • @Embedded -> 사용하는 위치에
    • 기본 생성자 필수
  • 장점
    • 재사용
    • 높은 응집도
    • 해당 값 타입만 사용하는 의미있는 메소드 만들 수 있음.
    • 값타입을 소유한 entity의 의존함.
  • 특징
    • 사용하기 전과 후에 mapping하는 테이블은 같다.
      • 임베디드 타입의 경우 기존의 테이블의 값을 하나로 묶은 것일뿐.
      • 즉 테이블의 값이 많아져 관리하고 어려울 때 목적에 따라 묶을 수 있음.
      • 하지만 테이블 자체는 값들을 하나의 테이블로 관리.
    • 객체와 테이블을 아주 세밀하게 mapping이 가능
  • 속성 재정의
    • @AttributeOverrides, @AttributeOverride
  • 임베디드 타입의 값이 null -> mapping 컬럼 null

값 타입과 불변 객체

  • 값 타입 공유한다면?
    • 두명이 같은 값타입을 쓰고 있다. -> 그 중 한명의 값타입이 변경 -> 두사람 모두 값이 변경.
    • 따라서 인스턴스 복사해서 사용해야함.
  • 객체 타입의 한계
    • 객체의 공유 참조를 막을 수가 없다. -> 작성 중 실수로 값 타입을 공유하더라도 컴파일 에러가 아님.
    • 간단하게 = 값을 막을 수 없음.
  • 불변 객체
    • 생성 시점 이후로 절대 값을 변경할 수 없는 객체
    • 객체 타입의 한계를 차단하기 위해 존재.
    • 생성자로만 값을 설정하고 수정자(Setter)를 만들지 않음 -> Integer, String이 대표적.

값 타입 비교

  • 동일성(identity) 비교
    • 인스턴스 참조 값 비교
    • == 사용
  • 동등성(equivalence) 비교
    • 인스턴스 값 비교
    • equals() 사용
      • a.equals(b)
      • 적절히 재정의 해야함.

값 타입 컬렉션

  • 값 타입을 하나 이상 저장할 때 사용

  • @ElementCollection, @CollectionTable 사용

  • 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다.

    • 하나의 테이블에 넣을 수 없어 일대다로 풀어야함
    • 컬렉션을 저장하기 위한 별도의 테이블이 필요함
  • 영속성 전에(Cascade) + 고아 객체 제거 기능이 있는 것 처럼 작동.

  • 값 타입 컬렉션의 제약사항

    • entity와 다르게 식별자 개념이 없음.
    • 값 추적이 어려움.
    • 값 타입 컬렉션이 변경 발생 -> 주인 entity와 연관된 데이터 삭제 -> 변경 값을 다시 저장
      • 전체 제거 -> 모든 값 저장 쿼리 보냄.
    • 값 타입 컬렉션을 mapping하는 테이블은 모든 컬럼을 묶어서 기본 키를 구성
      • null x, 중복 저장 x
  • 값 타입 컬렉션 대안

    • 일대다 관계를 위한 entity를 만듬 -> 해당 entity값 타입 사용
    • 영속성 전이(Cascade) + 고아 객체 제거 사용

참조

  • 인프런 : 자바 ORM 표준 JPA 프로그래밍 - 기본편
  • 링크
profile
도비의 양말을 찾아서

0개의 댓글