JAVA

[JAVA] 임베디드 타입(복합값)

응디 2022. 1. 11. 17:45

우리는 엔티티에 대해 설명할 때 보통 아주 상세 하게 설명하기 보단 추상적으로 설명한다.

ex ) 회원 엔티티에는 이름, 근무 시작 날짜 , 근무 종료 날짜 , 주소 도시, 주소 번지, 주소 우편번호가 있다가 아닌

→ 회원엔티티는 이름, 근무일, 집주소를 가지고 있다라고 추상적으로 설명

→ 이렇게 묶어 낼 수 있는걸 객체로 뽑아내는게 임베디드 타입!

 

임베디드 타입

  • 새로운 값 타입을 직접 정의할 수 있음
  • JPA는 임베디드 타입이라 함
  • 주로 기본 값 타입을 모아서 만들어서 복합값 타입이라고도 함
  • 여기서 기본 값 타입이란 int, String과 같은 값 타입

 

임베디드 타입 사용법

  1. @Embeddable : 값 타입을 정의하는 곳에 표시
  2. @Embedded : 값 타입을 사용하는 곳에 표시
  3. 기본생성자 필수

 

임베디드 타입의 장점

  1. 재사용성
  2. 높은 응집도
  3. Period.isWork()처러 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있다.
  4. 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함

 

Member.java

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

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

    // 기간 Period
    @Embedded
    private Period workPeriod;

    // 주소 Address
    @Embedded
    private Address homeAddress;

		// Embedded를 사용하지 않으면 아래처럼 선언해줘야함 
		/* private LocalDateTime startDate;
    private LocalDateTime endDate;
		private String city;
    private String street;
    private String zipcode; */
}

 

Period.java

@Embeddable // 값 타입이라고 지정
public class Period {
    private LocalDateTime startDate;
    private LocalDateTime endDate;

    // 기본생성자 필수!
    public Period(){}

    public Period(LocalDateTime startDate, LocalDateTime endDate) {
        this.startDate = startDate;
        this.endDate = endDate;
		}
}

 

Address.java

@Embeddable
public class Address {
    private String city;
    private String street;
    private String zipcode;

    // 엔티티를 가져와서 사용할 수 있다!
//    private Member member;

    public Address(){}

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

 

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

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

 

임베디드 타입과 null

  • 임베디드 타입의 값이 null 이면 매핑한 컬럼 값은 모두 null
// null로 주면 startDate, endDate 값 모두 null 이다.
@Embedded
private Period workPeriod = null;

 

@AttributeOverride : 속성 재정의

  • 한 엔티티에서 같은 값 타입을 사용하면? → 컬럼명이 중복됨
  • @AttributeOverrides, @AttributeOverride 사용해서 컬럼 명 속성을 재정의
    // 주소 Address
    @Embedded
    private Address homeAddress;

    // 만약 Address를 한 엔티티에서 여러번 사용하려면??? -> 컬럼명을 변경해줘야함(AttributeOverrides 사용)
    @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;

테이블 생성 예시

 

'JAVA' 카테고리의 다른 글

[JAVA] 값 타입 컬렉션  (0) 2022.01.13
[JAVA] 값 타입과 불변객체  (0) 2022.01.11
[JAVA] 영속성 전이(CASCADE) + 고아객체  (0) 2022.01.06
[JAVA] 즉시로딩과 지연로딩  (0) 2022.01.05
[JAVA] 프록시  (0) 2022.01.04