본문 바로가기
Spring/JPA

임베디드 타입

by o3oppp 2023. 12. 30.

임베디드 타입(복합 값 타입)

  • 새로운 값 타입을 직접 정의할 수 있음
  • 주로 기본 값 타입을 모아서 만들기때문에 복합 값 타입이라고도 함
  • @Embeddable : 값 타입을 정의하는 곳에 표시
  • @Embedded : 값 타입을 사용하는 곳에 표시
  • 기본 생성자 필수
import javax.persistence.Embeddable;
import java.time.LocalDateTime;

@Embeddable
public class Period {
    //기간
    private LocalDateTime startDate;
    private LocalDateTime endDate;

    public Period() {
    }

    public Period(LocalDateTime startDate, LocalDateTime endDate) {
        this.startDate = startDate;
        this.endDate = endDate;
    }
    ...
}
@Embeddable
public class Address {
    private String city;
    private String street;
    private String zipcode;

    public Address() {
    }

    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }
    ...

}
@Entity
public class Member {
    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String userName;

    //기간
    @Embedded
    private Period workPeriod;

    //주소
    @Embedded
    private Address homeAddress;
    ...
}

장점

  1. 재사용성
  2. 높은 응집도
  3. 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기에 의존
    • 예를 들어 회원을 삭제하면 이름, 나이 필드도 함께 삭제

테이블 매핑

  • 임베디드 타입은 엔티티의 값일 뿐
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같음
  • 단지 객체와 테이블을 아주 세밀하게 매핑하는 기능

한 엔티티에서 같은 값 타입 사용

  • 컬럼명 중복 시 에러
  • @AttributeOverrides
  • @AttributeOverride
@Entity
public class Member {
    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String userName;

    //기간
    @Embedded
    private Period workPeriod;

    //주소
    @Embedded
    private Address homeAddress;

    //회사 주소
    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name="city",column=@Column(name = "WORK_CITY")),
            @AttributeOverride(name="street",column=@Column(name = "WORK_STREET")),
            @AttributeOverride(name="zipcode",column=@Column(name = "WORK_ZIPCODE"))
    })
    private Address workAddress;
    ...
}

'Spring > JPA' 카테고리의 다른 글

페치조인  (0) 2024.01.15
값 타입 컬렉션  (0) 2024.01.02
영속성 전이  (0) 2023.12.29
즉시로딩, 지연로딩  (1) 2023.12.23
프록시(Proxy)  (0) 2023.12.20