π[Spring] JPAλ 무μμΈκ°μ?
- JPA(Java Persistence API) λ μλ° μ ν리μΌμ΄μ μμ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μ μνΈμμ©νκΈ° μν ORM(Objcet-Relational Mapping) νμ€ μ λλ€.
- JPAλ μλ° κ°μ²΄μ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈ κ°μ 맀νμ μλμΌλ‘ μ²λ¦¬νμ¬, κ°λ°μκ° SQL 쿼리λ₯Ό μ§μ μμ±νμ§ μκ³ λ λ°μ΄ν°λ² μ΄μ€ μμ μ μνν μ μλλ‘ λμμ€λλ€.
- JPAλ μλ° EE(Enterprise Edition) μ 곡μ μ€ν© μ€ νλμ΄λ©°, μ¬λ¬ ꡬν체(Hibernate, EclipseLink, OpenJPA λ±)λ€μ΄ JPA νμ€μ λ°λ¦ λλ€.
1οΈβ£ JPAμ μ£Όμ κ°λ .
1. κ°μ²΄-κ΄κ³ 맀ν(ORM, Object-Relational Mapping).
- JPAλ ORM(Object-Relational Mapping) μ ν΅ν΄ μλ° κ°μ²΄λ₯Ό λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ μλμΌλ‘ 맀νν©λλ€.
- μ΄λ₯Ό ν΅ν΄ μλ° κ°μ²΄μ λ°μ΄ν°λ² μ΄μ€ κ°μ λ³νμ μλμΌλ‘ μ²λ¦¬ν νμ μμ΄, κ°μ²΄ μ§ν₯μ μΌλ‘ λ°μ΄ν°λ² μ΄μ€ μμ μ μνν μ μμ΅λλ€.
- ORMμ κ°λ°μκ° μ§μ SQLμ μμ±νμ§ μκ³ λ μλ° κ°μ²΄λ₯Ό μ‘°μν¨μΌλ‘μ¨ λ°μ΄ν°λ₯Ό μ²λ¦¬ν μ μλλ‘ λμμ€λλ€.
2. μμμ±(Persistence).
- JPAμμ μμμ±μ μλ° κ°μ²΄λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ₯νκ³ κ΄λ¦¬νλ κ³Όμ μ μλ―Έν©λλ€.
- JPAλ μν°ν°(Entity)λΌλ κ°μ²΄λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ©°, μν°ν° κ°μ²΄λ νΉμ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ ν(row)μ 맀νλ©λλ€.
- μμμ± μ»¨ν μ€νΈ(Persistence Context) λ μν°ν° κ°μ²΄λ₯Ό κ΄λ¦¬νλ 곡κ°μΌλ‘, κ°μ²΄μ μνλ₯Ό κ΄λ¦¬νκ³ λ³κ²½ μ¬νμ λ°μ΄ν°λ² μ΄μ€μ λ°μν©λλ€.
3. μν°ν°(Entity).
- JPAμμ μν°ν°λ λ°μ΄ν°λ² μ΄μ€μ ν μ΄λΈμ λμνλ μλ° ν΄λμ€μ λλ€.
- μν°ν° ν΄λμ€λ λ°μ΄ν°λ² μ΄μ€μ ν μ΄λΈμ λͺ¨λΈλ§νλ©°, κ° μΈμ€ν΄μ€λ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ ν ν(row)μ λμλ©λλ€.
- μν°ν° ν΄λμ€λ
@Entity
μ΄λ Έν μ΄μ μΌλ‘ μ μΈλλ©°, ν μ΄λΈμ μ΄(column)μ ν΄λμ€μ νλλ‘ λ§€νλ©λλ€.
μμ
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters, Setters, Constructors
}
4. JPQL(Java Persistence Query Language).
- JPAλ JPQLμ΄λΌλ 쿼리 μΈμ΄λ₯Ό μ 곡νλ©°, μ΄λ₯Ό ν΅ν΄ λ°μ΄ν°λ² μ΄μ€μ μ§μλ₯Ό μνν μ μμ΅λλ€.
- JPQLμ SQLκ³Ό μ μ¬νμ§λ§, SQLμ΄ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ λμμΌλ‘ νλ λ°λ©΄, JPQLμ κ°μ²΄λ₯Ό λμμΌλ‘ κΆλ¦¬λ₯Ό μνν©λλ€.
- μ΄λ₯Ό ν΅ν΄ λ°μ΄ν°λ² μ΄μ€μ μ’ μλμ§ μκ³ κ°μ²΄ μ€μ¬μΌλ‘ λ°μ΄ν° μ‘°μμ΄ κ°λ₯ν©λλ€.
μμ
SELECT u FROM User u WHERE u.name = 'Kobe'
- μ JPQL 쿼리λ
User
μν°ν° κ°μ²΄λ₯Ό λμμΌλ‘ λ°μ΄ν°λ₯Ό μ‘°ννλ 쿼리μ λλ€.
5. νΈλμμ κ΄λ¦¬.
- JPAλ νΈλμμ μ κ΄λ¦¬νμ¬ λ°μ΄ν°λ² μ΄μ€ μμ μ μΌκ΄μ±κ³Ό μμ μ±μ 보μ₯ν©λλ€.
- νΈλμμ μ λ°μ΄ν°λ² μ΄μ€μμ μΌλ ¨μ μμ μ΄ λͺ¨λ μ±κ³΅νκ±°λ λͺ¨λ μ€ν΄νλ κ²μ 보μ₯νλ λ©μ»€λμ¦μΌλ‘, JPAλ μ΄λ₯Ό μλμΌλ‘ κ΄λ¦¬ν΄μ€λλ€.
- νΈλμμ μ΄ μλ£λλ©΄ JPAλ λ°μ΄ν°λ² μ΄μ€μ λͺ¨λ λ³κ²½ μ¬νμ λ°μνλ©°, λ¬Έμ κ° λ°μνλ©΄ λ‘€λ°±ν©λλ€.
πββοΈ νΈλμμ μ μλ―Έμ μν
6. μμμ± μ λ(Persistence Unit).
- μμμ± μ λμ JPAκ° λ°μ΄ν°λ² μ΄μ€μ μνΈμμ©νκΈ° μν΄ νμν μ€μ μ 보(λ°μ΄ν°λ² μ΄μ€ URL, μ¬μ©μ μ 보, λλΌμ΄λ² λ±)λ₯Ό λ΄κ³ μλ λ Όλ¦¬μ λ¨μμ λλ€.
- JPAλ μ΄ μμμ± μ λμ ν΅ν΄ λ°μ΄ν°λ² μ΄μ€μ μ°κ²°μ λ§Ίκ³ , νμν μμ μ μνν©λλ€.
- μμμ± μ λμ
persistence.xml
νμΌμ ν΅ν΄ μ€μ λλ©°, λ°μ΄ν°λ² μ΄μ€μμ μ°κ²° μ λ³΄κ° ν¬ν¨λ©λλ€.
7. μΊμ±.
- JPAλ μ±λ₯ μ΅μ νλ₯Ό μν΄ 1μ°¨ μΊμ±(μμμ± μ»¨ν μ€νΈμμ κ΄λ¦¬)μ 2μ°¨ μΊμλ₯Ό μ 곡ν©λλ€.
- 1μ°¨ μΊμλ νΈλμμ λ²μ λ΄μμ λμΌν μν°ν°λ₯Ό μ‘°νν λ λ€μ λ°μ΄ν°λ² μ΄μ€μ μ κ·Όνμ§ μκ³ μΊμλ κ°μ μ¬μ©ν©λλ€.
2οΈβ£ JPAμ μ₯μ .
1. λ°μ΄ν°λ² μ΄μ€ λ 립μ±.
- JPAλ λ°μ΄ν°λ² μ΄μ€μ μ’
μλμ§ μλ μΆμν κ³μΈ΅μ μ 곡νμ¬, νΉμ λ°μ΄ν°λ² μ΄μ€ λ²€λμ μμ‘΄νμ§ μκ³ μ½λλ₯Ό μμ±ν μ μμ΅λλ€.
- μ΄λ₯Ό ν΅ν΄ μ ν리μΌμ΄μ μ½λμ μ΄μμ±κ³Ό μ μ§λ³΄μμ±μ΄ λμμ§λλ€.
2. SQL μμ±μ λΆλ΄ κ°μ.
- JPAλ λ°μ΄ν°λ₯Ό μ‘°μνλ λ° νμν SQL 쿼리λ₯Ό μλμΌλ‘ μμ±ν©λλ€.
- κ°λ°μλ κ°μ²΄ μ§ν₯μ μΈ λ°©μμΌλ‘ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ©°, μ§μ SQLμ μμ±νλ λΆλ΄μ΄ μ€μ΄λλλ€.
3. κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°κ³Ό λ°μ΄ν°λ² μ΄μ€μ κ°κ·Ή ν΄μ.
- JPAλ μλ°μ κ°μ²΄ μ§ν₯ λͺ¨λΈκ³Ό κ΄κ³ν λ°μ΄ν°λ² μ΄μ€ κ°μ λΆμΌμΉλ₯Ό ν΄κ²°ν©λλ€.
- μλ° κ°μ²΄μ νλλ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ΄(Column)κ³Ό 맀ννκ³ , μλ° κ°μ²΄μ μν λ³νλ₯Ό λ°μ΄ν°λ² μ΄μ€μ μλμΌλ‘ λ°μν©λλ€.
4. νΈλμμ κ΄λ¦¬ μλν.
- JPAλ νΈλμμ κ΄λ¦¬λ₯Ό μλννμ¬ κ°λ°μκ° νΈλμμ λ²μλ₯Ό λͺ μνμ§ μμλ, λ°μ΄ν°λ² μ΄μ€ μμ μ μΌκ΄μ±μ μ μ§ν μ μλλ‘ λμμ€λλ€.
5. JPQLμ ν΅ν κ°μ²΄ μ€μ¬μ 쿼리.
- JPQLμ SQL λμ κ°μ²΄ λͺ¨λΈμ κΈ°λ°μΌλ‘ νλ 쿼리 μΈμ΄λ‘, SQLμ μ’ μλμ§ μκ³ κ°μ²΄ μ§ν₯μ μΌλ‘ λ°μ΄ν°λ₯Ό μ‘°νν μ μκ² ν΄μ€λλ€.
6. μΊμ±μ ν΅ν μ±λ₯ ν₯μ.
- JPAλ 1μ°¨ μΊμμ 2μ°¨ μΊμλ₯Ό ν΅ν΄ λ°μ΄ν°λ² μ΄μ€ μ κ·Ό νμλ₯Ό μ€μ΄κ³ , μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
3οΈβ£ JPA ꡬν체.
- JPAλ μΈν°νμ΄μ€μ κ·μ½λ§μ μ μνλ νμ€μ΄κΈ° λλ¬Έμ, μ€μ λ‘ λμνκΈ° μν΄μλ ꡬνμ²΄κ° νμν©λλ€.
- λνμ μΈ JPA ꡬν체λ‘λ λ€μκ³Ό κ°μ ORM(Object-Relational Mapping) νλ μμν¬λ€μ΄ μμ΅λλ€.
- Hibernate : κ°μ₯ λ리 μ¬μ©λλ JPA ꡬν체λ‘, JPAμ κΈ°λ₯μ ν¬ν¨νλ©΄μλ JPA μ΄μμ κΈ°λ₯λ€μ μ 곡ν©λλ€.
- EclipseLink : JPAμ λ νΌλ°μ€ ꡬν체λ‘, μλ° EE νκ²½μμ λ§μ΄ μ¬μ©λ©λλ€.
- OpenJPA : Apacheμμ μ 곡νλ JPA ꡬν체μ λλ€.
4οΈβ£ κ²°λ‘ .
- JPAλ μλ° μ ν리μΌμ΄μ μμ λ°μ΄ν°λ² μ΄μ€μμ μνΈμμ©μ λ μ½κ² λ§λ€κΈ° μν ORM(Object-Relational Mapping) νμ€μ λλ€.
- JPAλ₯Ό μ¬μ©νλ©΄ κ°μ²΄ μ§ν₯μ μΈ λ°©μμΌλ‘ λ°μ΄ν°λ² μ΄μ€ μμ μ μνν μ μμΌλ©°, λ°μ΄ν°λ² μ΄μ€ λ 립μ μΈ μ½λλ₯Ό μμ±ν μ μμ΅λλ€.
- λν, JPAλ νΈλμμ κ΄λ¦¬, μΊμ±, λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ μλ μμ± λ±μ κΈ°λ₯μ ν΅ν΄ κ°λ°μμκ² λ§μ νΈμμ±μ μ 곡ν©λλ€.
- JPAλ κ°λ°μκ° κ°μ²΄ λͺ¨λΈμ μ§μ€ν μ μκ² νλ©΄μλ λ°μ΄ν°λ² μ΄μ€μμ μνΈμμ©μ ν¨μ¨μ μΌλ‘ μ²λ¦¬ν μ μλλ‘ λμμ€λλ€.