Chapter 02 _ JPA μμ
π©π» μμ μ½λ
GitHub - holyeye/jpabook
Contribute to holyeye/jpabook development by creating an account on GitHub.
github.com
1οΈβ£ μ΄ν΄λ¦½μ€ μ€μΉμ νλ‘μ νΈ λΆλ¬μ€κΈ°
β‘οΈ λμ κ²½μ° νμ νλ μμν¬μΈ Intellij λ₯Ό μ¬μ©νκΈ°λ‘ νλ€.
2οΈβ£ H2 λ°μ΄ν°λ² μ΄μ€ μ€μΉ
β μ΅μ λ²μ μ€μΉ (2023.04.15 κΈ°μ€ 2.1.214 λ²μ μ€μΉ)
H2 Database Engine
H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2.5 MB jar file size Supp
www.h2database.com
β‘ μμΆ νΌ ν ν°λ―Έλ μ€νbin/h2.sh
λͺ
λ Ήμ΄ μν (κΆν μ€λ₯ λ κ²½μ° chmod +x bin/h2.sh
μν ν μ¬μλ)
β‘οΈ μ΄μ (μ μλΆκ°)μ΄μ
'User/<μ¬μ©μμ΄λ¦>/test' κ²½λ‘μ νμΌμ΄ μ‘΄μ¬νμ§ μλλ€λ μ€λ₯κ° λ°μνλ€.λ¬Έμ
h2 1.4.198 λ²μ λΆν°λ 보μμμ μ΄μ λ‘ database νμΌμ΄ μλμΌλ‘ μμ±λμ§ μμ μ§μ μμ±ν΄μ£Όμ΄μΌνλ€κ³ νλ€.ν΄κ²°
ν΄λΉ κ²½λ‘μ ν°λ―Έλμμ vi test.mv.db
λͺ
λ Ήμ΄λ₯Ό ν΅ν΄ νμΌμ μμ±ν ν μ μνμλλ μ±κ³΅νμλ€.
β£ μμ ν μ΄λΈ μμ±
CREATE TABLE MEMBER (
ID VARCHAR(255) NOT NULL,
NAME VARCHAR(255),
AGE INTEGER NOT NULL,
PRIMARY KEY (ID)
)
3οΈβ£ λΌμ΄λΈλ¬λ¦¬μ νλ‘μ νΈ κ΅¬μ‘°
β‘οΈ κ°λ¨ν ꡬ쑰 μ΄μΌκΈ°λ λμ΄κ°λλ‘ νμ.
4οΈβ£ κ°μ²΄ λ§€ν μμ
β‘οΈ 2οΈβ£ μμ λ§λ€μλ MEMBER ν μ΄λΈκ³Ό Member Class λ₯Ό λ§€ννλ κ³Όμ μ νμΈνλ€.
β H2 μ½μμμ MEMBER ν μ΄λΈ μμ± (2οΈβ£μμ λ§λ€μλ€λ©΄ μλ΅)
β‘ νλ μ μν¬μμ Member ν΄λμ€ μμ±
import javax.persistence.*; // μ΄λ
Έν
μ΄μ
@Entity
@Table(name="MEMBER")
public class Member {
@Id
@Column(name = "ID")
private String id;
@Column(name = "NAME")
private String username;
private Integer age;
// Getter μ Setter μ μ½λ μλ΅
}
β’ κ΄λ ¨ μ΄λ Έν μ΄μ μ 리
- @Entity : μ΄ ν΄λμ€λ₯Ό ν μ΄λΈκ³Ό λ§€ννλ€κ³ JPA μκ² μλ €μ€λ€.
- @Table : Entity ν΄λμ€μ λ§€νν ν μ΄λΈ μ 보λ₯Ό μλ €μ€λ€. μ΄ μ΄λ Έν μ΄μ μ μλ΅νλ©΄ ν΄λμ€ μ΄λ¦μ ν μ΄λΈ μ΄λ¦μΌλ‘ μ¬μ©νλ€.
- @Id : Entity ν΄λμ€μ ν΄λΉ νλλ₯Ό ν
μ΄λΈμ PK(Primary Key) μ λ§€ννλ€. ν΄λΉ νλλ₯Ό
μλ³μ νλ
λΌκ³ νλ€. - @Column : νλλ₯Ό 컬λΌμ λ§€ννλ€.
- λ§€ν μ λ³΄κ° μλ νλ : λ§€ν μ΄λ Έν μ΄μ μ μλ΅νλ©΄ νλλͺ μ μ¬μ©ν΄μ 컬λΌλͺ μΌλ‘ λ§€ννλ€. μ€μ μ λ°λΌ λμλ¬Έμλ₯Ό ꡬλ³ν μ μμΌλ―λ‘ μ£Όμνμ¬μΌνλ€.
π£ JPA μ΄λ Έν μ΄μ μ ν¨ν€μ§λ javax.persistence μ΄λ€.
5οΈβ£ persistence.xml μ€μ
β‘οΈ Maven μμμ persistence.xml νμΌμ Gradle μ application.properties νμΌκ³Ό κ°μ μν μ νλ€κ³ μκ°νλ©΄ λ κ² κ°λ€.
β«οΈ JPA νμ€ μμ±
- javax.persistence.jdbc.driver : JDBC λλΌμ΄λ²
- javax.persistence.jdbc.user : λ°μ΄ν°λ² μ΄μ€ μ μ μμ΄λ
- javax.persistence.jdbc.password : λ°μ΄ν°λ² μ΄μ€ μ μ λΉλ°λ²νΈ
- javax.persistence.jdbc.url : λ°μ΄ν°λ² μ΄μ€ μ μ URL
β«οΈ νμ΄λ²λ€μ΄νΈ μμ±
-hibernate.dialect : λ°μ΄ν°λ² μ΄μ€ λ°©μΈ μ€μ
β λ°μ΄ν°λ² μ΄μ€ λ°©μΈ
β‘οΈ JPA λ νΉμ λ°μ΄ν°λ² μ΄μ€μ μ’ μμ μ΄μ§ μμ κΈ°μ μ΄λ€. λ°λΌμ SQL, H2 λ±μ κ°μ μ‘°κΈμ© λ€λ₯Έ ννλ€μ μ¬μ©νλ―λ‘ μ€μ μ μ¬μ©νλ λ°μ΄ν°λ² μ΄μ€λ₯Ό λͺ μν΄μ£Όμ΄μΌνλ€.
6οΈβ£ μ ν리μΌμ΄μ κ°λ°
public class JpaMain {
public static void main(String[] args) {
// β μ€ν°ν° λ§€λμ μ€μ
// μν°ν° λ§€λμ ν©ν 리 μμ±
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager(); //μν°ν° λ§€λμ μμ±
EntityTransaction tx = em.getTransaction(); //νΈλμμ
κΈ°λ₯ νλ
// β‘ νΈλμμ
κ΄λ¦¬
try {
tx.begin(); //νΈλμμ
μμ
logic(em); //λΉμ¦λμ€ λ‘μ§
tx.commit();//νΈλμμ
컀λ°
} catch (Exception e) {
e.printStackTrace();
tx.rollback(); //νΈλμμ
λ‘€λ°±
} finally {
em.close(); //μν°ν° λ§€λμ μ’
λ£
}
emf.close(); //μν°ν° λ§€λμ ν©ν 리 μ’
λ£
}
// β’ λΉμ§λμ€ λ‘μ§
public static void logic(EntityManager em) { ... }
}
β‘οΈ μ½λλ ν¬κ² 3λΆλΆμΌλ‘ λλμ΄μ§λ€.
- μν°ν° λ§€λμ μ€μ
- νΈλμμ κ΄λ¦¬
- λΉμ¦λμ€ λ‘μ§
β μν°ν° λ§€λμ μ€μ
(1) μν°ν° λ§€λμ ν©ν 리 μμ±
β‘οΈ persistence.xml νμΌ μ€μ μ λ°νμΌλ‘ μ€ν°ν° λ§€λμ ν©ν 리λ₯Ό μμ±νλ€. μν°ν° λ§€λμ ν©ν 리λ μ ν리μΌμ΄μ
μ 체μμ λ± νλ²λ§ μμ±νκ³ κ³΅μ ν΄μ μ¬μ©ν΄μΌνλ€. (μ±κΈν€
ν¨ν΄)
(2) μν°ν° λ§€λμ μμ±
β‘οΈ JPA κΈ°λ₯ λλΆλΆμ μν°ν° λ§€λμ κ° μ 곡νλ€. μν°ν° λ§€λμ λ₯Ό μ¬μ©ν΄μ λ°μ΄ν°λ² μ΄μ€μ CRUD ν μ μλ€.
β μν°ν° λ§€λμ λ λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ κ³Ό λ°μ ν κ΄κ³κ° μμΌλ―λ‘ μ€λ λκ°μ 곡μ νκ±°λ μ¬μ¬μ©νλ©΄ μ λλ€.
β‘οΈ μ¬μ©μ΄ λλ μν°ν° λ§€λμ μ λ§€λμ ν©ν 리λ μ’ λ£ν΄μΌνλ€.
β‘ νΈλμμ κ΄λ¦¬
β‘οΈ JPA λ₯Ό μ¬μ©νλ €λ©΄ νμ νΈλμμ μμμ λ°μ΄ν°λ₯Ό λ³κ²½ν΄μΌνλ€. νΈλμμ μ μμνκΈ° μν΄μλ μν°ν° λ§€λμ μμ νΈλμμ API λ₯Ό λ°μμμΌνλ€.
β‘οΈ νΈλμμ
API λ₯Ό μ¬μ©ν΄μ λΉμ¦λμ€ λ‘μ§μ΄ μ μ λμνλ©΄ νΈλμμ
μ 컀λ°
νκ³ μμΈκ° λ°μνλ©΄ λ‘€λ°±
νλ€.
β’ λΉμ¦λμ€ λ‘μ§
β‘οΈ μν°ν° λ§€λμ λ₯Ό ν΅ν΄ λ°μ΄ν°λ² μ΄μ€μ CRUD νλ€.
β«οΈ JPQL
JPQL : JPA κ° μ 곡νλ SQL μ μΆμνν κ°μ²΄μ§ν₯ 쿼리 μΈμ΄. μν°ν° κ°μ²΄ (ν΄λμ€, νλ) λ₯Ό λμμΌλ‘ 쿼리문μ μννκΈ° λλ¬Έμ JPQL μ ν μ΄ν°λ² μ΄μ€λ₯Ό μ ν μμ§ λͺ»νλ€.
β‘οΈ JPA λ μν°ν° κ°μ²΄λ₯Ό μ€μ¬μΌλ‘ κ°λ°νλ―λ‘ κ²μμ ν λλ ν μ΄λΈμ΄ μλ μν°ν° κ°μ²΄λ₯Ό λμμΌλ‘ κ²μν΄μΌνλ€. μ΄λ₯Ό μν΄μλ λ°μ΄ν°λ² μ΄μ€μ λͺ¨λ λ°μ΄ν°λ₯Ό μ ν리μΌμ΄μ μΌλ‘ λΆλ¬μμ μν°ν° κ°μ²΄λ‘ λ³κ²½ν λ€μ κ²μν΄μΌνμ§λ§, μ¬μ€μ μ΄λ λΆκ°λ₯νλ€.
SELECT m FROM Member m
β‘οΈ μ¬κΈ°μ Member λ MEMBER ν
μ΄λΈ
μ΄ μλ νμ μν°ν° κ°μ²΄
λ₯Ό μλ―Ένλ€.
7οΈβ£ μ 리
β‘οΈ JPA κ° λ°λ³΅μ μΈ JDBC API μ κ²°κ³Ό κ° λ§€νμ μ²λ¦¬ν΄μ€ λλΆμ μ½λλκ³Ό SQL μμ±μ΄ μ€μ΄λ€μλ€.
'JPA π' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JPA] μλ° ORM νμ€ JPA νλ‘κ·Έλλ° Ch.5 (1) | 2023.05.19 |
---|---|
[JPA] μλ° ORM νμ€ JPA νλ‘κ·Έλλ° Ch.4 (0) | 2023.05.08 |
[JPA] μλ° ORM νμ€ JPA νλ‘κ·Έλλ° Ch.3 (0) | 2023.05.05 |
[JPA] μλ° ORM νμ€ JPA νλ‘κ·Έλλ° Ch.1 (0) | 2023.04.07 |