값 타입 분류
- 기본 값 타입
- 자바 기본 타입 (int, double)
- 래퍼 클래스 (Integer , Long)
- String
- 임베디드 타입 (복합 값 타입)
- 컬랙션 값 타입
참고
- 기본 값 타입은 공유되지 않는다. (값만 복사할 뿐, 참조해서 가져오지 않는다. / c언어의 *p를 이용한 값 변경을 생각해보자)
- 래퍼클래스는 공유 가능한 객체지만 변경할 수 없다. (setter 또는 새로운 객체 생성 등을 이용하여 변경할 수 있지 “=”을 통해 자체적으로 변경할 수는 없다)
- 클래스 객체 참조 값을 변경 시키키 때문에 변경된 값이 공유될 수 있다.
임베디드 타입
embedded - '내부에 탑재된' 의미를 가지고 있다. 여러 속성등이 나열되어 있는 엔티티를 embedded type 객체로 모아서 관리할 수 있다.
사용법
- @Embeddable : 값 타입을 정의 하는 곳에 표시
// 기간 임베디드 타입
@Embeddable
public class Peroid {
@Temporal(TemporalType.DATE)
Date startDate;
@Temporal(TemporalType/Date)
Date endDate;
// ...
public boolean isWork (Date date) {
// .. 값 타입을 위한 메서드를 정의
}
}
- @Embedded : 값 타입을 사용하는 곳에 표시
// 임베디드 타입 사용
@Entity
public class Member {
@Id @GeneratedVAlue
private Long id;
private String name;
@Embedded
private Period workPeriod; // 근무 기간
@Embedded
private Address homeAddress; // 집 주소
}
- 기본 생성자가 필수임.
member.setWorkPeriod(new Period());
임베디드 타입의 장점
- 재사용성
- 높은 응집도
- 임베디드 타입을 포함하고 있는 엔티티의 생명주기에 의존하기 때문에 관리하기 편함
값 타입과 불변 객체
값 타입 공유 참조
임베디드 타입 또한 클래스 객체에 속한다. 따라서 참조를 공유하게 된다면 해당 변경한 객체의 값이 공유될 수 있다. 이를 통해 side effect(갱신 이상)이 발생할 수 있다.
불변 객체의 사용
불변이라는 제약으로 부작용을 막는다는 아이디어
- 임베디드 타입으로 공유된 객체를 변경, 수정시키는 setter는 사용하지 않고 Builder를 이용해서 새로운 객체를 생성하는 것이 바람직하다
- 즉 불변 객체로 설계해서 부작용을 원천 차단하는 것이다.
정리
실무에서는 값 컬랙션 보다는 엔티티를 생성한 후 join으로 연관관계를 만들어서 사용하는 경우가 많다.
따라서 값 타입이나 값 컬랙션은 엔티티 하나에서만 소유하고 있고 있거나, 아주 단순한 관계를 맺고 있을 경우에만 사용하는 것이 좋다.