JPA - 값타입

JPA - 값타입

엔티티 타입(Entity Type)과 값 타입(Value Type)의 특징

- 엔티티 타입(Entity Type)

- 식별자(@Id)가 있다. 그리고 식별자로 구별할 수 있다

- 생명 주기가 있다. (생성 - 영속 - 소멸)

- 공유할 수 있다. 다른 엔티티에서 얼마든지 해당 엔티티를 참조할 수 있다.

- 값 타입(Value Type)

- 임베디드 타입

- 식별자가 없다.

- 생명주기를 엔티티에 의존한다. 즉 의존하는 엔티티가 제거되면 같이 제거된다.

- 공유하지 않는 것이 안전하다. 오직 하나의 주인만이 관리해야하며, 불변객체로 만드는 것이 안전하다.

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

@Entity public class Member { @Id @GeneratedValue private Long id; private String name; @Embedded Period workPeriod; // 근무기간 @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; } @Embeddable public class Period { @Temporal(TemporalType.DATE) Date startDate; @Temporal(TemporalType.DATE) Date endDate; } @Embeddable public class Address { @Column(name="city") private String city; private String street; private String zipcode; }

- 임베디드 타입(=컴포넌트)은 기본 생성자가 필수 (보통 class를 만들면 선언하지 않아도 기본생성자가 컴파일하는 시점에 자동으로 만들어짐)

- 새로 정의한 값 타입들은 재사용할 수도 있고, 응집도도 아주 높다.

- @Embeddable: 값 타입을 정의하는 곳에 표시

- @Embedded: 값 타입을 사용하는 곳에 표시

- @AttributeOverride: 매핑정보를 재정의 (임베디드 타입을 여러번 사용할 때 사용. 보통 같은 임베디드를 여러번 사용하는 일은 많지 않다.)

값 타입과 불변 객체

값 타입은 단순하고 안전하게 다루어야 한다.

member1.setHomeAddress(new Address("OldCity")); Address address = member1.getHomeAddress(); address.setCity("NewCity"); member2.setHomeAddress(address);

공유 참조의 문제점이 발생하는 예제코드이다. 회원1의 주소를 참조해서 사용하여 회원2에 도시 정보를 "NewCity"로 변경하려고했으나, 같은 참조객체를 바라보고 있기때문에, 회원1도 "NewCity"로 변경이 되고 말았다.(자바의 기본타입이 아닌 객체 타입이기 때문에 발생하는 문제) 따라서 이 문제를 해결하기 위해서는 값 타입을 복사해서 사용해야 한다.

Address newAddress = address.clone(); // 객체 복사 (새로운 참조 주소값이 나옴)

(!) 자바의 기본 타입은 대입을 했을 경우에는 값을 복사하여 넘기고, 위와같이 객체를 대입했을 때는 참조를 넘긴다. 값타입을 다룰때는 이러한 특징을 유의해야한다.

- 불변객체

: 한 번 만들면 절대 변경할 수 없는 객체를 불변 객체라 한다. 객체를 불변하게 만들면 값을 수정할 수 없으므로 부작용을 차단할 수 있다. 따라서 값타입은 조회는 가능하지만, 수정은 할 수 없는 불변 객체로 설계하는것이 좋다.

참고자료

- 서적 - 자바 ORM 표준 JPA 프로그래밍 제 9장 - 김영한 지음

from http://xggames.tistory.com/49 by ccl(A) rewrite - 2021-11-16 16:27:24