JPA Entity 내 값 객체
타입 중
임베디드 타입
을 정리해보자.
주로 배송지, 주소 등같이 필수적으로 묶어야 하는 것들은 아예 객체로 묶어서 관리한다.
ex. 이름, 도시, 주소 번지, 주소 우편번호
@Embeddable
를 붙여주면
주소 임베디드 타입을 생성하기 위해 주소 클래스가 생성되고
@Embedded
의 최대 장점은 @Embedded
를 붙여 많은 필드
를 회원에 이식(임베디드)
시킬 수 있다.
Address
@Embeddable
@Getter
public class Address {
private String city;
private String street;
private String zipcode;
}
Member
@Entity
@Getter @Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String name;
@Embedded
private Address address;
}
💥헷갈리지 말아야할 것은!
DB상에는 Address도 Member 테이블의 필드로 들어가는 거다.
실제로 다음과 같이 추가가 됨! (city, street, zipcode)
💥주의점!
1) 값 객체는 불변 객체여야 한다
는 점! 그래서 @Setter
는 두지 않아야 한다!
2) 값 객체 비교할 때도 객체를 비교하기 때문에 equals()를 사용해야 되고 인스턴스가 달라도 값이 같으면 true가 되기 위해 equals() hashCode()를 재정의
를 해줘야 한다.
재정의하는 내용은 다음 블로그를 참고하기 바란다.
https://velog.io/@mooh2jj/equals와-hashCode는-언제-사용하는가