βπ[Backend Development] λ¨λ°©ν₯κ³Ό μλ°©ν₯μ κ°λ μ λνμ¬.β
π Intro.
- JPAμμ μν°ν° κ°μ κ΄κ³λ₯Ό μ€μ ν λ λ¨λ°©ν₯κ³Ό μλ°©ν₯ κ΄κ³λ₯Ό μ μν μ μμ΅λλ€.
- μ΄λ λ°μ΄ν°λ² μ΄μ€μ μΈλ ν€(Foreign Key) κ΄κ³λ₯Ό κ°μ²΄ μ§ν₯μ μΌλ‘ 맀ννλ λ°©μμ λ°λΌ λ¬λΌμ§λλ€.
β 1οΈβ£ λ¨λ°©ν₯ κ΄κ³ (Unidirectional)
- λ¨λ°©ν₯ κ΄κ³λ νμͺ½ μν°ν°λ§ λ€λ₯Έ μν°ν°λ₯Ό μ°Έμ‘°νλ λ°©μμ λλ€.
π μμ : λ¨λ°©ν₯ @OneToOne κ΄κ³.
@Entity
public class Passport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String passportNumber;
}
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "passport_id") // μΈλ ν€λ₯Ό Person ν
μ΄λΈμ΄ κ°μ§
private Passport passport;
}
π νΉμ§
- Person μν°ν°μμλ§ Passportλ₯Ό μ°Έμ‘°ν μ μμ΅λλ€.
- Passport μν°ν°μμλ Personμ μ ν λͺ¨λ¦ λλ€.
- ν μ΄λΈ ꡬ쑰μμλ Person ν μ΄λΈμ passport_idλΌλ μΈκ° ν€κ° μ‘΄μ¬ν©λλ€.
- λ°μ΄ν° μ‘°ν μ Personμ κ°μ Έμ¬ λ Passportλ ν¨κ» μ‘°νν μ μμ΅λλ€.
β 2οΈβ£ μλ°©ν₯ κ΄κ³ (Bidirectional)
- μλ°©ν₯ κ΄κ³λ λ μν°ν°κ° μλ‘λ₯Ό μ°Έμ‘°νλ λ°©μμ λλ€.
π μμ : μλ°©ν₯ @OneToOne κ΄κ³.
@Entity
public class Passport {
@Id
@GeneratedValue(startegy = GenerationType.IDENTITY)
private Long id;
private String passportNumber;
@OneToOne(mappedBy = "passport") // Person μν°ν°μ passport νλμ μ°κ²°
private Person person;
}
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "passport_id") // μ€μ μΈλ ν€λ₯Ό μμ
private Passport passport;
}
π νΉμ§
- Personμ΄ Passportλ₯Ό μ°Έμ‘°νκ³ , Passportλ Personμ μ°Έμ‘°ν©λλ€.
- Personμ΄ μΈλ ν€λ₯Ό μμ (@JoinColumn(name = βpassport_id))β
- Passportμμ mappedBy = βpassportβλ₯Ό μ¬μ©νμ¬ λ°λνΈμμ 맀νμ λ΄λΉν¨.
- λ μν°ν°κ° μλ‘ μ°Έμ‘°νκΈ° λλ¬Έμ μλ°©ν₯ νμ κ°λ₯(μ: passport.getPerson())
β 3οΈβ£ λ¨λ°©ν₯ VS μλ°©ν₯ λΉκ΅.
κ΅¬λΆ | λ¨λ°©ν₯ κ΄κ³ | μλ°©ν₯ κ΄κ³ |
---|---|---|
μ°Έμ‘° λ°©ν₯ | νμͺ½ μν°ν°λ§ λ€λ₯Έ μν°ν°λ₯Ό μ°Έμ‘° | λ μν°ν°κ° μλ‘ μ°Έμ‘° |
ν μ΄λΈ ꡬ쑰 | νμͺ½ ν μ΄λΈμλ§ μΈλ ν€ μ‘΄μ¬ | ν μ΄λΈ ꡬ쑰λ λμΌνλ κ°μ²΄μμ μνΈ μ°Έμ‘° |
μ‘°ν λ°©ν₯ | νμͺ½μμλ§ μ‘°ν κ°λ₯ | μμͺ½μμ μ‘°ν κ°λ₯ |
μ¬μ© μ | λ¨μν μ°κ΄ κ΄κ³ | μκ΄ κ΄κ³κ° νμν κ²½μ° |
β 4οΈβ£ μΈμ λ¨λ°©ν₯/μλ°©ν₯μ μ νν΄μΌ ν κΉ?
1οΈβ£ λ¨λ°©ν₯μ΄ λ μ ν©ν κ²½μ°.
-
λ°λ λ°©ν₯μμ μ°Έμ‘°ν νμκ° μλ κ²½μ°
- μ: Order β Payment (μ£Όλ¬Έμ κ²°μ λ₯Ό μ°Έμ‘°νμ§λ§, κ²°μ λ μ£Όλ¬Έμ μ°Έμ‘°ν νμ μμ)
-
μ±λ₯μ μ΅μ ννκ³ λΆνμν λ°μ΄ν° λ‘λ©μ λ°©μ§νκ³ μΆμ κ²½μ°
- μλ°©ν₯ κ΄κ³λ₯Ό λ§λ€λ©΄ λΆνμν μ°κ΄ κ°μ²΄κΉμ§ λ‘λ©λ μ μμ.
- FetchType.LAZYλ₯Ό μ€μ νλλΌλ κ΄λ¦¬ λΆλ΄μ΄ μ»€μ§ μ μμ.
2οΈβ£ μλ°©ν₯μ΄ λ μ ν©ν κ²½μ°.
-
μμͺ½μμ μ°Έμ‘°ν νμκ° μλ κ²½μ°
- μ: Member β Team (νμμ΄ νμ μ°Έμ‘°νκ³ , νλ νμ λͺ©λ‘μ κ΄λ¦¬ν΄μΌ ν¨)
-
λ°λ μν°ν°λ₯Ό μ½κ² μ‘°νν΄μΌ νλ κ²½μ°
- μλ₯Ό λ€μ΄ Passportμμ Personμ μ‘°ννλ κΈ°λ₯μ΄ μμ£Ό νμνλ€λ©΄ μλ°©ν₯μ΄ μ 리ν¨.
- OneToMany, ManyToOne κ΄κ³μμλ μ±λ₯ κ³ λ € ν μλ°©ν₯ μ€μ μ ν μλ μμ.
β 5οΈβ£ μ 리
- @OneToOne, @OneToMany, @ManyToOne, @ManyToMany κ΄κ³λ λ¨λ°©ν₯κ³Ό μλ°©ν₯μ΄ λͺ¨λ κ°λ₯ν©λλ€.
- λ¨λ°©ν₯μ νμͺ½μμλ§ μ°Έμ‘°, μλ°©ν₯μ μλ‘ μ°Έμ‘°ν©λλ€.
- μλ°©ν₯ κ΄κ³μμλ mappedByλ₯Ό μ¬μ©νμ¬ μ°κ΄ κ΄κ³μ μ£ΌμΈμ μ§μ ν΄μΌ ν©λλ€.
- λΆνμν μλ°©ν₯ κ΄κ³λ₯Ό νΌνκ³ , νμν κ²½μ°μλ§ μ μ©νμ¬ μ±λ₯κ³Ό μ μ§λ³΄μμ±μ κ³ λ €ν΄μΌ ν©λλ€.
π μΌλ°μ μΌλ‘ λ¨λ°ν₯μ κΈ°λ³ΈμΌλ‘ νκ³ , νμν λλ§ μλ°©ν₯μ μΆκ°νλ κ²μ΄ μ’μ΅λλ€.