반응형
이 글은 인프런의 김영한 강사님 자바 ORM 표준 JPA 프로그래밍-기본 편 강의 내용을 바탕으로 작성되었습니다.
임베디드 타입 이란?
- 새로운 값 타입을 직접 정의 할수 있음
- JPA는 임베디드 타입이라 함
- 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
- int, String 과 같은 값 타입
- 쉽게 말해 하나의 오브젝트 타입이라고 생각하면 편함
- @Embeddable : 값 타입을 정의하는 곳에 표시
- @Embedded : 값 타입을 사용하는 곳에 표시
- 기본 생성자 필수
ex)
저번 예제에 이어서 Address를 임베디드 타입으로 따로 분류를 해놨다. 따라서 Member 테이블과 Delivery테이블에서 활요할수 있따.
Member
@Entity
public class Member extends BaseEntity{
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
@Embedded
private Address address;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
}
Delivery
@Entity
public class Delivery extends BaseEntity{
@Id
@GeneratedValue
private Long id;
@Embedded
private Address address;
private DeliveryStatus status;
@OneToOne(mappedBy = "delivery", fetch = FetchType.LAZY)
private Order order;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public DeliveryStatus getStatus() {
return status;
}
public void setStatus(DeliveryStatus status) {
this.status = status;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
}
Address
@Embeddable
public class Address {
private String city;
private String street;
private String zipCode;
public String fullAddress(){
return getCity() + "" + getStreet() + "" + getZipCode();
}
private void setCity(String city) {
this.city = city;
}
private void setStreet(String street) {
this.street = street;
}
private void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public String getCity() {
return city;
}
public String getStreet() {
return street;
}
public String getZipCode() {
return zipCode;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Address address = (Address) o;
return Objects.equals(getCity(), address.getCity()) && Objects.equals(getStreet(), address.getStreet()) && Objects.equals(getZipCode(), address.getZipCode());
}
@Override
public int hashCode() {
return Objects.hash(getCity(), getStreet(), getZipCode());
}
}
이런식으로 Member, Delivery 테이블에는 @Embedded, Address테이블에는 @Embeddable 어노이션으로 표기해줬다.
컬랙션타입
컬랙션 타입이란, DB에서는 리스나 해쉬맵으로 저장하는 방법이 없지만, 객체에서는 가능함, 때문에 객체에서 컬랙션타입으로 지정을 해주면 새로운 테이블로 별도로 지정이 됨.
ex)
@ElementCollection
@CollectionTable(name = "FAVORITE_FOOD", joinColumns = @JoinColumn(name = "MEMBER_ID"))
@Column(name = "FOOD_NAME")
private Set<String> favoriteFoods = new HashSet<>();
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "MEMBER_ID")
private List<AddressEntity> addressHistroy = new ArrayList<>();
이런식으로 해쉬맵과 리스트로 지정에 ElementCollection어노테이션으로 지정을 해준다. 그리고 JoinColumn으로 컬럼 이름을 지정해주면, FAVORITE_FOOD에 joinColumn에 조인이되는 컬럼의 이름이 지정이 됨. 다음은 리스트의 AddressEntity 부분이다.
@Entity
@Table(name = "ADDRESS")
public class AddressEntity {
@Id
@GeneratedValue
private Long id;
private Address address;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
이런식으로 지정을 해줬다. 이걸 티비 테이블상 본다면
이런식으로 모델링 되는것을 확인 할수 있다
반응형
'spring > JPA' 카테고리의 다른 글
[JPA] 객체지향 쿼리 언어(JPQL) (0) | 2023.12.14 |
---|---|
[JPA] 프록시와 연관관계 관리 (1) | 2023.12.11 |
[JPA] 고급매핑 (0) | 2023.12.11 |
[JPA] 다양한 연관관계 매핑 (0) | 2023.12.08 |
[JPA] 연관관계 매핑 기초 (2) | 2023.12.07 |