임베디드 타입
- JPA 에서 복합 값을 임베디드 타입을 통해 구현가능하다
- 복합값?
- 여러 값을 하나로 모아서 표현하는 값
- 임베디드 타입
- 엔티티에 속하는 값 타입으로, 복잡한 객체의 모델을 단순화할때 유용
- 복합값?
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
@Temporal(TemporalType.DATE)
private Date startDate;
@Temporal(TemporalType.DATE)
private Date endDate;
private String city;
private String street;
private String zipcode;
//....
}
- 위 코드의 경우
- 이름, 근무 시작일 종료일 도시 거리 등이 자세하게 나열되어있습니다.
- 이를 객체지향적으로 표현하기 위해
- 근무 기간
- 주소 정보를
임베디드 타입으로 추출이 가능합니다.
- 아래는 임베디드 타입으로 추출하면 어떻게 되는지에 대해 코드로 설명함
@Getter
@Setter
@Entity
@Table(name = "member")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
private String name;
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
}
@Getter
@Setter
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
}
@Getter
@Setter
@Embeddable
public class Period {
@Temporal(TemporalType.DATE)
private LocalDateTime startDate;
@Temporal(TemporalType.DATE)
private LocalDateTime endDate;
public boolean isWork() {
// 일하고있는지 체크가능
return true;
}
}
@Embeddable
- 값 타입을 정의하는 곳에 표시 ( 클래스 등)
@Embedded
- 값 타입을 사용하는 곳에 표시
팁
- 임베디드 타입은 반드시 기본 생성자가 있어야함
- JPA 는 리플렉션을 통해 객체를 생성한다
- 기본 생성자는 아무 생성자가 생성된것이 없으면 컴파일시 생성해줌
- 값 타입은 해당 값 타입 만을 위한 로직을 포함가능
isWork()
등의 비즈니스 로직을 내부에 담고있을 수 있다.
@Embeddable
과@Embedded
중 하나만 표기해도 된다.- 하지만 가독성과 유지보수성을 위해 둘다 표기해주는 것이 나을 것 같다.
Uploaded by N2T
'자바 > JPA' 카테고리의 다른 글
[JPA] __**@AttributeOverride: 속성 재정의**__ (0) | 2023.11.09 |
---|---|
[JPA] 값 타입- 기본값 타입 (0) | 2023.11.06 |
[JPA] 값 타입- 개요 (0) | 2023.11.06 |
[JPA]고아 객체 (0) | 2023.11.04 |
[JPA] EntityManager 에서 flush 의 역할 (0) | 2023.11.04 |