[JPA] 값 타입

Jiwoo Kim·2020년 11월 17일
0

JPA 마스터하기

목록 보기
12/14
post-thumbnail

Basic Value Type

  • 자바 기본 타입
  • 래퍼 클래스
  • String

Embedded Type

복합 값 타입 (Components)

테이블 Mapping

  • @Embeddable: 값 타입 정의
  • @Embedded: 값 타입 사용
  • @AttributeOverrides: 매핑 컬럼명이 중복인 경우
@Embedded Address homeAddress;

@Embedded
@AttributeOverrides({
	@AttributeOverride(name="city", column=@Column(name="COMPANY_CITY")),
    	@AttributeOverride(name="street", column=@Column(name="COMPANY_STREET")),
    	@AttributeOverride(name="zipcode", column=@Column(name="COMPANY_ZIPCODE"))
})
Address companyAddress;

공유 참조와 불변 객체

공유 참조

  • 객체를 대입하면 참조를 공유하기 때문에 부작용이 발생한다.
  • 항상 객체.clone()을 통해 값을 복사해야 한다.

불변 객체

  • 값 타입을 Immutable Object로 설정하면 부작용을 원천 차단할 수 있다.
  • Integer, String 역시 불변 객체다.

값 타입의 비교

동일성(Identity) 비교

  • 인스턴스의 참조 값 비교
  • ==

동등성(Equivalence) 비교

  • 인스턴스의 값 비교
    *equals()

값 타입 컬렉션

  • @ElementCollection
  • @CollectionTable(name = "{table_name}", joinColumns = @JoinColumn(name = "{mapping_column_name}"))
  • 컬렉션의 변경 사항을 DB에 반영할 때, 연관된 모든 데이터를 삭제하고 컬렉션의 모든 값을 다시 저장한다.
  • 매핑 컬럼 수가 많다면 컬렉션 대신 엔티티를 생성해서 일대다 관계로 설정해야 한다.
// Collection 대체 entity
@Entity
public class AddressEntity {

    @Id
    @GeneratedValue
    private Long id;
    
    @Embedded Address address;
}

// Member entity
...
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "MEMBER_ID")
private List<AddressEntity> addressHistory = new ArrayList<AddressEntity>();
...

Entity Type & Value Type

Entity Type

  • 식별자(@Id)가 있다.
  • 생명 주기가 있다.
  • 공유 참조가 가능하다.

Value Type

  • 식별자가 없다.
  • 생명 주기를 엔티티에 의존한다.
  • Immutable Object로 만들고 공유하지 않는 것이 안전하다.

본 포스팅은 자바 ORM 표준 JPA 프로그래밍 (김영한 저)을 읽고 정리한 내용입니다. (2020.09.13)

0개의 댓글