Home
>
Spring
>
π[Spring] JPA μ°κ΄κ΄κ³μ λν μΆκ°μ μΈ κΈ°λ₯λ€μλ 무μμ΄ μμκΉμ? - μ°κ΄κ΄κ³ μ£ΌμΈ ν¨κ³Ό
Spring
Framework
π[Spring] JPA μ°κ΄κ΄κ³μ λν μΆκ°μ μΈ κΈ°λ₯λ€μλ 무μμ΄ μμκΉμ? - μ°κ΄κ΄κ³ μ£ΌμΈ ν¨κ³Ό
1οΈβ£ μ°κ΄κ΄κ³ μ£ΌμΈ ν¨κ³Ό.
- JPAμμ μ°κ΄κ΄κ³μ μ£ΌμΈμΌλ‘ μ€μ λ μν°ν°λ§ λ°μ΄ν°λ² μ΄μ€μ μΈλ ν€λ₯Ό λ°μν μ μλ ν¨κ³Όλ₯Ό λ§ν©λλ€.
- JPAμμλ μ°κ΄κ΄κ³μ μ£ΌμΈ(Owner)κ³Ό μ£ΌμΈμ΄ μλ μν°ν°(Non-owner)λ₯Ό ꡬλΆνμ¬, λ°μ΄ν°λ² μ΄μ€μ μΈλ ν€λ₯Ό μ μ₯νκ±°λ μ
λ°μ΄νΈν λ μ£ΌμΈμΌλ‘ μ€μ λ μν°ν°λ§ μ€μ SQLμ λ°μλλλ‘ ν©λλ€.
2οΈβ£ μ°κ΄κ΄κ³ μ£ΌμΈ ν¨κ³Όμ λμ λ°©μ.
- μλ°©ν₯ μ°κ΄κ΄κ³μμ λ μν°ν°κ° μλ‘λ₯Ό μ°Έμ‘°ν λ, μ΄λ νμͺ½μ βμ°κ΄κ΄κ³μ μ£ΌμΈβμΌλ‘ μ€μ νκ³ , κ·Έ μ£ΌμΈμμλ§ μΈλ ν€ κ°μ μ μ₯νκ±°λ λ³κ²½ν μ μμ΅λλ€.
- μ£ΌμΈμ΄ μλ μͺ½μμλ mappedBy μμ±μ ν΅ν΄ μ£ΌμΈμ΄ μλμ λͺ
μνκ³ , μ΄λ μ½κΈ° μ μ©μΌλ‘ μ·¨κΈλ©λλ€.
- μ΄λ₯Ό ν΅ν΄ JPAλ μ€λ³΅λ μΈλ ν€ μ μ₯μ λ°©μ§νκ³ , μ€μ μΈλ ν€ κ΄λ¦¬λ₯Ό μΌκ΄λκ² μ²λ¦¬ν©λλ€.
π μμ: 1:1 κ΄κ³μμμ μ°κ΄κ΄κ³ μ£ΌμΈ ν¨κ³Ό.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "user_profile_id") // μΈλ ν€ κ΄λ¦¬
private UserProfile userProfile;
// getter, setter λ±
}
@Entity
public class UserProfile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String address;
private String phoneNumber;
@OneToOne(mappedBy = "userProfile") // μ£ΌμΈμ΄ μλμ λͺ
μ
private User user;
// getter, setter λ±
}
- μ μ½λμμ User μν°ν°κ° UserProfile μν°ν°μ μ°κ΄κ΄κ³μμ μ£ΌμΈμ
λλ€.
- userProfile νλμ λν μ€μ λ§ λ°μ΄ν°λ² μ΄μ€μ λ°μλ©λλ€.
π μ°κ΄κ΄κ³ μ£ΌμΈ ν¨κ³Όμ μμ μν©.
User user = new User();
UserProfile profile = new UserProfile();
user.setUserProfile(profile);
profile.setUser(user);
entityManager.persist(user);
entityManager.persist(profile);
- μμ κ°μ΄ userμ userProfileμ μ€μ νκ³ profileμ userλ₯Ό μ€μ ν΄λ, μ€μ λ°μ΄ν°λ² μ΄μ€μλ User μν°ν°μ userProfileμ μ€μ λ κ°λ§ μΈλ ν€λ‘ λ°μλ©λλ€.
- UserProfile μν°ν°μμ user νλμ λ³κ²½μ λ°μ΄ν°λ² μ΄μ€μ λ°μλμ§ μμ΅λλ€.
- μ΄λ₯Ό ν΅ν΄ λΆνμν μΏΌλ¦¬κ° λ°μνλ κ²μ λ°©μ§νκ³ , λ°μ΄ν° 무결μ±μ μ μ§ν μ μμ΅λλ€.
3οΈβ£ μμ½.
-
μ°κ΄κ΄κ³ μ£ΌμΈλ§ λ°μ΄ν°λ² μ΄μ€μ μΈλ ν€ μ 보λ₯Ό λ°μν μ μμ΅λλ€.
-
μ£ΌμΈμ΄ μλ μν°ν°μμ μ€μ ν μ°κ΄κ΄κ³λ λ°μ΄ν°λ² μ΄μ€μ λ°μλμ§ μμΌλ©°, μ½κΈ° μ μ©μΌλ‘ μ¬μ©λ©λλ€.
- μ΄λ₯Ό ν΅ν΄ μ€λ³΅λ μΈλ ν€ μ μ₯μ λ°©μ§νκ³ , λ°μ΄ν° 무결μ±μ μ μ§ν μ μμ΅λλ€.
4οΈβ£ μ°κ΄κ΄κ³ μ£ΌμΈ.
-
μΈλ ν€(Foreign Key)λ₯Ό κ΄λ¦¬νλ μν°ν°λ₯Ό λ§ν©λλ€.
- μ΄λ λ°μ΄ν°λ² μ΄μ€μ μ°κ΄κ΄κ³μ κ΄λ ¨λ λ³κ²½μ¬νμ λ°μν λ μ΄λ€ μν°ν°κ° μΈλ ν€μ μμ , μ½μ
, μμ μμ
μ μννλμ§λ₯Ό κ²°μ ν©λλ€.
5οΈβ£ μ°κ΄κ΄κ³ μ£ΌμΈμ μν .
- μ°κ΄κ΄κ³μμ μ£ΌμΈμΌλ‘ μ§μ λ μν°ν°λ λ°μ΄ν°λ² μ΄μ€μ μΈλ ν€ μ»¬λΌμ κ΄λ¦¬νλ©°, μ£ΌμΈμ΄ μλ μͺ½μμλ μ°κ΄κ΄κ³λ₯Ό μ½κΈ° μ μ©μΌλ‘ μ¬μ©ν©λλ€.
- μλ₯Ό λ€μ΄, μλ°©ν₯ μ°κ΄κ΄κ³μμ
@OneToOne
, @OneToMany
, @ManyToMany
, @ManyToOne
, @ManyToMany
μ€ μ£ΌμΈμ΄ λλ μͺ½μμλ§ μΈλ ν€μ κ°μ΄ λ³κ²½λ©λλ€.
6οΈβ£ μ°κ΄κ΄κ³ μ£ΌμΈ μ€μ μ μ€μμ±.
- JPAμμ μ°κ΄κ΄κ³μ μ£ΌμΈμ μ€μ νλ μ΄μ λ μλ°©ν₯ μ°κ΄κ΄κ³μμ λ μν°ν° λͺ¨λ μ°κ΄κ΄κ³λ₯Ό λ§Ίκ³ μλ κ²½μ°, μ΄λ μͺ½μ΄ μ€μ λ‘ λ°μ΄ν°λ² μ΄μ€μ λ°μν μ§λ₯Ό λͺ
νν νκΈ° μν¨μ
λλ€.
- μ£ΌμΈμ΄ μλ μν°ν°μμ μ°κ΄κ΄κ³λ₯Ό μ€μ νλλΌλ λ°μ΄ν°λ² μ΄μ€μλ λ°μλμ§ μκ³ , μ£ΌμΈμμ μ€μ λ λ΄μ©λ§ λ°μλ©λλ€.
π μμ : 1:1 κ΄κ³μμμ μ°κ΄κ΄κ³ μ£ΌμΈ μ€μ .
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "user_profile_id") // μΈλ ν€ κ΄λ¦¬
private UserProfile userProfile;
// getter, setter λ±
}
@Entity
public class UserProfile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String address;
private String phoneNumber;
@OneToOne(mappedBy = "userProfile") // μ°κ΄κ΄κ³ μ£ΌμΈμ΄ μλμ λͺ
μ
private User user;
// getter, setter λ±
}
- μ μ½λμμ User μν°ν°κ° μ°κ΄κ΄κ³μ μ£ΌμΈμ΄λ©°, UserProfileμ mappedBy μμ±μ ν΅ν΄ μ°κ΄κ΄κ³ μ£ΌμΈμ΄ μλμ λͺ
μνκ³ μμ΅λλ€.
- μ΄ κ²½μ° μΈλ ν€λ User μν°ν°μ user_profile_id 컬λΌμ μ μ₯λ©λλ€.
7οΈβ£ μμ½.
-
μ°κ΄κ΄κ³ μ£ΌμΈ : λ°μ΄ν°λ² μ΄μ€μ μΈλ ν€λ₯Ό κ΄λ¦¬νλ μν°ν°.
@JoinColumn
μ ν΅ν΄ μ€μ λ¨.
-
μ£ΌμΈμ΄ μλ μν°ν° : mappedBy μμ±μ ν΅ν΄ μ€μ λλ©°, μ½κΈ° μ μ©μΌλ‘ μλ.
- μ£ΌμΈλ§μ΄ μΈλ ν€ μμ , μμ , μ½μ
μ κ΄λ¦¬νκ³ λ°μ΄ν°λ² μ΄μ€μ λ°μν¨.