728x90
반응형
SMALL
임베디드 타입은 꽤나 사용성을 높여준다. 임베디드 타입은 무엇이냐면 특정 엔티티에 필요한 필드를 클래스타입으로 받는 경우이다.
아래 예를 보자.
좌측 테이블은 기본타입으로만 설정된 테이블이다. 물론 이게 잘못된 건 아니다. 근데 기본 타입이 아니고 클래스로 설계된 타입을 사용할 때 얻는 이점이 매우 많기 때문에 이를 우측 테이블인 임베디드형 테이블로 변환할 수 있다.
임베디드 타입을 사용시 어떤 이점이 있을까?
- 재사용성
- 높은 응집도
- 의미 있는 메서드를 만들어 사용할 수 있고 그에 따라 객체 지향형 설계가 가능해짐 예) Period.isWork()와 같은 메서드를 만들어서 해당 객체에서만 사용되는 메서드를 Period 클래스에서 구현 가능
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함
그럼 임베디드 타입을 사용하는 방법을 알아보자.
728x90
반응형
SMALL
Period Class
package org.example.entity.embeded;
import javax.persistence.Embeddable;
import java.time.LocalDateTime;
@Embeddable
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
public Period() {}
public LocalDateTime getStartDate() {
return startDate;
}
public void setStartDate(LocalDateTime startDate) {
this.startDate = startDate;
}
public LocalDateTime getEndDate() {
return endDate;
}
public void setEndDate(LocalDateTime endDate) {
this.endDate = endDate;
}
}
Address Class
package org.example.entity.embeded;
import javax.persistence.Embeddable;
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
public Address() {}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
}
이렇게 두 개의 클래스가 있고 이 두개의 클래스에 어노테이션으로 @Embeddable을 사용해준다. 그니까 직관적으로 이 클래스는 다른 클래스에 임베디드가 될 수 있다는 의미다.
Member Class
package org.example.entity.embeded;
import javax.persistence.*;
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
@Embedded
private Period period;
@Embedded
private Address address;
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 Period getPeriod() {
return period;
}
public void setPeriod(Period period) {
this.period = period;
}
}
위처럼 Period, Address 클래스를 타입으로 설정한 필드에 어노테이션으로 @Embedded를 붙여준다. 즉 이것도 마찬가지로 이 필드는 임베디드 되었다는 의미다.
이렇게 멤버 클래스를 만들면 DB에 생성되는 데이터는 임베디드를 사용하지 않은 상태랑 완전히 똑같다. 즉, 테이블에는 그냥 아래 모습 그대로 들어간다.
그럼 왜 사용할까? 다시 말하지만 객체 지향적으로 코드를 작성하기에 훨씬 유리하기 때문이다. 사용성도 높아지고. 각 클래스가 가지고 있는 메서드를 사용하는 이점이 생각보다 엄청 크다.
728x90
반응형
LIST
'JPA(Java Persistence API)' 카테고리의 다른 글
[JPA] Part 15. JPQL (0) | 2023.10.28 |
---|---|
[JPA] Part 14. 컬렉션 값 타입 (0) | 2023.10.25 |
[JPA] Part 12. CASCADE (2) | 2023.10.23 |
[JPA] Part 11. 지연로딩과 즉시로딩 (2) | 2023.10.23 |
[JPA] Part 10. 프록시 (0) | 2023.10.22 |