이모저모

JPA의 데이터 타입 본문

coding/Java, Spring

JPA의 데이터 타입

Jeo 2022. 2. 22. 14:23

JPA기본강의 필기 _ 김영한님

JPA의 데이터 타입 

  1. Entity type
    • @Entity로 정의
    • 데이터가 변해도 지속하는 식별자를 통해 추적 가능
  2. Value type(값타입)
    • int, Integer, String 같이 단순한 값으로 사용하는 자바 기본 타입 및 객체
    • 식별자 없이 값만 있으므로 변경시 추적 불가
    • 3가지 종류
      • 기본값 타입
        • 자바 기본타입(int, double), 래퍼클래스(Integer, Long), String
        • 생명주기를 entity에 의존
        • 기본타입은 절대 공유되지 않는다.
        • (래퍼클래스, String의 경우라고 해도, 참조값을 공유할 수는 있지만 변경은 안 된다)
      • 임베디드 타입(embedded type, 복합 값 타입)
        • 새로운 값 타입을 직접 정의할 수 있음
        • JPA는 임베디드 타입
        • 주로 기본값 타입을 모아서 만들어서 복합값타입이라고도 함
        • int, String과 같은 값타입
        • 사용방식
          • @Embeddable: 값처럼 삽입시킬 클래스위에 어노테이션 달기
          • @Embedded:  임베더블 값을 자신의 컬럼으로 매핑하는 클래스의 임베디드컬럼 위에 어노테이션 달기
        • 주의) 임베디드 타입의 값타입을 여러 엔터티에서 공유하는 경우
        • → 나는 회원1의 주소(임베디드 값)만 변경하고 싶었던 건데, 이전에 같은 임베디드 값을 들고 있던 회원2의 주소도 같이 변경되어 버리는 문제. (절대 반갑지 않은 side effect)
        • 값을 복사해서 사용하면 되겠다..?
        • 그러나! 임베디드 타입처럼 직접 정의한 값타입은 자바의 기본 타입이 아니라 객체 타입
        • 객체타입은 참조를 전달! 그렇다면 결국 하나의 객체를 공유하는 것...
        • 그렇다면 어떻게 해야 할까?
        • 불변객체로 만들기! (생성자로만 값 설정하고, setter를 빼거나 private으로 만들거나)
        • 그렇다면 실제로 값을 바꾸고 싶을 때는 어떻게 해야 하나?
        • 새로 만들어야 함. (값이라는 것은 애초에 갈아끼워야 하는 것이니까~)
      • 값타입의 비교
        • 임베디드 타입에 대해서, 기본적으로 객체이기 때문에 서로 다른 인스턴스에 대해 동일성을 확보할 수 없다.
        •  그러나 값타입은 값이 같으면 같다고 말해주어야 한다.
        • 그럼 어떻게 이 같음을 인식할까?
          • 동일성 비교(==) vs 동등성 비교(equals) 를 구분함으로써!!
          • 값타입의 비교는 동등성비교를 사용.
  3. 값타입 컬렉션
    • 값타입의 컬렉션을 저장하고 싶을 때 ( 예: Address 임베디드타입의 리스트 형태인 addressHistory)
    • 해당 컬럼에는 @ElementCollection, @CollectionTable (→ 컬렉션을 저장하기 위한 별도의 테이블 필요하므로) 어노테이션 달기
    • 값 타입 컬렉션도 지연로딩 전략을 사용
    • 영속성 전이, 고아 객체 제거 기능을 가짐. (일대다 매핑에서 배웠던 것과 비슷한 느낌)
    • 제약 
      • 값 타입 컬렉션에 변경사항이 발생하면, 일부만 변화하는 것이 아니다!
      • 주인 엔티티와 연관된 모든 데이터를 삭제하고, 값 타입 컬렉션에 있는 현재 값을 모두 다시 저장
      • 값을 변경하면 추적이 어렵다... 
    • 실무에서는?! 값 타입 컬렉션 대신에 일대다 관계 사용~ (값타입을 엔터티로 승급)
    • 일대다 엔터티 테이블들 사이의 관계로 다루고 + Cascade.ALL + orphanRemoval = true 이렇게 사용
    • 그래도 쓸 때가 있다. => 언제? 정말 정말 단순할 때 (select box. radio button 등등)
Comments