[JPA] 값 타입- 임베디드 타입

임베디드 타입

  • 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
    • 값 타입을 사용하는 곳에 표시

  1. 임베디드 타입은 반드시 기본 생성자가 있어야함
    • JPA 는 리플렉션을 통해 객체를 생성한다
    • 기본 생성자는 아무 생성자가 생성된것이 없으면 컴파일시 생성해줌
  1. 값 타입은 해당 값 타입 만을 위한 로직을 포함가능
    • isWork() 등의 비즈니스 로직을 내부에 담고있을 수 있다.
  1. @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