JPA @Embedded @AttributeOverrides

KMS·2022년 4월 8일
0

JPA Basics

목록 보기
12/20

임베디드 타입 사용 전:

임베디드 타입 사용 후:


(이번 예시에서는 workPeriod(startDate, endDate)는 생략)

@Embedded && @Embeddable

@Embedded 객체 (+@AttributeOverrides)

@Entity
public class Member extends BaseEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "MEMBER_ID")
    private Long id;
    private String name;

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

    @OneToMany(mappedBy = "memberId", cascade = CascadeType.PERSIST) // Order에서 외례키로 설정되어 있는 memberId 변수를 mappedBy로 설정
    private List<Order> orderList = new ArrayList<>(); //new ArrayList<>()로 초기화 시켜주는 것이 JPA에서의 관례

}

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

결과:

예시에서보면, 주소와 연관된 Column들 city, street zipcode를 Adress는 클래스로 묶은 후, @Embeddable 애노테이션을 추가해 줍니다. 그리고, 엔티티에서 Adress변수를 생성 후, 해당 변수에 @Embedded 애노테이션을 추가해서 Adress의 변수들을 엔티티의 Column에 추가하겠다는 것을 알려줍니다.

만약에 집주소(homeAdress)와 회사 주소(workAdress)를 Column으로 추가하고 싶다면 @AttributeOverrides를 이용해서 중복되는 것을 막아줍니다.
집주소와 회사 주소 모두 필요한 정보들은 같기 때문에 Adress 클래스를 사용하는데, 같은 이름의 Column들이 중복 될수 없기 때문에 @AttributeOverrides를 이용해서 Column의 이름을 지정해 줍니다. DEFAULT는 변수명으로 저장됩니다.

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

profile
Student at Sejong University Department of Software

0개의 댓글