티스토리 뷰

dev_공부일지/JPA 기본

임베디드 타입

dev_0hoon 2024. 2. 6. 11:06

 

임베디드 타입

- 새로운 값 타입을 직접 정의할 수 있음

- JPA는 임베디드 타입이리ㅏ 함

- 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함

- int, String 같은 타입

 

 

- 회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다.

 

인프런 - 김영한 JPA 강의 중

 

- 하지만 평소에는 추상화해서 회원 엔티티는 이름, 근무기간, 집 주소를 가진다. 정도로만 이야기 한다.

 

인프런 - 김영한 JPA 강의 중

이렇게 묶어 낼 수 있는 것은 임베디드 타입이라 한다.

 

인프런 - 김영한 JPA 강의 중

 

@Embeddeable : 값 타입을 정의하는 곳에 표시

@Embedded: 값 타입을 사용하는 곳에 표시

기본 생성자 필수

 

임베디드타입의 장점

- 재사용

- 높은 응집도

- Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음

- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함

package jpabook.jpashop.domain;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Member extends BaseEntity{

    @Id @GeneratedValue
    private Long id;

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

    //기간 Period
    @Embedded
    private Period period;

    //주소
    @Embedded
    private Address address;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Period getPeriod() {
        return period;
    }

    public void setPeriod(Period period) {
        this.period = period;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

 

package jpabook.jpashop.domain;

import javax.persistence.Embeddable;

@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;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getZipcode() {
        return zipcode;
    }

    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }
}
package jpabook.jpashop.domain;

import javax.persistence.Embeddable;
import java.time.LocalDateTime;

@Embeddable
public class Period {

    //기간 Period
    private LocalDateTime startDate;
    private LocalDateTime endDate;


    public Period() {
    }

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

    public LocalDateTime getStartDate() {
        return startDate;
    }

    public void setStartDate(LocalDateTime startDate) {
        this.startDate = startDate;
    }

    public LocalDateTime getEndDate() {
        return endDate;
    }

    public void setEndDate(LocalDateTime endDate) {
        this.endDate = endDate;
    }
}

 

 

- 임베디드 타입은 엔티티의 값일 뿐이다.

- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.

- 객체와 테이블을 아주 세밀하게(find-grained) 매핑하는 것이 가능

- 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많음

 

 

인프런 - 김영한 JPA 강의 중

 

 

@AttributeOverride: 속성 재정의

- 한 엔티티에서 같은 값 타입을 사용하면?

- 컬럼명 중복됨

- @AttributeOverides, @AttrirbuteOverride 를 사용해서 컬럼 명 속성을 재정의

 

    //주소
    @Embedded
    private Address address;

    @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;

 

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

'dev_공부일지 > JPA 기본' 카테고리의 다른 글

값 타입의 비교  (0) 2024.02.06
값 타입과 불변 객체  (0) 2024.02.06
값 타입  (0) 2024.02.06
영속성 정의 (cascade)  (0) 2024.02.05
즉시로딩과 지연로딩  (0) 2024.02.05
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함