* ν΄λΉ κΈμ κΉμν κ°μ¬λμ μλ° ORM νμ€ JPA νλ‘κ·Έλλ° - κΈ°λ³Έ νΈμ λ³΄κ³ κ°λ¨νκ² μ 리ν κΈμ λλ€.(μμΈν λ΄μ©μ κ°μκ° μ΅κ³±λλ€. κ°μ μ¬μΈμ)
μλ° ORM νμ€ JPA νλ‘κ·Έλλ° - κΈ°λ³ΈνΈ κ°μ - μΈνλ°
νμ¬λμ λ§€μΌ λ°μ μμ€μ νμμ΄λΌλ λ€λκΉ μκ°νλλ° λ§μΉ¨ JPA κ°μκ° μ겨μ κΏ νμ΄λ°μ΄λ€μ. μ λ μ΄ μ μ JPA μ± μ λ³΄κ³ κ³΅λΆ νμλλ°μ κΆκΈνλ μ , μ 무μ μ μ©νλ©° κ³ λ―Όνκ³ ν΄κ²°ν
www.inflearn.com
μμ κ΄κ³ λ§€ν
κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μλ κ°μ²΄ μ§ν₯ μΈμ΄μ μμμ΄λΌλ κ°λ μ΄ μλ€. λμ μνΌνμ , μλΈνμ μ΄λΌλ λͺ¨λΈλ§ κΈ°λ²μ΄ κ·Έλλ§ λΉμ·νμ¬ λμ μ¬μ©νλ€.
λ¬Όλ‘ , μ΄λ₯Ό μ€μ 물리 λͺ¨λΈμΈ ν μ΄λΈλ‘ ꡬννκΈ° μν΄ λ€μ μΈ κ°μ§ λ°©λ²μ μ¬μ©νλ€.
- μ‘°μΈ μ λ΅
- λ¨μΌ ν μ΄λΈ μ λ΅
- ꡬν ν΄λμ€λ§λ€ ν μ΄λΈ μ λ΅
μ‘°μΈ μ λ΅
μ‘°μΈ μ λ΅μ λΆλͺ¨ ν μ΄λΈμ κΈ°λ³Έ ν€λ₯Ό λ°μμ κΈ°λ³Έ ν€ + μΈλ ν€λ‘ μ¬μ©νλ μ λ΅μ΄λ€.
μ΄μ λ°λΌ λΆλͺ¨ ν΄λμ€λ μλμ κ°μ΄ μμ±νλ€.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
...
}
κ΅³μ΄ κ΅¬νν ν΄λμ€κ° μλκΈ° λλ¬Έμ _abstract_λ‘ μ κ·Ό μ μ΄μλ₯Ό μ§μ νλ€. λν _@Inheritance_ μ΄λ Έν μ΄μ μ _strategy_ μμ± κ°μ μμ κ°μ΄ _InheritanceType.JOINED_λ‘ μ€μ νλ€.
_@DiscriminatorColumn_μ μ μ₯λ μμ ν μ΄λΈμ ꡬλΆν μ μλ κ΅¬λΆ μ»¬λΌμ΄λ€. κΈ°λ³Έ κ°μ _DTYPE_μ΄λ€.
μμ ν΄λμ€λ μλμ κ°λ€.
@Entity
@DiscriminatorValue("A")
public class Album extend Item {
....
}
μμ μ€μ ν΄ μ£Όμλ κ΅¬λΆ μ»¬λΌμΈ _@DiscriminatorColumn_μ λ€μ΄κ° κ°μ μ€μ νκΈ° μν΄ _@DiscriminatorValue_λ₯Ό μμ±νλ€. κ·Έλ¦¬κ³ Item ν΄λμ€λ₯Ό μμλ°μΌλ©΄ λμ΄λ€.
μ‘°μΈ μ λ΅μ μ¬μ©νμ λμ μ₯μ μ μ μ₯ 곡κ°μ ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μμΌλ©° ν μ΄λΈμ΄ μ κ·νλκ³ , μΈλ ν€ μ°Έμ‘° 무결μ±μ μ μ½ μ‘°κ±΄μ νμ©ν μ μλ€.
λ°λ©΄, μ‘°ν μμ μΏΌλ¦¬κ° λ λκ°μ μ±λ₯μ΄ μ νλ μ μλ€.
λ¨μΌ ν μ΄λΈ μ λ΅
λ§ κ·Έλλ‘ ν μ΄λΈμ νλλ§ μ¬μ©νλ κ²μ΄λ€. μ‘°μΈμ μ¬μ©νμ§ μμ μΌλ°μ μΌλ‘ κ°μ₯ λΉ λ₯΄λ€.
μμ μ½λμμ λΆλͺ¨ ν μ΄λΈ μ½λμ _@Inheritance_μ μμ±μΈ _strategy_λ₯Ό _InheritanceType.SINGLE_TABLE_λ‘ λ°κΎΈμ΄μ£Όλ©΄ λλ€.
λν ν μ΄λΈμ΄ νλμ΄κΈ°μ μμ ν μ΄λΈμ ꡬλΆνκΈ° μνμ¬ _@DiscriminatorColumn_μ κΌ μ¨μΌ νλ€.
ꡬν ν΄λμ€λ§λ€ ν μ΄λΈ μ λ΅
λ§ κ·Έλλ‘ κ΅¬ν ν΄λμ€λ§λ€ ν μ΄λΈμ μμ±νλ μ λ΅μ΄λ€. μ΄ μ λ΅μ μμ μν°ν°λ§λ€ ν μ΄λΈμ λ§λ λ€. μΌλ°μ μΌλ‘ μμ£Ό μ¬μ©νμ§λ μλλ€.
μμ κ²κ³Ό λ§μ°¬ κ°μ§λ‘ _InheritanceType.TABLE_PER_CLASS_λ‘ λ°κΎΈμ΄μ£Όμ.
MappedSuperclass
_MappedSuperclass_λ λΆλͺ¨ ν΄λμ€λ₯Ό ν μ΄λΈκ³Ό λ§€ννμ§ μκ³ , μ€μ§ κ·Έ μμ ν΄λμ€μκ² λ§€ν μ 보λ§μ μ 곡νκ³ μΆμ λ μ¬μ©νλ€.
μ¦, κ°μ²΄λ€μ΄ μ£Όλ‘ μ¬μ©νλ κ³΅ν΅ λ§€ν μ 보λ§μ μ μνκ³ μμλ€μ κ·Έμ μ΄λ₯Ό λ¬Όλ¬ λ°μ μ¬μ©νλ©΄ λλ κ²μ΄λ€.
μ¬μ©νλ λ°©λ²μ κ°λ¨νλ€. μλμ²λΌ λΆλͺ¨ ν΄λμ€μ _@MappedSuperclass_λ₯Ό λΆμ΄κ³ μμμ κ·Έλ₯ μμλ°μΌλ©΄ λλ€.
@MappedSuperclass
public abstract class BaseEntity {
...
}
μΆκ°μ μΌλ‘ λ§μ½ λΆλͺ¨μκ² μμλ°μ id λͺ μ λ°κΎΈκ³ μΆλ€λ©΄ _@AttributeOverride(name = "id", column = @Column(name = "MEMBER ID"))_μ κ°μ΄ μ¬μ©ν μ μλ€.
λ³΅ν© ν€μ μλ³ κ΄κ³ λ§€ν
μλ³ κ΄κ³ vs λΉμλ³ κ΄κ³
- μλ³ κ΄κ³
- λΆλͺ¨ ν μ΄λΈμ κΈ°λ³Έ ν€λ₯Ό λ°μμ μμ ν μ΄λΈμ κΈ°λ³Έ ν€ + μΈλ ν€λ‘ μ¬μ©νλ κ²
- λΉμλ³ κ΄κ³
- λΆλͺ¨ ν μ΄λΈμ κΈ°λ³Έ ν€λ₯Ό λ°μμ μμ ν μ΄λΈμ μΈλ ν€λ‘λ§ μ¬μ©νλ κ²
- νμμ λΉμλ³ κ΄κ³
- μΈλ ν€μ NULLμ νμ©νμ§ μμ
- μ νμ λΉμλ³ κ΄κ³
- μΈλ ν€μ NULLμ νμ©νλ κ²
λ³΅ν© ν€, λΉμλ³ κ΄κ³ λ§€ν
JPAμμ λ³΅ν© ν€λ₯Ό μ§μνλ λ°©λ²μλ λ κ°μ§κ° μλ€.
νλλ _@IdClass_, κ·Έλ¦¬κ³ λ€λ₯Έ νλλ _@EmbeddedId_μ΄λ€. μ¬κΈ°μ _@IdClass_λ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μ κ°κΉμ΄ λ°©λ²μ΄κ³ , _@EmbeddedId_λ κ°μ²΄μ§ν₯μ μ‘°κΈ λ κ°κΉμ΄ λ°©λ²μ΄λ€.
IdClassμ λν λ°©λ²
λ¨Όμ _@IdClass_μ λν λ°©λ²μ΄λ€.
λΆλͺ¨ ν΄λμ€λ μλμ κ°μ΄ μμ±νλ€.
λΆλͺ¨ ν΄λμ€
@Entity
@IdClass(ParentId.class)
public class Parent {
@Id
@Column(name = "PARENT_ID")
private String id1;
@Id
@Column(name = "PARENT_ID")
private String id2;
...
}
_@IdClass_μλ μλ³μ ν΄λμ€λ₯Ό μμ±ν΄μΌ νλ€.
μλ³μ ν΄λμ€
public class ParentId implements Serializable {
private String id1;
private String id2;
public ParentId() {
}
// equals, hashcode ꡬν
}
μλ³μ ν΄λμ€λ μμ± λͺ μ΄ μν°ν°μμ μ¬μ©νλ μλ³μ μμ± λͺ κ³Ό κ°μμΌ νλ€. λν μμ κ°μ΄ _Serializable_μ μμλ°μμΌ νλ€.
ν΄λΉ λ³΅ν© ν€λ λλ€ PKμ΄κΈ° λλ¬Έμ μ΄λ₯Ό μμλ°λ μμ ν΄λμ€λ λΉμλ³λ‘ μ€μ νκΈ° λλ¬Έμ μλμ κ°μ΄ ꡬνν΄μΌ νλ€.
μμ ν΄λμ€
@Entity
public class Child {
@Id
private String id;
@ManyToOne
@JoinColumns({
@JoinColumn(name = "PARENT_ID1",
referencedColumnName = "PARENT_ID1"),
@JoinColumn(name = "PARENT_ID2",
referencedColumnName = "PARENT_ID2")
})
private Parent parent;
}
EmbeddedIdμ λν λ°©λ²
λ€μμ _@EmbeddedId_μ λν λ°©λ²μ΄λ€.
λΆλͺ¨ ν΄λμ€
@Entity
public class Parent {
@EmbeddedId
private ParentId id;
private String name;
}
μλ³μ ν΄λμ€
@Embeddable
public class ParentId implements Serializable {
@Column(name = "PARENT_ID1")
private String id1;
@Column(name = "PARENT_ID2")
private String id2;
// equals, hashcode ꡬν
}
μμ _@IdClass_μμ μ°¨μ΄μ μ _@EmbeddedId_λΆλͺ¨ μν°ν°λ₯Ό μ μ₯ν λ μλ³μ ν΄λμ€λ₯Ό μ§μ μμ±νλ€λ κ²μ΄λ€.
Parent parent = new Parent();
ParentId = new ParentId("myId1", "myId2");
parent.setId(ParentId);
...
_@EmbeddedId_μ _@IdClass_λ μ¬μ€ μ·¨ν₯ κ» μ¬μ©νλ©΄ λλ€. _@EmbeddedId_λ μ‘°κΈ λ κ°μ²΄μ§ν₯μ μ΄μ§λ§, JPQL μΏΌλ¦¬κ° λ λκ°λ€λ μ μ μμλμ.
λ³΅ν© ν€, μλ³ κ΄κ³ λ§€ν
IdClassμ λν λ°©λ²
λΆλͺ¨ ν΄λμ€
@Entity
public class Parent {
@Id @Column(name = "PARENT_ID")
private String id;
private String name;
}
μμ ν΄λμ€
@Entity
@IdClass(ChildId.class)
public class Child {
@Id
@ManyToOne
@JoinColumn(name = "PARENT_ID")
public Parent parent;
@Id @Column(name = "CHILD_ID")
private String childId;
...
}
μλ³μ΄λ―λ‘, FKμ _@Id_λ‘ μ€μ ν΄μ£Όμ΄ FK + PKλ‘μ¨ μν μ ν μ μλλ‘ νλ€. λν Child ν΄λμ€κ° λ³΅ν© ν€λ₯Ό κ°μ§κ³ μκ² λλ―λ‘ μλ³μ ν΄λμ€λ μμ±ν΄ μ£Όμ.
μλ³μ ν΄λμ€
public class ChildId implements Serializable {
private String parent;
private String childId;
// equals, hashcode ꡬν
}
λ§μ½μ μ΄λ κ² μλ³ κ΄κ³μ λ³΅ν© ν€λ₯Ό μ§λ Child ν΄λμ€μ μμμΈ GrandChildκ° μλ€κ³ ν΄λ³΄μ.
μμ ν΄λμ€
@Entity
@IdClass(GrandChildId.class)
public class GrandChild {
@Id
@ManyToOne
@JoinColumns({
@JoinColumn(name = "PARENT_ID"),
@JoinColumn(name = "CHILD_ID")
})
private Child child;
@Id @Column(name = "GRANDCHILD_ID")
private String id;
}
μμ ν΄λμ€λ λ§μ°¬κ°μ§λ‘ FK + PKλ₯Ό μ¬μ©ν΄ μ£Όλ©° λ³΅ν© ν€λ₯Ό μ΄λ£¨κΈ° λλ¬Έμ _@IdClass_λ₯Ό μ¬μ©ν΄ μ€ μ μλ€.
EmbeddedIdμ μλ³κ΄κ³
λΆλͺ¨ ν΄λμ€
@Entity
public class Parent {
@Id @Column(name = "PARENT_ID")
private String id;
...
}
μμ ν΄λμ€
@Entity
public class Child {
@EmbeddedId
private ChildId id;
@MapsId("parentId")
@ManyToOne
@JoinColumn(name = "PARENT_ID")
public Parent parent;
...
}
μλ³κ΄κ³ 볡ν©ν€λ₯Ό νννκΈ° μν΄μ _@EmbeddedId_λ₯Ό μ¬μ©νλλ°, μ΄λ PKμ΄μ FKμ μν μ ν΄μ€ PARENT_IDλ₯Ό _@MapsId_λ‘ λ±λ‘ν΄ μ€λ€.
μλ³μ ν΄λμ€
@EmbeddedId
public class ChildId implements Serializable {
private String parentId; // @MapsIdλ‘ λ§€νλλ€.
@Column(name = "CHILD_ID")
private String id;
// equals, hashCode
...
}
_@MapsId_λ₯Ό ν΅ν΄ λ§€νλ parentIdλ PKλ‘μ¨ μν μ μνν μ μκ² λλ€. λν 볡ν©ν€μ΄κΈ°μ μμ κ°μ΄ μλ³μ ν΄λμ€λ₯Ό μμ±ν΄ μ€λ€.
μμ ν΄λμ€
@Entity
public class GrandChild {
@EmbeddedId
private GrandChildId id;
@MapsId("childId")
@ManyToOne
@JoinColumns({
@JoinColumn(name = "PARENT"),
@JoinColumn(name = "CHILD_ID")
})
private Child chlid;
}
μμ μλ³μ ν΄λμ€
@Embeddable
public class GrandChildId implements Serializable {
private ChildId childId;
@Column(name = "GRANDCHILD_ID")
private String id;
// equals, hashcode
}
_@MapId_λ μΈλν€μ λ§€νν μ°κ΄κ΄κ³λ₯Ό κΈ°λ³Έ ν€μλ λ§€ννκ² λ€λ λ»μ΄λ€.
μΌλμΌ μλ³κ΄κ³
μΌλμΌ μλ³κ΄κ³μμλ μμ ν μ΄λΈμ κΈ°λ³Έ ν€ κ°μΌλ‘ λΆλͺ¨ ν μ΄λΈμ κΈ°λ³Έ ν€ κ°μ μ¬μ©νλ€.
λΆλͺ¨ ν΄λμ€
@Entity
public class Board {
@Id @GenerateValue
@Column(name = "BOARD_ID")
private Long id;
private String title;
@OneToMany(mappedBy = "board")
private BoardDetail boardDetail;
}
μμ ν΄λμ€
@Entity
public class BoardDetail {
@Id
private Long boardId;
@MapsId
@OneToOne
@JoinColumn(name = "BOARD_ID")
private Board board;
...
}
μλ³ vs. λΉμλ³
μλ³ κ΄κ³λ κΈ°λ³Έ ν€ μ»¬λΌμ΄ λμ΄λκ³ μ‘°μΈ μμ SQLμ΄ λ³΅μ‘ν΄μ§λ€. λν 볡ν©ν€λ₯Ό λ§λ€μ΄μΌ νλ μν©λ μμ£Ό λ°μνλ€.
"λΉμλ³ κ΄κ³λ₯Ό μ¬μ©νκ³ , κΈ°λ³Έ ν€λ Long νμ μ λ리 ν€λ₯Ό μ¬μ©νμ."
λν νμμ λΉμλ³ κ΄κ³λ₯Ό μ¬μ©νλ κ²μ΄ μ’μλ°, μ΄λ μ‘°μΈ μμ μΈλΆ μ‘°μΈμ΄ μλ λ΄λΆ μ‘°μΈ(inner join)μ μ¬μ©νκ² λλ―λ‘ NOT NULLμ 보μ₯νκΈ° λλ¬Έμ΄λ€.
μ‘°μΈ ν μ΄λΈ
λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ μ°κ΄κ΄κ³λ₯Ό μ€κ³νλ λ°©λ²μ ν¬κ² λ κ°μ§λ‘ μ‘°μΈ μ»¬λΌ(μΈλ ν€)μ μ¬μ©νκ±°λ μ‘°μΈ ν μ΄λΈ(ν μ΄λΈ)μ μ¬μ©νλ λ°©λ²μΌλ‘ λλλ€.
μ‘°μΈ μ»¬λΌμ μ΄μ κΉμ§ μ°λ¦¬κ° μ¬μ©ν _@JoinColumn_μ μ¬μ©νλ©΄ λκ³ , μ‘°μΈ ν μ΄λΈμ _@JoinTable_μ μ¬μ©νλ€.
μ‘°μΈ ν μ΄λΈμ μ¬μ©νλ μ΄μ λ λ€λλ€ κ΄κ³λ₯Ό ν΄κ²°νλ κ²λ μμ§λ§, μΈλ ν€ κΈ°λ°μΌλ‘ μ€κ³νμ λ NULLκ°μ΄ λ§μ΄ μ μ₯λλ μν©μ νΌνκΈ° μν΄ μ¬μ©νλ€. μ¦, μΌλμΌ, λ€λμΌ, μΌλλ€ μν©μμλ μΆ©λΆν μ¬μ©ν μ μλ€.
μλ° ORM νμ€ JPA νλ‘κ·Έλλ° - κΈ°λ³ΈνΈ κ°μ - μΈνλ°
νμ¬λμ λ§€μΌ λ°μ μμ€μ νμμ΄λΌλ λ€λκΉ μκ°νλλ° λ§μΉ¨ JPA κ°μκ° μ겨μ κΏ νμ΄λ°μ΄λ€μ. μ λ μ΄ μ μ JPA μ± μ λ³΄κ³ κ³΅λΆ νμλλ°μ κΆκΈνλ μ , μ 무μ μ μ©νλ©° κ³ λ―Όνκ³ ν΄κ²°ν
www.inflearn.com
'π£ Spring > JPA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JPA] λ€μν μ°κ΄κ΄κ³ λ§€ν μμ보기 (2) | 2024.03.09 |
---|---|
[JPA] μ°κ΄κ΄κ³ λ§€νμ κΈ°μ΄ (4) | 2024.03.08 |
[JPA] JPA Entity λ§€ννκΈ° (0) | 2024.03.02 |
[JPA] JPAμ μμμ± κ΄λ¦¬μ λν΄ (2) | 2023.12.29 |