ABAP DUMP ERROR 24시

Embedded 타입 본문

[WEB]Back-end/JPA

Embedded 타입

이운형 2022. 1. 17. 17:41
반응형

# 인프런 김영한의 자바 ORM 표준 JPA 프로그래밍 - 기본편을 개인적으로 정리한 글입니다.

 

 

정리


 

pirvate int age; 같은 코드는 봤는데 

private Address address 처럼 Address 갖고 있는 애들은 뭘까?

=> Entity 이거나 임베디드 타입이야

 

Q : 임베디드 타입이 뭐야?

A : 같은 타입, 같은 성격을 띄는 필드 속성들을 묶어서 정의

// 치킨 이라는 임베디드안에 양념치킨,후라이드치킨,간장치킨을 속성을 정의한다.

 

Q : 임베디드 타입을 왜 사용해?

A :

1. 높은 재사용성

2. 높은 응집도

3. 객체와 테이블을 아주 세밀하게 매핑하는것이 가능

 

Q : 어떻게 사용해?

A : @Embeddable : 값 타임을 정의 한다. //  치킨이라는 class 가 @Embeddable을 갖고  있겠네

     @Embedded : 값 타임을 사용하는 곳에 정의한다 // 치킨을 사용하는 class 에서 사용한다!

   + 기본 생성자는 필수로 생성해야해!

 

Q : 한 엔티티에게서 같은 값 타입을 사용하려면 어떻게 해야해?

A : @AttributeOverrides , @AttributeOverride 를 사용해서 컬럼명 속성을 재정의 해야해!

 

 

 

살펴보기


1. 기본값 타입 vs 임베디드 타입

기본값 타입 임베디드 타입
생명주기를 엔티티에 의존
(회원 삭제시 회원 이름, 나이, 주소등이 삭제된다)
임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기를 의존한다.
값 타입을 공유하면 안된다.
(회원 이름 변경시 다른 회원의 이름이 변경된다)
임베디드 Type도 int ,String 과 같은 값 타입이다.
즉 엔티티가 아니고 엔티티의 값일 뿐이다!
  새로운 값 타입을 직접 정의할 수 있다.
값인만큼 역시나 side Effect가 있을수 있으니 조심!

 

 

Q : 임베디드 타입을 왜 사용해? (예시)

Member(table)
id
name
startDate
endDate
city
street
zipcode

처럼 몰아두는 것 보다

Member(Entity) Member(table)
id : Long id
name : String name
workPeriod : Period workPeriod
homeAddress : Address homeAddress

 

위와 같이 정의 해주는게 더 깔끔 하다!

 

 

Q : 어떻게 사용해?(예시)

 

 

다음과 같이 startDate 와 endDate를 Period로!

city, street,zipcode를 Address로 묶는다고 하면!

코드는

 

Period ,  Address class를 만들어 @Enbeddable 을 넣고

 

@Embeddable
public class Period {
    private LocalDateTime startDate;
    private LocalDateTime endDate;
    public Period(){
    }
}

 

@Embeddable
@Getter
@Setter
public class Address {

    private String city;
    private String street;
    private String zipcode;


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

    public Address() {

    }
}

 

Member 에 @Embedded를 정의해서 사용한 것을 확인할수 있지!

@Entity
@Getter
@Setter
public class Member {


    @Id@GeneratedValue
    @Column(name = "member_id")
    private Long id;

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

    //기간 Period
    @Embedded
    private Period workPeriod;

    //주소
    @Embedded
    private Address homeAddress;

 

 

 

 

 

Q : 한 엔티티에게서 같은 값 타입을 사용하려면 어떻게 해야해?(예시)

public class Member {


    @Id@GeneratedValue
    @Column(name = "member_id")
    private Long id;

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

    //기간 Period
    @Embedded
    private Period workPeriod;

    //주소
    @Embedded
    private Address homeAddress;
    private Address workAddress;

위처럼 Class내에 같은 임베디드 값 타입을 사용해서 재정의할수 없어!

@AttributeOverrides , @AttributeOverride 를 사용해서 컬럼명 속성을 재정의 해야해!

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

 

 

 

 

 

 

---------------------------------------------------------번외-----------------------------------------------------------------

 

 

반응형
Comments