TIL

값 객체

기본 값 타입

JPA의 데이터 타입 분류

값 타입 분류

기본 값 타입

참고: 자바의 기본 타입은 절대 공유X

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

임베디드 타입 사용 법

@Embeddable
public class Address {

    private String city;
    private String street;
    private String zipcode;

//    값 타입은 변경 불가능하게 설계해야 한다.
//    @Setter 를 제거하고, 생성자에서 값을 모두 초기화해서 변경 불가능한 클래스를 만들자
    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }

    protected Address() {
    }
}

JPA 스펙상 엔티티나 임베디드 타입(@Embeddable)은 자바 기본 생성자(default constructor)를 public 또는 protected 로 설정해야 한다. public으로 두는 것 보다는 protected 로 설정하는 것이 그나마 더 안전하다. (얘를 상속할 일이 없기 때문에 다른 데서 가져다 쓸 수 없다)

@Embedded // 내장 타입
private Address address;

임베디드 타입의 장점

임베디드 타입과 테이블 매핑

@AttributeOverride: 속성 재정의

@Embedded // 내장 타입
private Address homeAddress;

@Embedded // 내장 타입
@AttributeOverrides({
   @AttributeOverride(name = "city",
      column = @Column(name = "WORK_CITY")),
   @AttributeOverride(name = "street",
      column = @Column(name = "WORK_STREET")),
   @AttributeOverride(name = "zipcode",
      column = @Column(name = "WORK_ZIPCODE"))
})
private Address workAddress;

임베디드 타입과 null

임베디드 타입, @MappedSuperclass 뭘 써야하나?

값 타입과 불변 객체

값 타입은 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념이다. 따라서 값 타입은 단순하고 안전하게 다룰 수 있어야 한다

값 타입 공유 참조

값 타입 복사

객체 타입의 한계

불변 객체

값 타입의 비교

값 타입 컬렉션

관계형 DB는 값 타입의 컬렉션을 가지고 있을 수 없다. 별도의 테이블로 뽑아서 일대다로 매핑해야 한다.

값 타입 컬렉션 사용

public class Member {



@ElementCollection
@CollectionTable(name = "FAVORITE_FOOD", 
    joinColumns = @JoinColumn(name = "MEMBER_ID")
)
@Column(name = "FOOD_NAME")
private Set<String> favoriteFoods = new HashSet<>();

@ElementCollection
@CollectionTable(name = "ADDRESS", 
    joinColumns = @JoinColumn(name = "MEMBER_ID")
)
private List<Address> addressHistory = new ArrayList<>();

값 타입 컬렉션의 제약사항

값 타입 컬렉션 대안