πŸ›  κ΅¬ν˜„ λ‚΄μš©

λΉ„λ°€ λ‹€μ΄μ–΄λ¦¬μ˜ 핡심 도메인인 Diary μ—”ν‹°ν‹°λ₯Ό JPAλ₯Ό 톡해 μ„€κ³„ν•˜μ˜€λ‹€.

μ²˜μŒμ—λŠ” λ‹€μŒκ³Ό 같은 μƒμ„±μžλ₯Ό μž‘μ„±ν•˜μ˜€


public Diary(String title, String content, String author, String password) {
    this.title = title;
    this.content = content;
    this.author = author;
    this.password = password;
}

이 μƒμ„±μžλ₯Ό 톡해 객체 생성에 ν•„μš”ν•œ ν•„λ“œλ“€μ„ 직접 μ΄ˆκΈ°ν™”ν•  수 μžˆμ—ˆλ‹€.

κ·Έλž˜μ„œ '이 정도면 μΆ©λΆ„ν•˜κ² μ§€'라고 μƒκ°ν–ˆμ§€λ§Œ, μ‹€ν–‰ 쀑 JPA κ΄€λ ¨ 였λ₯˜κ°€ λ°œμƒν•˜λ©΄μ„œ κΈ°λ³Έ μƒμ„±μžμ˜ ν•„μš”μ„±μ„ μ•Œκ²Œ λ˜μ—ˆλ‹€.


🧱 Entity κΈ°λ³Έ μƒμ„±μž κ΄€λ ¨ 정리

βœ… 상황 μš”μ•½

Diary μ—”ν‹°ν‹° ν΄λž˜μŠ€μ—μ„œ λ‹€μŒκ³Ό 같이 μƒμ„±μžλ₯Ό λ§Œλ“€μ—ˆλ‹€:


public Diary(String title, String content, String author, String password) {
    this.title = title;
    this.content = content;
    this.author = author;
    this.password = password;
}

protected Diary() {
    // JPA κΈ°λ³Έ μƒμ„±μž
}

μ²˜μŒμ—λŠ” Diary(String...) μƒμ„±μžλ₯Ό λ§Œλ“€μ—ˆμœΌλ‹ˆ JPA도 κ·Έκ±Έ μ‚¬μš©ν•˜κ² μ§€? 라고 μƒκ°ν–ˆλ‹€.

그런데 JPAλŠ” λ°˜λ“œμ‹œ νŒŒλΌλ―Έν„°κ°€ μ—†λŠ” κΈ°λ³Έ μƒμ„±μžκ°€ μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 사싀을 μƒˆλ‘­κ²Œ μ•Œκ²Œ λ˜μ—ˆλ‹€.


πŸ” β“μ™œ JPAλŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό λ°˜λ“œμ‹œ ν•„μš”λ‘œ ν• κΉŒ?

JPAλŠ” μ—”ν‹°ν‹° 객체λ₯Ό 생성할 λ•Œ new ν‚€μ›Œλ“œλ‚˜ μƒμ„±μž 직접 ν˜ΈμΆœμ„ μ‚¬μš©ν•˜μ§€ μ•ŠμŒ.

λŒ€μ‹  λ‚΄λΆ€μ μœΌλ‘œ λ¦¬ν”Œλ ‰μ…˜(Reflection) 을 μ‚¬μš©ν•΄ 객체λ₯Ό μƒμ„±ν•˜λŠ”λ°,

μ΄λ•Œ λ‹€μŒκ³Ό 같은 방식을 λ”°λ₯Έλ‹€:

πŸ” JPAλŠ” 클래슀 λ‚΄λΆ€ μƒμ„±μž μ€‘μ—μ„œ "νŒŒλΌλ―Έν„°κ°€ μ—†λŠ” μƒμ„±μž"λ₯Ό λ¨Όμ € μ°Ύκ³ , κ·Έκ±Έ ν˜ΈμΆœν•΄ 객체λ₯Ό μƒμ„±ν•œλ‹€.


βœ”οΈ 즉, JPAλŠ” λ‹€μŒκ³Ό 같은 과정을 κ±°μΉ¨:

1. Diary ν΄λž˜μŠ€μ—μ„œ "κΈ°λ³Έ μƒμ„±μž"λ₯Ό 찾음
2. ν•΄λ‹Ή μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ„œ '빈 객체'λ₯Ό 생성함
3. DBμ—μ„œ μ½μ–΄μ˜¨ 값듀을 ν•„λ“œ(setter λ˜λŠ” ν•„λ“œ μ ‘κ·Ό 방식)둜 μ£Όμž…ν•¨