๐Ÿ“š [JPA] #2. JPA ์‹œ์ž‘ํ•˜๊ธฐ

์ด๊ฐ€์€ยท2024๋…„ 5์›” 9์ผ
0

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
8/13
post-thumbnail

๐Ÿ“• Hello JPA - ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

๐Ÿ“– ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฉ์–ธ (dialect)

  • JPA๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ข…์†๋˜์ง€ ์•Š์Œ
  • ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” SQL ๋ฌธ๋ฒ•๊ณผ ํ•จ์ˆ˜๋Š” ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฆ„
    • ๊ฐ€๋ณ€ ๋ฌธ์ž: MySQL์€ VARCHAR, Oracle์€ VARCHAR2
    • ๋ฌธ์ž์—ด์„ ์ž๋ฅด๋Š” ํ•จ์ˆ˜: SQL ํ‘œ์ค€์€ SUBSTRING(), Oracle์€ SUBSTR()
    • ํŽ˜์ด์ง•: MySQL์€ LIMIT , Oracle์€ ROWNUM
  • ๋ฐฉ์–ธ: SQL ํ‘œ์ค€์„ ์ง€ํ‚ค์ง€ ์•Š๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งŒ์˜ ๊ณ ์œ ํ•œ ๊ธฐ๋Šฅ
  • persistence.xml๋‚ด hibernate.dialect ์†์„ฑ์— ์ง€์ •ํ•œ๋‹ค
    • H2 : org.hibernate.dialect.H2Dialect
    • Oracle 10g : org.hibernate.dialect.Oracle10gDialect
    • MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
    <properties>
    	<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
    </properties>

๐Ÿ“™ Hello JPA - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ

๐Ÿ“– JPA ๊ตฌ๋™ ๋ฐฉ์‹

  1. persistence ํด๋ž˜์Šค์—์„œ ์‹œ์ž‘ํ•œ๋‹ค.
  2. persistence.xml ์„ค์ • ์ •๋ณด๋ฅผ ์ฝ์–ด์„œ ์ฝ์€ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ EntityManagerFactory ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  3. EntityManagerFactory ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค EntityManager๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ž‘๋™ํ•œ๋‹ค.

๐Ÿ“– JPA ๊ตฌ๋™ ๋ฐฉ์‹

๐ŸŽˆ ๊ฐ์ฒด, ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ณ  ๋งคํ•‘

