π @MappedSuperclassλ?
@MappedSuperclassλ JPAμμ κ³΅ν΅ μμ±μ μ¬λ¬ μν°ν° ν΄λμ€μ μ¬μ¬μ©ν μ μκ² ν΄μ£Όλ μνΌν΄λμ€λ₯Ό μ μν λ μ¬μ©λλ μ΄λ Έν μ΄μ μ λλ€. μ΄ μνΌν΄λμ€λ μν°ν°κ° μλλ©°, λ°λΌμ λ°μ΄ν°λ² μ΄μ€μ λ³λμ ν μ΄λΈμ΄ μμ±λμ§ μμ΅λλ€. λμ , μ΄ μνΌν΄λμ€λ₯Ό μμλ°λ μλΈν΄λμ€ μν°ν°μ ν μ΄λΈμ μνΌν΄λμ€μ νλκ° ν¬ν¨λ©λλ€.
μ£Όμ ν¬μΈνΈ:
- μν°ν°κ° μλ:
@MappedSuperclass
λ‘ μ μΈλ ν΄λμ€λ JPA μν°ν°κ° μλλ―λ‘ λ°μ΄ν°λ² μ΄μ€μ λ³λμ ν μ΄λΈμ΄ μμ±λμ§ μμ΅λλ€. - κ³΅ν΅ μμ± μμ: μνΌν΄λμ€μ νλμ 맀ν μ λ³΄κ° μλΈν΄λμ€ μν°ν°μ μμλμ΄ ν μ΄λΈμ ν¬ν¨λ©λλ€.
- λ¨μΌ ν μ΄λΈ μ λ΅κ³Όμ μ°¨μ΄: λ€λ₯Έ μμ 맀ν μ λ΅κ³Όλ λ¬λ¦¬, μνΌν΄λμ€ μ체λ λ³λμ ν μ΄λΈλ‘ κ΄λ¦¬λμ§ μμ΅λλ€.
π @MappedSuperclassμ νΉμ§
2.1. νλ 맀ν μμ
@MappedSuperclassλ‘ μ μΈλ ν΄λμ€μ νλλ μ΄λ₯Ό μμλ°λ μν°ν° ν΄λμ€μ κ·Έλλ‘ ν¬ν¨λ©λλ€. λ°λΌμ μνΌν΄λμ€μμ μ μλ νλλ€μ μλΈν΄λμ€μ ν μ΄λΈμ 맀νλ©λλ€.
2.2. μν°ν°κ° μλ
@MappedSuperclassλ‘ μ§μ λ ν΄λμ€λ μν°ν°κ° μλλ―λ‘, JPAμμ μ§μ μ μΌλ‘ κ΄λ¦¬λμ§ μμ΅λλ€. μ¦, μ΄ ν΄λμ€λ‘λ λ°μ΄ν°λ² μ΄μ€μ 쿼리λ₯Ό μ€νν μ μμ΅λλ€.
2.3. μμ ꡬ쑰
- λ¨μΌ μμ: νλμ μνΌν΄λμ€λ§μ μμλ°μ μ μμ΅λλ€.
- λ€μ€ μμ λΆκ°: μλ°μ λ€μ€ μμ μ νμΌλ‘ μΈν΄, νλμ ν΄λμ€λ νλμ
@MappedSuperclass
λ§μ μμλ°μ μ μμ΅λλ€.
2.4. μ΄λ Έν μ΄μ μ¬μ©
- νμ: μνΌν΄λμ€μ λ°λμ
@MappedSuperclass
μ΄λ Έν μ΄μ μ μ§μ ν΄μΌ ν©λλ€. - μΆκ° μ΄λ
Έν
μ΄μ
μ¬μ© κ°λ₯: νλμ
@Column
,@Id
λ± λ€λ₯Έ JPA μ΄λ Έν μ΄μ μ μ¬μ©ν μ μμ΅λλ€.
π @MappedSuperclass μ¬μ© μμ
3.1. κΈ°λ³Έ μμ
μλ μμ μμλ BaseEntity
λΌλ μνΌν΄λμ€λ₯Ό μ μνκ³ , μ΄λ₯Ό μμλ°λ Member
μ Order
μν°ν°λ₯Ό ꡬνν©λλ€.
BaseEntity.java
<!-- BaseEntity.java -->
import javax.persistence.*;
import java.time.LocalDateTime;
@MappedSuperclass
public abstract class BaseEntity {
@Id
@GeneratedValue
private Long id;
@Column(name = "created_date", updatable = false)
private LocalDateTime createdDate;
@Column(name = "last_modified_date")
private LocalDateTime lastModifiedDate;
// Getter, Setter
public Long getId() {
return id;
}
public LocalDateTime getCreatedDate() {
return createdDate;
}
public void setCreatedDate(LocalDateTime createdDate) {
this.createdDate = createdDate;
}
public LocalDateTime getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
}
Member.java
<!-- Member.java -->
import javax.persistence.*;
@Entity
public class Member extends BaseEntity {
private String name;
private int age;
// Getter, Setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Order.java
<!-- Order.java -->
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
public class Order extends BaseEntity {
private LocalDateTime orderDate;
private String status;
// Getter, Setter
public LocalDateTime getOrderDate() {
return orderDate;
}
public void setOrderDate(LocalDateTime orderDate) {
this.orderDate = orderDate;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
3.2. μ€λͺ
- BaseEntity:
@MappedSuperclass
μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ μνΌν΄λμ€λ‘ μ μΈλμμ΅λλ€.- κ³΅ν΅ μμ±μΈ
id
,createdDate
,lastModifiedDate
κ° μ μλμ΄ μμ΅λλ€.
- Memberμ Order:
@Entity
μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ JPA μν°ν°λ‘ μ μΈλμμ΅λλ€.BaseEntity
λ₯Ό μμλ°μ κ³΅ν΅ μμ±μ μ¬μ¬μ©ν©λλ€.- κ° μν°ν°λ μμ μ κ³ μ μμ±μΈ
name
,age
,orderDate
,status
λ±μ μΆκ°λ‘ μ μν©λλ€.
3.3. λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈ ꡬ쑰
- Member ν
μ΄λΈ
id
(PK)created_date
last_modified_date
name
age
- Order ν
μ΄λΈ
id
(PK)created_date
last_modified_date
order_date
status
BaseEntity
λ λ³λμ ν
μ΄λΈλ‘ μμ±λμ§ μκ³ , Member
μ Order
ν
μ΄λΈμ id
, created_date
, last_modified_date
νλκ° ν¬ν¨λ©λλ€.
π λ€λ₯Έ μμ 맀ν μ λ΅κ³Όμ λΉκ΅
JPAμμλ μμ κ΄κ³λ₯Ό 맀ννκΈ° μν μ¬λ¬ κ°μ§ μ λ΅μ μ 곡ν©λλ€. μ£Όμ μ λ΅μΌλ‘λ @MappedSuperclass
μΈμλ @Inheritance
μ΄λ
Έν
μ΄μ
μ μ¬μ©ν μμ 맀ν μ λ΅μ΄ μμ΅λλ€. μ΄λ₯Ό λΉκ΅νμ¬ μ΄ν΄νλ©΄ @MappedSuperclass
μ μ©λμ μ₯μ μ λ λͺ
νν μ μ μμ΅λλ€.
4.1. @MappedSuperclass vs @Inheritance
νΉμ§ | @MappedSuperclass | @Inheritance (SINGLE_TABLE, JOINED, TABLE_PER_CLASS) |
---|---|---|
μν°ν° μ¬λΆ | μνΌν΄λμ€λ μν°ν°κ° μλ | μνΌν΄λμ€κ° μν°ν°μΌ μ μμ |
ν μ΄λΈ 맀ν | μνΌν΄λμ€μ νλλ μλΈν΄λμ€μ ν μ΄λΈμ 맀ν | μλΈν΄λμ€μ μνΌν΄λμ€μ νλκ° κ°κ° λ³λμ ν μ΄λΈμ 맀νλ¨ (맀ν μ λ΅μ λ°λΌ λ€λ¦) |
쿼리 κ°λ₯ μ¬λΆ | μνΌν΄λμ€λ₯Ό 쿼리ν μ μμ | μνΌν΄λμ€ μν°ν°λ₯Ό 쿼리ν μ μμ (SINGLE_TABLE, JOINED) |
μμ κ³μΈ΅μ 볡μ‘μ± | λ¨μν νλ μμμ© | λ€μν μμ 맀ν μ λ΅μ ν΅ν΄ 볡μ‘ν μμ κ³μΈ΅μ μ§μ |
λ€νμ± μ§μ | μ§μνμ§ μμ | μ§μν¨ (νΉν SINGLE_TABLE, JOINED μ λ΅μμ) |
μ©λ | κ³΅ν΅ μμ± μ¬μ¬μ© | κ°μ²΄ μ§ν₯ μμ ꡬ쑰λ₯Ό λ°μ΄ν°λ² μ΄μ€μ λ°μ |
μ₯μ | μ½λ μ¬μ¬μ©μ± ν₯μ, λ¨μν μ€κ³, μ±λ₯ ν₯μ | κ°μ²΄ μ§ν₯ μμ ꡬ쑰λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ λ°μ κ°λ₯, λ€νμ± μ§μ |
λ¨μ | λ€νμ± λ―Έμ§μ, μνΌν΄λμ€λ₯Ό μ§μ 쿼리ν μ μμ, 볡μ‘ν μμ ꡬ쑰 μ§μ μ΄λ €μ, μ νλ κΈ°λ₯ | 맀ν μ λ΅μ λ°λΌ μ±λ₯κ³Ό 볡μ‘μ±μ΄ λ€λ¦, νΉμ μ λ΅μ ν μ΄λΈ μ‘°μΈμ΄ λ§μ΄ λ°μν μ μμ |
4.2. 맀ν μ λ΅ μμ½
- @MappedSuperclass:
- μ©λ: κ³΅ν΅ μμ±μ μ¬μ¬μ©ν λ, μμ κ³μΈ΅μ λ€νμ±μ΄ νμ μμ λ.
- μ₯μ : λ¨μν μ€κ³, ν μ΄λΈ μ‘°μΈ λΆνμ.
- λ¨μ : λ€νμ± μ§μ μ ν¨, μνΌν΄λμ€λ₯Ό μ§μ 쿼리ν μ μμ.
- @Inheritance:
- SINGLE_TABLE:
- μ€λͺ : λͺ¨λ μμ κ³μΈ΅μ λ¨μΌ ν μ΄λΈμ μ μ₯.
- μ₯μ : μ±λ₯ μ°μ, μ‘°μΈ λΆνμ.
- λ¨μ : NULL κ°μ΄ λ§μ΄ λ°μ, λ°μ΄ν° λ¬΄κ²°μ± κ΄λ¦¬ μ΄λ €μ.
- JOINED:
- μ€λͺ : μνΌν΄λμ€μ μλΈν΄λμ€λ₯Ό λ³λμ ν μ΄λΈμ μ μ₯νκ³ μ‘°μΈ.
- μ₯μ : λ°μ΄ν° μ κ·ν, μ€λ³΅ μ΅μν.
- λ¨μ : μ‘°μΈ νμλ‘ μ±λ₯ μ ν κ°λ₯.
- TABLE_PER_CLASS:
- μ€λͺ : κ° μλΈν΄λμ€λ§λ€ λ³λμ ν μ΄λΈμ μμ±.
- μ₯μ : λ 립μ μΈ ν μ΄λΈ, μλΈν΄λμ€λ³ μ΅μ ν κ°λ₯.
- λ¨μ : λ°μ΄ν° μ€λ³΅, μνΌν΄λμ€ λ°μ΄ν° μ‘°ν μ΄λ €μ.
- SINGLE_TABLE:
π @MappedSuperclassμ μ₯λ¨μ
5.1. μ₯μ
- μ½λ μ¬μ¬μ©μ± ν₯μ:
- 곡ν΅λ μμ±μ μνΌν΄λμ€μ μ μνκ³ , μ¬λ¬ μν°ν°μμ μ΄λ₯Ό μμλ°μ μ€λ³΅ μ½λλ₯Ό μ€μΌ μ μμ΅λλ€.
- λ¨μν μ€κ³:
- μνΌν΄λμ€κ° λ³λμ ν μ΄λΈμ μμ±νμ§ μμΌλ―λ‘ λ°μ΄ν°λ² μ΄μ€ μ€κ³κ° λ¨μν΄μ§λλ€.
- μ±λ₯ ν₯μ:
- μ‘°μΈμ΄ νμ μμΌλ―λ‘ μ±λ₯μ΄ κ°μ λ μ μμ΅λλ€. νΉν, λ¨μΌ ν μ΄λΈ μ λ΅μ μ¬μ©ν λ μ‘°μΈ λΉμ©μ΄ λ°μνμ§ μμ λΉ λ₯Έ μ‘°νκ° κ°λ₯ν©λλ€.
- μ μ°μ±:
- μμ κ³μΈ΅μ΄ λ¨μνκ³ , λ€νμ±μ΄ νμ μμ λ μ μ©ν©λλ€. μ¬λ¬ μν°ν°κ° 곡ν΅λ νλλ₯Ό κ°μ§ λ μ½κ² μ μ©ν μ μμ΅λλ€.
5.2. λ¨μ
- λ€νμ± λ―Έμ§μ:
@MappedSuperclass
λ λ€νμ±μ μ§μνμ§ μκΈ° λλ¬Έμ, μνΌν΄λμ€λ₯Ό κΈ°μ€μΌλ‘ ν μν°ν° 쿼리λ₯Ό μ€νν μ μμ΅λλ€.
- μνΌν΄λμ€ μ§μ 쿼리 λΆκ°:
@MappedSuperclass
λ‘ μ μΈλ μνΌν΄λμ€λ μν°ν°κ° μλλ―λ‘, μ΄λ₯Ό μ§μ μ μΌλ‘ μ‘°ννκ±°λ μ‘°μν μ μμ΅λλ€.
- 볡μ‘ν μμ ꡬ쑰 μ§μ μ΄λ €μ:
- μμ κ³μΈ΅μ΄ 볡μ‘νκ±°λ, λ€νμ±μ΄ νμν κ²½μ°μλ λ€λ₯Έ μμ 맀ν μ λ΅(
@Inheritance
)μ μ¬μ©νλ κ²μ΄ λ μ ν©ν©λλ€.
- μμ κ³μΈ΅μ΄ 볡μ‘νκ±°λ, λ€νμ±μ΄ νμν κ²½μ°μλ λ€λ₯Έ μμ 맀ν μ λ΅(
- μ νλ κΈ°λ₯:
@MappedSuperclass
λ μν°ν°μ μΌλΆ κΈ°λ₯λ§μ μ 곡νλ©°, μμ ν μμ 맀νμ μ§μνμ§ μμ΅λλ€.
π μ¬μ© μ μ£Όμμ¬ν
- μν°ν°λ‘ μ¬μ© λΆκ°:
@MappedSuperclass
λ‘ μ μΈλ ν΄λμ€λ μν°ν°λ‘ μ¬μ©λ μ μμΌλ―λ‘, μ΄λ₯Ό κΈ°λ°μΌλ‘ νλ 쿼리λ₯Ό μμ±ν μ μμ΅λλ€.
- μμ κ΄κ³ κ΄λ¦¬:
- λ¨μΌ μμλ§μ μ§μνλ©°, λ€μ€ μμμ λΆκ°λ₯ν©λλ€. μλ°μ λ¨μΌ μμ μ νμΌλ‘ μΈν΄, νλμ ν΄λμ€λ νλμ
@MappedSuperclass
λ§μ μμλ°μ μ μμ΅λλ€.
- λ¨μΌ μμλ§μ μ§μνλ©°, λ€μ€ μμμ λΆκ°λ₯ν©λλ€. μλ°μ λ¨μΌ μμ μ νμΌλ‘ μΈν΄, νλμ ν΄λμ€λ νλμ
- μμ μ λ΅ νΌμ© κΈμ§:
@MappedSuperclass
μ λ€λ₯Έ μμ 맀ν μ λ΅(@Inheritance
)μ νΌμ©νμ¬ μ¬μ©νλ κ²μ κΆμ₯λμ§ μμ΅λλ€. μ΄λ 맀νμ 볡μ‘μ±μ μ¦κ°μν€κ³ , μκΈ°μΉ μμ λμμ μ λ°ν μ μμ΅λλ€.
- λ°μ΄ν° 무결μ±:
- κ³΅ν΅ μμ±μ΄ μ¬λ¬ μν°ν°μ λΆμ°λμ΄ μμ μ μμΌλ―λ‘, λ°μ΄ν° 무결μ±μ μ μ§νκΈ° μν΄ μΆκ°μ μΈ μ£Όμκ° νμν©λλ€.
- 보μ κ³ λ €μ¬ν:
- μνΌν΄λμ€μ λ―Όκ°ν μ λ³΄κ° ν¬ν¨λμ΄ μλ κ²½μ°, μ΄λ₯Ό μμλ°λ μν°ν°μμ μ μ ν κ΄λ¦¬ν΄μΌ ν©λλ€.
π λ² μ€νΈ νλν°μ€
- κ³΅ν΅ μμ± μ¬μ¬μ©:
- μ¬λ¬ μν°ν°μμ 곡ν΅μΌλ‘ μ¬μ©νλ νλ(μ:
id
,createdDate
,lastModifiedDate
)λ@MappedSuperclass
λ₯Ό μ¬μ©νμ¬ μνΌν΄λμ€μ μ μνκ³ , μ΄λ₯Ό μμλ°μ μ¬μ¬μ©ν©λλ€.
- μ¬λ¬ μν°ν°μμ 곡ν΅μΌλ‘ μ¬μ©νλ νλ(μ:
- λ¨μΌ μ±
μ μμΉ:
- μνΌν΄λμ€λ μ€μ§ 곡ν΅λ μμ±κ³Ό κ΄λ ¨λ μ± μλ§μ κ°μ ΈμΌ νλ©°, λΉμ¦λμ€ λ‘μ§μ μλΈν΄λμ€ μν°ν° λλ μλΉμ€ κ³μΈ΅μ μμΉμν΅λλ€.
- μμ κ³μΈ΅ λ¨μν:
- μμ κ³μΈ΅μ κ°λ₯ν λ¨μνκ² μ μ§νκ³ ,
@MappedSuperclass
λ λ€νμ±μ΄ νμ μλ κ²½μ°μλ§ μ¬μ©ν©λλ€.
- μμ κ³μΈ΅μ κ°λ₯ν λ¨μνκ² μ μ§νκ³ ,
- μ½λ μΌκ΄μ± μ μ§:
- μνΌν΄λμ€μ μλΈν΄λμ€ κ°μ μΌκ΄μ±μ μ μ§νκΈ° μν΄, νλλͺ κ³Ό νμ μ μΌκ΄λκ² κ΄λ¦¬ν©λλ€.
- ν
μ€νΈμ κ²μ¦:
@MappedSuperclass
λ₯Ό μ¬μ©ν κ²½μ°, μλΈν΄λμ€ μν°ν°κ° μ¬λ°λ₯΄κ² 맀νλκ³ , λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§κ° κΈ°λν λλ‘ μμ±λλμ§ ν μ€νΈν©λλ€.
π κ²°λ‘
@MappedSuperclassλ JPAμμ κ³΅ν΅ μμ±μ μ¬λ¬ μν°ν°μ ν¨μ¨μ μΌλ‘ μ¬μ¬μ©ν μ μκ² ν΄μ£Όλ μ μ©ν λꡬμ
λλ€. μ΄λ₯Ό ν΅ν΄ μ½λ μ€λ³΅μ μ€μ΄κ³ , 곡ν΅λ νλλ₯Ό μΌκ΄λκ² κ΄λ¦¬ν μ μμ΅λλ€. κ·Έλ¬λ λ€νμ±μ΄ νμνμ§ μκ³ , λ¨μν μμ ꡬ쑰μλ§ μ ν©νλ©°, @MappedSuperclass
μ체λ μν°ν°λ‘ μ·¨κΈλμ§ μκΈ° λλ¬Έμ μ΄λ₯Ό μΌλμ λκ³ μ¬μ©ν΄μΌ ν©λλ€.
볡μ‘ν μμ ꡬ쑰λ λ€νμ±μ΄ νμν κ²½μ°μλ @MappedSuperclass
보λ€λ @Inheritance
μ΄λ
Έν
μ΄μ
μ μ¬μ©ν λ€λ₯Έ μμ 맀ν μ λ΅μ κ³ λ €νλ κ²μ΄ μ’μ΅λλ€. νλ‘μ νΈμ μꡬμ¬νκ³Ό μμ ꡬ쑰μ 볡μ‘μ±μ λ°λΌ μ μ ν 맀ν μ λ΅μ μ ννμ¬ λ°μ΄ν°λ² μ΄μ€μ μ ν리μΌμ΄μ
μ ν¨μ¨μ±μ κ·ΉλννμκΈ° λ°λλλ€.
π μΆκ° μ°Έκ³ μλ£
'JPA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
JPA νμ΅λͺ©λ‘ (2) | 2024.12.21 |
---|---|
JPAμμ λ¨λ°©ν₯ 맀νμ μ°μ μΌλ‘ νλ μ΄μ (λ¨λ°©ν₯ β νμμ μλ°©ν₯) (0) | 2024.12.09 |
JPA μν°ν° μλ°©ν₯ κ΄κ³μμ μ°κ΄κ΄κ³ μ£ΌμΈμ΄ νμν μ΄μ (1) | 2024.12.09 |
JPA μν°ν°μ κ°μ²΄μ§ν₯μ μ€κ³ (0) | 2024.12.09 |
JPA PK μμ±μ λ΅ @GeneratedValue(strategy = GenerationType.β) (0) | 2024.12.09 |
λκΈ