[์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ] 2์ฅ JPA ์์
๐ 2.3 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ก์ ํธ ๊ตฌ์กฐ
JPA ๊ตฌํ์ฒด๋ก ํ์ด๋ฒ๋ค์ดํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- hibernate-core: ํ์ด๋ฒ๋ค์ดํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- hibernate-entitymanager: ํ์ด๋ฒ๋ค์ดํธ๊ฐ JPA ๊ตฌํ์ฒด๋ก ๋์ํ๋๋ก๊ณ JPA ํ์ค์ ๊ตฌํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- hibernate-jpa-2.1-api: JPA 2.1 ํ์ค API๋ฅผ ๋ชจ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ 2.5 persistence.xml ์ค์
JPA๋ persistence.xml์ ์ฌ์ฉํด์ ํ์ํ ์ค์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํจ.
META-INF/persistence.xml ํด๋์ค ํจ์ค ๊ฒฝ๋ก์ ์์ผ๋ฉด ๋ณ๋ ์ค์ ์์ด JPA๊ฐ ์ธ์ํจ.
JPA ํ์ค ์์ฑ
- javax.persistence.jdbc.driver : JDBC ๋๋ผ์ด๋ฒ
- javax.persistence.jdbc.user: ๋ฐ๋ฒ ์ ์ ์์ด๋
- javax.persistence.jdbc.password: ๋ฐ๋ฒ ์ ์ ๋น๋ฐ๋ฒํธ
- javax.persistence.jdbc.url: ๋ฐ๋ฒ ์ ์ URL
ํ์ด๋ฒ๋ค์ดํธ ์์ฑ
- hibernate.dialect: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ ์ค์
2.5.1 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ
JPA๋ ํน์ ๋ฐ๋ฒ ์ ์ข ์์ ์ด์ง ์์ ๊ธฐ์ . ๊ทผ๋ฐ ๊ฐ ๋ฐ๋ฒ ๊ฐ ์ ๊ณตํ๋ SQL ๋ฌธ๋ฒ๊ณผ ํจ์๊ฐ ์กฐ๊ธ์ฉ ๋ค๋ฅด๋ค๋ ๋ฌธ์ .
SQL ํ์ค์ ์งํค์ง ์๊ฑฐ๋ ํน์ ๋ฐ๋ฒ ๋ง์ ๊ณ ์ ํ ๊ธฐ๋ฅ์ JPA์์๋ ๋ฐฉ์ธ์ด๋ผ ํจ.
JPA ๊ตฌํ์ฒด๋ค์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ ํด๋์ค๋ฅผ ์ ๊ณตํจ.
๐ 2.6 ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ
import javax.persistence.*;
import java.util.List;
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) {
tx.rollback(); //[ํธ๋์ญ์
] - ๋กค๋ฐฑ
} finally {
em.close(); //[์ํฐํฐ ๋งค๋์ ] - ์ข
๋ฃ
}
emf.close(); //[์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ] - ์ข
๋ฃ
}
//๋น์ฆ๋์ค ๋ก์ง
private static void logic(EntityManger em) {...}
}
ํฌ๊ฒ ์ํฐํฐ ๋งค๋์ ์ค์ , ํธ๋์ญ์ ๊ด๋ฆฌ, ๋น์ฆ๋์ค ๋ก์ง์ผ๋ก ๋๋จ.
2.6.1 ์ํฐํฐ ๋งค๋์ ์ค์
- ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ ์์ฑ
์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๋ฑ ํ ๋ฒ๋ง ์์ฑํ๊ณ ๊ณต์ ํด์ ์ฌ์ฉํด์ผ ํจ.
- ์ํฐํฐ ๋งค๋์ ์์ฑ
- ์ข ๋ฃ
2.6.2 ํธ๋์ญ์ ๊ด๋ฆฌ
JPA๋ฅผ ์ฌ์ฉํ๋ฉด ํญ์ ํธ๋์ญ์ ์์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํด์ผ ํจ. ํธ๋์ญ์ ์ ์์ํ๋ ค๋ฉด ์ํฐํฐ ๋งค๋์ ์์ ํธ๋์ญ์ API๋ฅผ ๋ฐ์์์ผ ํจ.
2.6.3 ๋น์ฆ๋์ค ๋ก์ง
๋ฑ๋ก, ์์ , ์ญ์ , ์กฐํ ์์ ์ ์ํฐํฐ ๋งค๋์ ๋ฅผ ํตํด์ ์ํํจ. ์ํฐํฐ ๋งค๋์ ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฐ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ฒ๋ผ ๋ณด์.
2.6.4 JPQL
//๋ชฉ๋ก ์กฐํ
TypedQuery<Member> query =
em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
JPA๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ ๊ฐ๋ฐ์๋ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ๊ณ ๋ฐ๋ฒ ์ ๋ํ ์ฒ๋ฆฌ๋ JPA์๊ฒ ๋งก๊น.
๋ฑ๋ก, ์์ , ์ญ์ , ํ ๊ฑด ์กฐํ๋ฅผ ํ ๋ SQL์ ์ ํ ์ฌ์ฉํ์ง ์์.
๋ฌธ์ ๋ ๊ฒ์์์ JPA๋ ์ํฐํฐ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ๋ฏ๋ก ๊ฒ์ํ ๋๋ ํ ์ด๋ธ ์๋ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๊ฒ์ํด์ผ ํจ.
-> ๋ฐ์ด๋ธ ์๋ ์ํฐํฐ ๊ฐ์ฒด ๋์ ๊ฒ์ํ๋ฉด ๋ฐ๋ฒ ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฑ์ผ๋ก ๋ถ๋ฌ์์ ์ํฐํฐ ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํ ๋ค์ ๊ฒ์ํด์ผ ํ๋๋ฐ ์ด๋ ๋ถ๊ฐ๋ฅํ ์ผ์.
์ฑ์ด ํ์ํ ๋ฐ์ดํฐ๋ง ๋ฐ๋ฒ ์์ ๋ถ๋ฌ์ค๋ ค๋ฉด ๊ฒฐ๊ตญ ๊ฒ์ ์กฐ๊ฑด์ด ํฌํจ๋ SQL์ ์ฌ์ฉํด์ผ ํ๋๋ฐ, JPA๋ JPQL์ด๋ผ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ก ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํจ.
JPA๋ SQL์ ์ถ์ํํ JPQL์ด๋ผ๋ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ ๊ณตํจ. SQL๊ณผ ๊ฑฐ์ ์ ์ฌํ์ง๋ง
- JPQL์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๊ถ๋ฆฌํจ. ํด๋์ค์ ํ๋๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ.
- SQL์ ํ ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋์์ผ๋ก ์ฟผ๋ฆฌํจ.
์ ์์ ์ select m from Member m ์์ from Member๋ ํ์ ์ํฐํฐ ๊ฐ์ฒด์ด์ง MEMBER ํ ์ด๋ธ์ด ์๋.
JPQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ ํ ์์ง ๋ชปํจ.
em.createQuery, query.getResultList()ํ๋ฉด JPA๋ JPQL์ ๋ถ์ํด์
SELECT M.ID, M.NAME, M.AGE FROM MEMBER M ๊ณผ ๊ฐ์ด ์ ์ ํ SQL ๋ง๋ค์ด ๋ฐ๋ฒ ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํจ.