Home > CS > 2024 > πŸ’Ύ [CS] μ˜μ†μ„±(Persistence)λž€ λ¬΄μ—‡μΌκΉŒ?

πŸ’Ύ [CS] μ˜μ†μ„±(Persistence)λž€ λ¬΄μ—‡μΌκΉŒ?
CS

β€œπŸ’Ύ [CS] μ˜μ†μ„±(Persistence)λž€ λ¬΄μ—‡μΌκΉŒ?”

  • μ˜μ†μ„±(Persistence) μ΄λž€ λ°μ΄ν„°λ‚˜ 객체의 μƒνƒœλ₯Ό μ§€μ†μ μœΌλ‘œ μ €μž₯ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜κ±°λ‚˜ μ‹œμŠ€ν…œμ΄ μž¬λΆ€νŒ…λ˜λ”λΌλ„ κ·Έ μƒνƒœκ°€ μœ μ§€λ˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • κ°„λ‹¨νžˆ λ§ν•˜λ©΄, μ˜μ†μ„±μ€ 데이터λ₯Ό 영ꡬ적으둜 μ €μž₯ν•˜λŠ” λŠ₯λ ₯을 κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  • μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œμ—μ„œλŠ” 주둜 λ°μ΄ν„°λ² μ΄μŠ€, 파일 μ‹œμŠ€ν…œ, μ˜μ† μ €μž₯μ†Œμ™€ 같은 μ™ΈλΆ€ μ €μž₯μ†Œμ— 데이터λ₯Ό μ €μž₯ν•˜λŠ” 것을 μ˜μ†μ„±μ΄λΌκ³  ν•©λ‹ˆλ‹€.

1️⃣ μ˜μ†μ„±μ˜ 예.

  • λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 데이터
    • λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 λ°μ΄ν„°λŠ” μ‹œμŠ€ν…œμ΄ μ’…λ£Œλ˜κ±°λ‚˜ 전원이 꺼져도 영ꡬ적으둜 μ €μž₯λ©λ‹ˆλ‹€.
    • ν”„λ‘œκ·Έλž¨μ΄ λ‹€μ‹œ 싀행될 λ•Œ 이 데이터λ₯Ό λΆˆλŸ¬μ™€μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 파일 μ‹œμŠ€ν…œμ— μ €μž₯된 데이터
    • 파일 μ‹œμŠ€ν…œμ— μ €μž₯된 νŒŒμΌλ„ μ‹œμŠ€ν…œ μž¬λΆ€νŒ… 후에도 μœ μ§€λ˜λ©°, λ‚˜μ€‘μ— λ‹€μ‹œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μ˜μ†μ„±μ˜ μ€‘μš”μ„±.

  • μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œμ—μ„œλŠ” λŒ€λΆ€λΆ„μ˜ 데이터가 λ©”λͺ¨λ¦¬(νœ˜λ°œμ„±)μ—λ§Œ μ‘΄μž¬ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜κ±°λ‚˜ μž₯μ• κ°€ λ°œμƒν•  λ•Œ 데이터λ₯Ό μžƒκ²Œ λ©λ‹ˆλ‹€.
  • μ˜μ†μ„±μ„ μ‚¬μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ”λΌλ„ μ€‘μš”ν•œ λ°μ΄ν„°λŠ” λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ 파일 μ‹œμŠ€ν…œμ— μ €μž₯λ˜λ―€λ‘œ μ‹œμŠ€ν…œμ΄ λ‹€μ‹œ μ‹œμž‘λ˜μ—ˆμ„ λ•Œ 데이터λ₯Ό λ³΅κ΅¬ν•˜κ±°λ‚˜ μ΄μ–΄μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ Java 및 Springμ—μ„œμ˜ μ˜μ†μ„±.

  • Java ν™˜κ²½, 특히 JPA(Java Persistence API) λ₯Ό μ‚¬μš©ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ˜μ†μ„±μ€ 주둜 λ°μ΄ν„°λ² μ΄μŠ€μ™€ μžλ°” 객체 κ°„μ˜ μƒνƒœ μœ μ§€λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • JPAλŠ” μžλ°” 객체λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ˜μ†μ μœΌλ‘œ μ €μž₯ν•˜κ³ , ν•„μš”ν•  λ•Œ 데이터λ₯Ό μ‘°νšŒν•˜μ—¬ λ‹€μ‹œ 객체둜 λ³€ν™˜ν•˜λŠ” 과정을 μžλ™μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

JAPμ—μ„œμ˜ μ£Όμš” κ°œλ….

1. μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)

  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλŠ” JPAμ—μ„œ μžλ°” 객체(Entity)λ₯Ό κ΄€λ¦¬ν•˜λŠ” μΌμ’…μ˜ μΊμ‹œ λ©”λͺ¨λ¦¬μž…λ‹ˆλ‹€.
  • μ—”ν‹°ν‹°κ°€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— ν¬ν•¨λ˜λ©΄, ν•΄λ‹Ή μ—”ν‹°ν‹°λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ— μ˜μ†λ©λ‹ˆλ‹€.
  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλŠ” μ—”ν‹°ν‹°μ˜ μƒνƒœ λ³€ν™”λ₯Ό κ°μ§€ν•˜κ³ , κ·Έ λ³€ν™”κ°€ νŠΈλžœμž­μ…˜μ΄ 끝날 λ•Œ λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜λ˜λ„λ‘ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

