BE전문가 프로젝트

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

JPA

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

원호보고서 2022. 11. 1. 23:38
  • 새로운 값 타입을 직접 정의할 수 있음
  • JPA 임베디드 타입(embedded type)이라 함
  • 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
  • int, Stringr과 같은 값 타입, 변경되면 추척이 안됨

(시작일, 종료일)과 (city,street, zipcode)는 비슷한 성격을 가지고 있기 때문에 묶어서 관리가 가능하며, 묶어낼 수 있는 것을 임베디드 타입이라고 한다

 

 

임베디드 타입 사용법

  • @Embeddablle: 값 타입을 정의하는 곳에 표시
  • @Embedded: 값 타입을 사용하는 곳에 표시
  • 기본 생성자 필수

 

임베디드 타입의 장점

  • 재사용
  • 높은 응집도
  • PeriodWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음
  • 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기를 의존함
@Entity
public class Member extends BaseEntity{

    @Id
    @GeneratedValue
    private Long id;

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

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="TEAM_ID")
    private Team team;

    @OneToOne
    @JoinColumn(name="LOCKER_ID")
    private Locker locker;

    @Embedded
    private Period workPeriod;

    @Embedded
    private Address homeAddress;
}
@Embeddable
public class Period {
    private LocalDateTime startDate;
    private LocalDateTime endDate;
}
@Embeddable
public class Address {
    private String city;
    private String street;
    private String zipcode;
}

코드 실행시 생성되는 테이블

 

임베디드 타입과 테이블 매핑

  • 임베디드 타입은 엔티티의 값일 뿐이다.
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
  • 객체와 테이블을 아주 세밀하게(find-grained) 매핑하는 것이 가능
  • 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많음

 

임베디드 타입과 연관관계

member 는 address와 PhoneNumber라는 임베디드타입 값을 가지고 있다.

embadded타입의Address는 embadded타입의 Zipcode를 가질 수 있다.

embadded타입의PhoneNumber는 Entity인 PhoneEntity를 가질 수 있다.

 

 

@AttributeOverride: 속성 재정의

  • 한 엔티티에서 같은 값 타입을 사용하면?
  • 컬럼 명이 중복됨
  • @AttributeOverrdes, @AttributeOverride를 사용해서 컬럼명 속성을 재정의
@Entity
public class Member extends BaseEntity{
	@Id
    @GeneratedValue
    private Long id;

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

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="TEAM_ID")
    private Team team;

    @OneToOne
    @JoinColumn(name="LOCKER_ID")
    private Locker locker;

    @Embedded
    private Period workPeriod;

    @Embedded
    private Address homeAddress;

    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name="city",
                    column = @Column(name = "work_address")),
            @AttributeOverride(name = "street",
                    column = @Column(name = "work_street")),
            @AttributeOverride(name = "zipcode",
                    column = @Column(name = "work_zipcode"))
    })
    private Address workAddress;
    
}

 

 

임베디드 타입과 null

  • 임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null

'JPA' 카테고리의 다른 글

값 타입의 비교  (0) 2022.11.02
값 타입과 불변 객체  (0) 2022.11.02
기본값 타입  (0) 2022.11.01
쇼핑몰 만들기 4 - 연관관계 관리  (0) 2022.10.31
영속성 전이 :CASCADE  (0) 2022.10.31
Comments