@Entity //JPA๊ฐ€ ๊ด€๋ฆฌํ•  ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์คŒ
public class Member {
    @Id //DB์˜ PK์™€ ๋งคํ•‘
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

@Entity : JPA๊ฐ€ ๊ด€๋ฆฌํ•  ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์คŒ
@Id : DB์˜ PK์™€ ๋งคํ•‘

create table Member (
	id bigint not null,
 	name varchar(255),
 	primary key (id)
);

๐ŸŽˆ ํšŒ์› ๋“ฑ๋ก
โ—ฝ EntityManagerFactory๋Š” JPA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ EntityManager ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
โ—ฝ EntityManager๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•˜๊ณ  ์—”ํ„ฐํ‹ฐ์˜ ์˜์†์„ฑ์„ ์ œ์–ดํ•œ๋‹ค.

public class JpaMain {
    public static void main(String[] args) {
        //persistence ํด๋ž˜์Šค๊ฐ€ persistence.xml์„ ์ฝ๊ณ , EntityManagerFactory ์ƒ์„ฑ
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        //EntityManagerFactory๊ฐ€ EntityManager๋ฅผ ์ƒ์„ฑ
        EntityManager em = emf.createEntityManager();
        
        EntityTransaction tx = em.getTransaction(); //ํŠธ๋žœ์žญ์…˜ ์ถ”๊ฐ€
        tx.begin();

       try {
           Member member = new Member();
           member.setId(3L);
           member.setName("HelloC");

           em.persist(member);

           tx.commit();
       } catch(Exception e) {
           tx.rollback();
       } finally {
           em.close();
       }
        emf.close();
    }
}

โ—ฝ EntityManagerFactory๋Š” ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ๊ณต์œ ํ•œ๋‹ค.
โ—ฝ EntityManager๋Š” ์“ฐ๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค. (์‚ฌ์šฉํ•˜๊ณ  ๋ฒ„๋ ค์•ผ ํ•œ๋‹ค)
โ—ฝ JPA์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
โ—ฝ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜์„ ROLLBACK ํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ, ๋ฌธ์ œ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด EntityManager๋ฅผ ๋‹ซ์•„์„œ DB Connection์„ ์ข…๋ฃŒํ•ด์•ผ ํ•œ๋‹ค.

๐ŸŽ ํšŒ์› ๋“ฑ๋ก ์‹คํ–‰ ํ™”๋ฉด

๐ŸŽˆ ํšŒ์› ๋‹จ๊ฑด ์กฐํšŒ

try {
	Member findMember = em.find(Member.class, 1L);

	System.out.println("findMember.id = " + findMember.getId());
	System.out.println("findMember.name = " + findMember.getName());

	tx.commit();
} catch(Exception e) {
	tx.rollback();
} finally {
	em.close();
}

๐ŸŽ ํšŒ์› ๋‹จ๊ฑด ์กฐํšŒ ์‹คํ–‰ ํ™”๋ฉด

๐ŸŽˆ ํšŒ์› ์‚ญ์ œ

try {
	Member findMember = em.find(Member.class, 3L);
	em.remove(findMember);

	tx.commit();
} catch(Exception e) {
	tx.rollback();
} finally {
	em.close();
}

๐ŸŽ ํšŒ์› ์‚ญ์ œ ์‹คํ–‰ ํ™”๋ฉด

๐ŸŽˆ ํšŒ์› ์ˆ˜์ •

try {
	Member findMember = em.find(Member.class, 1L);
	findMember.setName("HelloJPA");

	tx.commit();
} catch(Exception e) {
	tx.rollback();
} finally {
	em.close();
}

๐ŸŽ ํšŒ์› ์ˆ˜์ • ์‹คํ–‰ ํ™”๋ฉด

โ—ฝ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋“ฏ์ด DB๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
โ—ฝ JPA๋ฅผ ํ†ตํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒฝ์šฐ JPA์—์„œ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜ ์‹œ์ ์— ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ UPDATE ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

๐Ÿ“– JPQL ์†Œ๊ฐœ

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์กฐํšŒ ๋ฐฉ๋ฒ•
โ—ฝ EntityManager.find()
โ—ฝ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰(a.getB().getC())

โ“ ๋‹จ์ˆœํ•œ ์กฐํšŒ ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ ์กฐ๊ฑด์„ ๋ถ€์—ฌํ•ด์„œ ๋‚˜์ด๊ฐ€ 18์‚ด ์ด์ƒ์ธ ํšŒ์›์„ ๋ชจ๋‘ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? ๋ชจ๋“  ํšŒ์›์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?
โ— ์ด๋Ÿด ๋•Œ JPQL์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์ˆ˜์˜ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŽˆ ํšŒ์› ๋‹ค์ˆ˜ ์กฐํšŒ

try {
	List<Member> result = em.createQuery("select m from Member as m", Member.class).getResultList();

	for (Member member : result) {
		System.out.println("member.name = " + member.getName());
	}

	tx.commit();
} catch(Exception e) {
	tx.rollback();
} finally {
	em.close();
}

๐ŸŽ ํšŒ์› ๋‹ค์ˆ˜ ์กฐํšŒ ์‹คํ–‰ ํ™”๋ฉด

JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ
โ—พ ๋ฌธ์ œ๋Š” ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ์ธ๋ฐ, JPA๋Š” ๊ฒ€์ƒ‰์„ ํ•  ๋•Œ๋„ ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
โ—พ ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  DB ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
โ—พ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ DB์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋ ค๋ฉด ๊ฒฐ๊ตญ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ํฌํ•จ๋œ SQL์ด ํ•„์š”ํ•˜๋‹ค.

JPQL
โ—พ JPA๋Š” SQL์„ ์ถ”์ƒํ™”ํ•œ JPQL์ด๋ผ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด ์ œ๊ณตํ•œ๋‹ค.
โ—พ SQL๊ณผ ๋ฌธ๋ฒ• ์œ ์‚ฌ, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN ์ง€์›
โ—พ JPQL์€ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ
โ—พ SQL์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ
โ—พ ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์ฟผ๋ฆฌ
โ—พ SQL์„ ์ถ”์ƒํ™”ํ•ด์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค SQL์— ์˜์กดํ•˜์ง€ ์•Š์Œ
โ—พ JPQL์„ ํ•œ๋งˆ๋””๋กœ ์ •์˜ํ•˜๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ SQL

๐Ÿ“š ์ฐธ๊ณ ์ž๋ฃŒ

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ

profile
๊ฐ€๋ฟก์ด์˜ ๊ณต๋ถ€ ์ƒ์ž๐Ÿ“ฆ

0๊ฐœ์˜ ๋Œ“๊ธ€