2. μ—”ν‹°ν‹°(Entity)

  • JPAμ—μ„œ μ—”ν‹°ν‹°λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”κ³Ό λ§€ν•‘λ˜λŠ” μžλ°” κ°μ²΄μž…λ‹ˆλ‹€.
  • μ—”ν‹°ν‹°λŠ” 데이터λ₯Ό μ˜μ†μ μœΌλ‘œ μœ μ§€ν•˜κΈ° μœ„ν•œ μˆ˜λ‹¨μœΌλ‘œ, JPAλŠ” 이λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜κ³  λ‹€μ‹œ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€.

3. EntityManager

  • EntityManagerλŠ” JPA의 핡심 μΈν…ŒνŽ˜μ΄μŠ€λ‘œ, μ—”ν‹°ν‹°μ˜ CRUD(생성, 쑰회, μˆ˜μ •, μ‚­μ œ) μž‘μ—…μ„ λ‹΄λ‹Ήν•©λ‹ˆλ‹€.
  • EntityManagerλŠ” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλ₯Ό κ΄€λ¦¬ν•˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • persist() λ©”μ„œλ“œλ₯Ό 톡해 μ—”ν‹°ν‹°λ₯Ό μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ €μž₯ν•˜κ³ , 이λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4. μ˜μ† μƒνƒœ(Persistent State)

  • JPAμ—μ„œ μ—”ν‹°ν‹° κ°μ²΄λŠ” λ‹€μŒ μ„Έ 가지 μƒνƒœλ₯Ό κ°€μ§‘λ‹ˆλ‹€.
    • λΉ„μ˜μ†(Transient) : λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ „ν˜€ μ—°κ²°λ˜μ§€ μ•Šμ€ μƒνƒœμž…λ‹ˆλ‹€.
    • μ˜μ†(Persistent) : μ—”ν‹°ν‹°κ°€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— ν¬ν•¨λ˜μ–΄ κ΄€λ¦¬λ˜κ³  μžˆλŠ” μƒνƒœλ‘œ, λ°μ΄ν„°λ² μ΄μŠ€μ— κΈ°λ‘λ˜κ±°λ‚˜ 기둝될 μ€€λΉ„κ°€ λ˜μ–΄ μžˆλŠ” μƒνƒœμž…λ‹ˆλ‹€.
    • μ€€μ˜μ†(Detached) : μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ˜ν•΄ κ΄€λ¦¬λ˜μ§€ μ•Šμ§€λ§Œ λ°μ΄ν„°λ² μ΄μŠ€μ—λŠ” μ—¬μ „νžˆ μ‘΄μž¬ν•˜λŠ” μƒνƒœμž…λ‹ˆλ‹€.

μ˜μ† μƒνƒœ 전이 μ˜ˆμ‹œ

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    // Getters, Setters, Constructors
}
// μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ™€ EntityManagerλ₯Ό μ‚¬μš©ν•œ μ˜μ†μ„± μ˜ˆμ‹œ
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();

// 1. λΉ„μ˜μ† μƒνƒœ: User κ°μ²΄λŠ” 아직 λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ—°κ²°λ˜μ§€ μ•ŠμŒ
User user = new User();
user.setName("Kobe");

// 2. μ˜μ† μƒνƒœ: persist()둜 μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ €μž₯됨
entityManager.persist(user);

// 3. νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ˜λ©΄, λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯됨
entityManager.getTransaction().commit();
entityManager.close();

μ„€λͺ….

  • λΉ„μ˜μ† μƒνƒœ : new User()둜 μƒμ„±λœ κ°μ²΄λŠ” λ©”λͺ¨λ¦¬μ—μ„œλ§Œ μ‘΄μž¬ν•˜κ³ , 아직 λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ—°κ²°λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
  • μ˜μ† μƒνƒœ : entityManager.persist(user)λ₯Ό ν˜ΈμΆœν•˜λ©΄ κ°μ²΄λŠ” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ €μž₯되고, λ°μ΄ν„°λ² μ΄μŠ€μ— 반영될 μ€€λΉ„κ°€ λ©λ‹ˆλ‹€.
  • νŠΈλžœμž­μ…˜μ΄ μ»€λ°‹λ˜λ©΄, μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μžˆλŠ” 객체의 μƒνƒœκ°€ λ°μ΄ν„°λ² μ΄μŠ€μ— 영ꡬ적으둜 μ €μž₯λ©λ‹ˆλ‹€.

4️⃣ 정리.

  • μ˜μ†μ„±μ€ 데이터λ₯Ό 영ꡬ적으둜 μ €μž₯ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.
    • 주둜 λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ 파일 μ‹œμŠ€ν…œμ— 데이터λ₯Ό μ €μž₯ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ”λΌλ„ 데이터가 μœ μ§€λ  수 있게 ν•©λ‹ˆλ‹€.
  • JPAμ—μ„œ μ˜μ†μ„±μ€ 객체(Entity)의 μƒνƒœλ₯Ό μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ—μ„œ κ΄€λ¦¬ν•˜κ³ , 이 μƒνƒœκ°€ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ—°λ™λ˜μ–΄ 지속될 수 있게 ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλŠ” JPAμ—μ„œ μ—”ν‹°ν‹° 객체의 μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜κ³ , λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ 동기화λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ€‘μš”ν•œ λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€.