JPA

[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ] 2์žฅ JPA ์‹œ์ž‘

joaa 2023. 6. 4. 09:36

๐ŸŽˆ 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 ๋งŒ๋“ค์–ด ๋ฐ๋ฒ ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•จ.