JPA-Embedded

JPA-Tip

Posted by Yun on 2018-03-29

Embedded Type

JPA에서는 새로운 값 타입을 직접 정의해서 사용 할 수 있습니다. 배송 관련 서비스에서 발송인(Sender), 수취인(Receiver)가 있을 경우 중복적으로 주소에 관련 칼럼들이 요구 됩니다. 이러한 중복적인 칼럼들을 자료형으로 규합해서 훨씬더 객체지향적으로 풀어 나갈 수 있을 거같습니다.

Receiver 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Entity
public class Receiver {

@Id
@GeneratedValue
private long id;

@Embedded
private Name name;

@Embedded
private Address address;

@Embedded
private PhoneNumber phoneNumber;
...
}
  • Address, Name 새로운 타입을 직접 정의 했습니다.
  • @Embedded 어노테이션을 통해서 값 타입을 사용한다고 명시 했습니다.

Address 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
@Embeddable
public class Address {

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

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

@Column(name = "zip_code")
private String zipCode;

}
  • Embeddable 어노테이션을 통해서 값 타입을 사용한다고 명시 했습니다.
  • 엔티티 객체와 거의 비슷합니다.

Receiver 클래스

1
2
3
4
5
6
7
8
9
10
@Entity
public class Sender {
...
@Embedded
private Name name;

@Embedded
private Address address;
...
}
  • Receiver클래스에서 직접 정의한 Address를 쉽게 사용할 수 있습니다.

Name 클래스

1
2
3
4
5
6
7
8
9
10
11
12
@Embeddable
public class Name {

@Column(name = "first_name")
private String first;

@Column(name = "last_name")
private String last;

public String getFullName() {
return this.first + this.last;
}
  • 클래로로 정의하면 다양한 부수적인 효과를 적용 시킬 수 있습니다.
  • 정말 간단한 예로 getFullName() 메소드로 full name을 얻을 수 있습니다. 해당 모델에 맞는 다양한 함수를 정의 할 수 있습니다.

@AttributeOverride 재정의

1
2
3
4
5
6
7
8
9
10
11
12
@Entity
public class Sender {
...
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "city", column = @Column(name = "sender_city")),
@AttributeOverride(name = "street", column = @Column(name = "sender_street")),
@AttributeOverride(name = "zip_code", column = @Column(name = "sender_zip_code"))
})
private Address address;
...
}
  • 임베디드 타입에 정의한 매핑정보를 재정의 하려면 @AttributeOverride를 사용하면 됩니다.
  • 해당 칼럼은 sender_city, sender_street, sender_zip_code 으로 생성됩니다.