기본값 타입
Integer, String같은 래퍼 클래스는 참조값이 복사되는데 대신 변경 자체가 불가능함.
숫자 100을 200으로 변경하면 완전히 다른 값으로 대체됨. (so. side effect 안 생김)
임베디드 타입
4:18 참고
임베디드 타입은 isWork(): 지금 일하는 기간에 속하는지 알아보는 메소드 만들 수 있음
임베디드 타입은 값타입에 속하며, 모든 값타입은 엔티티 생셩주기에 의존된다. (엔티티가 삭제되면 값 타입도 삭제됨)
17:58 참고
Member 필드에 임베디드 타입(Address)을 두 개 사용하고 싶을 때
private Address homeAdress;
private Address workAddress;
-------------
임베디드 타입은 joinColumn할 필요 없음
값 타입과 불변 객체

임베디드 타입을 공유하고 싶으면 엔티티를 사용해야함.
임베디드타입은 기본타입이 아니고 객체 타입.
임베디드타입은 값타입이어서 엔티티에 의존적이지만 객체타입이기도 함.(한계가 있다)

---------------------
setter를 없애 불변객체로 만든다.
바꾸고 싶으면 생성자로 아예 새로운 객체(address.getStree(), address.getZipcode())를 만들어 덮어씌우기.
-------------
핵심! 값타입은 항상 불변으로 만들어라~
값 타입의 비교
!주의! 임베디드 타입은 ==이 아니라 eqauls를 사용해야 하는데 equals는 java에서 만들어주는걸로 사용하기
equals 만들면 hash code도 만들어야 한다.

값 타입 컬렉션
값 타입 중 컬렉션( set, list )은 따로 table을 만들어주되, 원래 id를 같이 pk,fk로 사용한다. (본인의 pk가 따로 있을 시, 엔티티가 되어버림 set, list는 엔티티는 아님.)

@ElementCollection사용해야함.
테이블을 만들어야해서 @CollectionTable (name = "table명", joinColumns= @ JoinColumn(name = "조인되는 일쪽의 컬럼명")
컬렉션들은 지연로딩으로 find됨.
컬렉션 table(class)엔 equals구현해주기 (remove할때 remove(여기에 넣어줄거 객체 new Address("old1", ~, ~)) 이케 해줘야하는데 이걸 eqauls로 비교해서 찾기 때문에
핵심! 컬렉션 컬럼 모두를 묶어 pk로 만들어줘야 데이터를 모두 지우고 다시 insert하는걸 방지하는데 이럴빠엔 컬렉션말고 걍 일대 다 관계를 고려해라
-------------------
entity 속에 값 타입을 넣자
class AddressEntity{
private Address address; (임베디드 값 타입)
}
class Member{
@OneToMany(cascade= CascadeType.ALL, orphanRemoval = true)
@JoinColumn (name = "MEMBER_ID")
private List<AddressEntity> addressHistory = new ArrayList<>();
}
값 타입 컬렉션 사용 예
셀렉트 박스를 주고 사용자한테 골라라
["치킨", "족발", "피자"] 중에 골라라
'Spring boot' 카테고리의 다른 글
[spring boot] 파라미터 바인딩 (0) | 2022.01.21 |
---|---|
[spring boot] 3차 정리 (페치 조인, 벌크 연산) (0) | 2022.01.21 |
[spring boot] 변경감지(dirty checking)와 병합(merge) (0) | 2022.01.20 |
[spring boot] 영속성 전이 (cascade)와 orphanRemoval 차이 (0) | 2022.01.20 |
[spring boot] 실전! (0) | 2022.01.10 |