본문 바로가기

Spring boot

[spring boot] 3차 정리 (값 타입)

기본값 타입

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<>();

}  

 

 

값 타입 컬렉션 사용 예 
셀렉트 박스를 주고 사용자한테 골라라 

["치킨", "족발", "피자"] 중에 골라라