JPA [기본] JPA의 데이터 타입 분류

신재원·2023년 1월 30일
0

JPA 기본

목록 보기
21/31

엔티티 타입

  • @Entity로 정의하는 객체
  • 데이터가 변해도 식별자로 지속해서 추적 가능
  • 예 ) 회원 엔티티의 키나 나이 값을 변경하여도 식별자로 인식가능

값 타입

  • 값 타입은 복잡한 객체 세상을 조금이라도 단순화 하려고 만든 개념이다

값 타입의 분류

1. 기본값 타입

  • 자바 기본 타입
    • 예 : String name, int age
    • !! 생명주기를 엔티티의 의존
      • 예 ) 회원을 삭제하면 이름, 나이 필드도 함께 삭제
    • !! 값 타입은 공유하면 X
      • 예 ) 회원 이름 변경시 다른 회원의 이름도 함께 변경되면 안됨
  • 참고 : 자바의 기본 타입은 절대 공유 X
    • int, double 같은 기본타입 절대 공유 X
    • 기본 타입은 항상 값을 복사함
    • Integer 같은 래퍼 클래스나 String 같은 특수한 클래스는 값이 공유 가능한 객체이지만 변경 X
// 기본값 타임 예시 코드
int a = 10;
int b = a;
a = 20;
System.out.println("a = " + a) // a = 20
System.out.println("b = " + b) // b = 10
  • 래퍼 클래스 (Integer, Long)
  • String

정리

  • int, Integer, String처럼 단순한 값으로 사용하는 자바 기본 타입이나 객체
    • 식별자가 없고 값만 있음으로 변경시 추적 불가
    • 예 ) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체

2. 임베디드 타입 (embedded type, 복합 값 타입) 중요!!

  • 새로운 값 타입을 직접 정의할수 있음
  • JPA는 임베디드 타입이라한다.
  • 주로 기본 값 타입을 모아 만들어서 복합 값 타입이라 한다.
  • int, String과 같은 값 타입

1

  • 회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 우편번호를 가진다.
    • 공통된 속성이 눈에 보일것이다. (startDate, endDate)

2

  • 공통된 속성으로 묶어 이름, 근무기간, 집 주소로 하는것을 임베디드 타입이라고한다.

  • 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험함
    • 부작용 (Side effect) 발생
      • 회원1 의 city만 변경하고싶은데 회원 1, 2의 city가 둘다 변경되는 부작용 발생
    • 값 타입의 실제 인스턴스의 값을 공유하는것은 위험하다.
    • 해결법 : 값(인스턴스)를 복사해서 사용해야된다. 쉽게말해 new 인스턴스를 사용해 값을 새로 갈아 끼워야 된다.
      get("기존 사항").set("수정 사항") 이 방법처럼 사용하면 절대 안된다.

임베디드 타입의 장점

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

임베디드 타입 사용법

    1. @Embeddable : 값 타입을 정의하는 곳에 표시
    1. @Embedded : 값 타입을 사용하는 곳에 표시
    1. !! 기본 생성자 필수

임베디드 타입과 테이블 매핑

    1. 임베디드 타입은 엔티티의 값일 뿐이다.
    1. !!! (중요) 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다
    1. 객체와 테이블을 아주 세밀하게 매핑하는것이 가능
    1. 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다.

3. 컬렉션 타입 (collection value type)

  • 값 타입을 하나 이상 저장할 때 사용
  • @ElementCollection, @Collection Table사용
  • 컬렉션을 저장하기 위한 별도의 테이블이 필요하다.
  • 참고 : 컬렉션은 전부 지연로딩이다 (fetch = LAZY)
    • 중요 !!! 값 타입 컬렉션에 변경 사항이 발생하면, 주인 엔티티와 연관된 "모든 데이터를 삭제"하고, 값 타입 컬렉션에 있는 현재 값을 "모두 다시 저장" 한다.
  • == > 값 컬렉션 타입은 실무에서 사용 X 다르게 풀어야된다.
    • 일대다 관계로 고려한다.

불변 객체

  • 객체 타입을 수정할수 없게 만들면 부작용을 미리 차단.
  • 값 타입은 불변 객체로 설계해야함
  • 불변 객체 : 생성 시점 이후 절대 값을 변경할수 없는 객체
  • 생성자로만 값을 설정하고 수정자 (Setter)를 만들지 않으면된다.
  • 참고 : Integer, String은 자바가 제공하는 대표적인 불변객체
    • !!! 값 타입은 웬만하면 불변으로 제약을 걸어야된다.

최종 정리

  • 엔티티 타입의 특징

    • 식별자 O
    • 생명 주기 관리
    • 공유
  • 값 타입의 특징

    • 식별자 X
    • 생명 주기를 엔티티에 의존
    • 공유 하지 않는것이 안전 (복사해서 사용)
    • 불변 객체로 만드는것이 안전
  • 값 타입은 정말 값 타입이라 판단 될때 사용
    • 엔티티와 값 타입을 혼동해서 엔티티를 값 타입으로 만들면 안된다.
    • 식별자가 필요하고, 지속해서 값을 추적, 변경해야 한다면 그것은 값 타입이 아닌 ""엔티티"" 이다.

0개의 댓글