티스토리 뷰

BackEnd/JPA 스터디

[JPA 스터디 4주차] - 값 타입

영지는 달리는중 2021. 7. 22. 15:03

JPA 데이터 타입 분류

  • 엔티티 타입
    • @Entity로 정의하는 객체
    • 데이터가 변해도 식별자로 지속해서 추적이 가능하다.
  • 값 타입
    • 단순히 값으로 사용하는 자바 기본 타입이나 객체
    • 별도의 식별자(id)가 없고 값만 존재하므로 변경시 추적이 불가하다.

값 타입 분류

기본 값 타입

  • 원시타입(int, boolean..), 래핑 타입(String, Integer..)
  • 생명주기를 엔티티에 의존한다.
    • 회원을 삭제하면 이름, 나이 필드도 함께 삭제된다.
  • 값 타입은 공유하면 안된다.
    • 회원 이름 변경 시 다른 회원의 이름도 함께 변경되면 안된다. → 불변 객체로 만들어야 함.
    • 그렇기 때문에 자바의 기본 타입은 항상 값을 복사하는 특징이 있다.
    • 래퍼 클래스는 기본 타입이 아니지만 특수한 케이스로 변경할 수 없다.

임베디드 타입

  • 사용자 정의 참조형 타입으로 새로운 값 타입을 직접 정의할 수 있다.(복합 값 타입이라고도 함)
  • @Embeddable : 값 타입을 정의하는 곳에 표시
  • @Embedded : 값 타입을 사용하는 곳에 표시
  • JPA 스펙상 public 기본 생성자가 필수이다.
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
  • 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티의 생명주기를 의존한다.
  • 재사용과 높은 응집도가 장점이다.

@AttributeOverride

  • 한 엔티티에서 같은 값 타입을 사용하면 컬럼 명이 중복되기 때문에 속성을 재정의 해줘야 한다.
@Entity
public class Member {

    @Id @GeneratedValue
    private Long id;
    
    @Embedded
    private Address homeCity;
    
    @Embedded
    @AttributeOverrides({ 
            @AttributeOverride(name = "city",
                column = @Column("WORK_CITY")),
            @AttributeOverride(name = "street",
                column = @Column("WORK_STREET")),
            @AttributeOverride(name = "zipcode",
                column = @Column("WORK_ZIPCODE"))
    })
    private Address officeCity;

    // getter, setter ...
}

 

값 타입과 불변 객체

값 타입 공유 참조

  • 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다.
  • 아래 예시처럼 의도치않게 member1과 member2의 city가 모두 바뀌어버린다.
  • 이러한 부작용을 막기 위해서 값 타입은 항상 불변해야 한다.
member1.setHomeAddress(new Address("OldCity"));
Address address = member1.getHomeAddress();

address.setCity("NewCity");
member2.setHomeAddress(address);

값 타입 복사

  • 불변 객체인 값 타입을 수정하고 싶을 때는 새로운 인스턴스를 생성해서 갈아끼워야 한다.
  • 불변 객체(immutable object) : 생성 시점 이후 절대 값을 변경할 수 없는 객체

 

값 타입 컬렉션

  • 값 타입을 하나 이상 저장할 때 사용
  • @ElementCollection, @CollectionTable 어노테이션을 사용한다.
  • 데이터베이스는 컬렉션 필드를 같은 테이블에 저장할 수 없기 때문에 별도의 테이블이 필요하다.
  • 값 타입은 엔티티와 다르게 식별자 개념이 없기 때문에 값은 변경하면 추적이 어렵다.
  • 따라서 값 타입 컬렉션에 변경 사항이 발생하면, 주인 엔티티와 연관된 모든 데이터를 삭제하고, 값 타입 컬렉션에 있는 현재 값을 모두 다시 저장한다. 엄청난 비효율이다.
  • 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본키를 구성해야 한다. : null x, 중복 저장 x
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함