JPA

Transactional(section 2)

challnum 2022. 8. 5. 22:41
๐Ÿ“– Transactional์˜ ์ดํ•ด
package hellojpa; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
@Entity 
@Getter
@Setter
public class Member { 
	@Id 
	private Long id; 
	private String name;  
}
๐Ÿ“– ๊ธฐ๋ณธ ์ ์ธ JPA์˜ ์‹คํ–‰ ๋™์ž‘์›๋ฆฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทธ๋ฆผ์œผ๋กœ ์ž‘๋™๋œ๋‹ค. Persistence๋ผ๋Š” ํด๋ž˜์Šค์—์„œ ์‹œ์ž‘์„ ํ•œ ํ›„ ์„ค์ • ์ •๋ณด๋ฅผ ์กฐํšŒ ํ•œ ํ›„ EntityManagerFactory๋ฅผ ์ƒ์„ฑํ•œํ›„ ๋™์ž‘์ด ์žˆ์„๋•Œ๋งˆ๋‹ค EntityManager๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋จผ์ € JPA๋ฅผ ์ด์šฉํ•˜์—ฌ Entity๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๋ฉด Transactional์„ ์ปค๋ฐ‹ํ•˜๋Š” ์‹œ์ ์— ์ฒดํฌ ํ•œ ํ›„ ๋ณ€๊ฒฝ์ ์ด ์žˆ๋‹ค๋ฉด uptade์ปค๋ฐ‹์„ ๋งŒ๋“ค์–ด ๋‚ ๋ฆฌ๊ณ  Transactional์„ ์ปค๋ฐ‹ํ•œ๋‹ค.

JPA ์ž‘๋™ ๋ฐฉ์‹

  • [ ] ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ํŒฉํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑ์‹œ์— DB์—ฐ๊ฒฐ์ด ๋œ๋‹ค.
  • [ ] ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ํŒฉํ† ๋ฆฌ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ์ ์— ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
  • [ ] ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ํ•˜๋‚˜์˜ Transactional(db connection์ด๋‚˜ db์˜ ๋ณ€๊ฒฝ์ ์ด ์ƒ๊ธธ๋•Œ๋งˆ๋‹ค)์„ ์ง„ํ–‰์‹œ์— ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
  • [ ] ๊ทธ๋ฆฌ๊ณ  Transactional์„ ์‹คํ–‰ ํ›„ ๊ฐ’์„ ์ง„ํ–‰ํ•œ๋‹ค.
  • [ ] ์ œ์ผ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ์ž๋ฐ” ์ปฌ๋ ‰์…˜์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ๋‚ด ์ž๋ฐ” ์ปฌ๋ ‰์…˜์„ ๋Œ€์‹  ์ €์žฅํ•ด์ฃผ๋Š” ์—ญํ™œ์„ ํ•ด์ค€๋‹ค.
package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

//        DB์˜ ์ปค๋„ฅ์…˜์„ ํ•˜๋‚˜ ์–ป์€ ๊ฒƒ์ด๋‹ค.
        EntityManager em = emf.createEntityManager();
//        Transaction ์‹œ์ž‘
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        Member member = new Member();
        member.setId(1L);
        member.setName("helloA");
//      JPA์ €์žฅ
        em.persist(member);
//      commit
        tx.commit();

        em.close();
        emf.close();
    }
}
๐Ÿ’ก ์ถœ๋ ฅ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™์œผ๋ฉฐ DB๋ฅผ ์กฐํšŒ ํ•˜๊ฒŒ ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜์Œ์—๋„ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋“ค์ด DB์— ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค.
<property name="hibernate.show_sql" value="true"/> : ์ฟผ๋ฆฌ์˜ ๊ฐ’์ด ์‹ค์ œ๋กœ ์ถœ๋ ฅ์ด ๋˜๊ฒŒ ํ•˜๋Š” ๊ตฌ๋ฌธ
<property name="hibernate.format_sql" value="true"/> : ์ฟผ๋ฆฌ๋ฅผ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํฌ๋ฉงํŒ…ํ•œ ๊ตฌ๋ฌธ
<property name="hibernate.use_sql_comments" value="true"/> : ์ฟผ๋ฆฌ๊ฐ€ ๋‚˜์˜จ ์ด์œ ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ตฌ๋ฌธ ์ฃผ์„ ์ฒ˜๋ฆฌ ๋œ ๋ถ€๋ถ„
Hibernate: 
    /* insert hellojpa.Member
        */ insert 
        into
            Member
            (name, id) 
        values
            (?, ?)


ํ•˜์ง€๋งŒ ์ด๋Ÿด ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ƒํ™ฉ์— ๋Œ€์ฒ˜ ํ•  ์ˆ˜ ์—†๊ธฐ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ •์„์ด๋‹ค.

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

//        DB์˜ ์ปค๋„ฅ์…˜์„ ํ•˜๋‚˜ ์–ป์€ ๊ฒƒ์ด๋‹ค.
        EntityManager em = emf.createEntityManager();
//        Transaction ์‹œ์ž‘
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
            Member member = new Member();
            member.setId(2L);
            member.setName("helloB");
//      JPA์ €์žฅ
            em.persist(member);
//      commit
            tx.commit();
        } catch (Exception e){
            tx.rollback();
        } finally {
//            EntityManager๊ฐ€ DB์ปค๋„ฅ์…˜์„ ๋ฌผ๊ณ  ๋™์ž‘ํ•˜๊ธฐ์— ์‚ฌ์šฉ์„ ํ•˜๊ณ  ๋‹ซ์•„์ค˜์•ผ ํ•œ๋‹ค.
            em.close();
        }
        emf.close();
    }
}

ํšŒ์› ์ˆ˜์ •

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

//        DB์˜ ์ปค๋„ฅ์…˜์„ ํ•˜๋‚˜ ์–ป์€ ๊ฒƒ์ด๋‹ค.
        EntityManager em = emf.createEntityManager();
//        Transaction ์‹œ์ž‘
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
            Member findMember = em.find(Member.class, 1L);
            System.out.println(findMember.getId());
            System.out.println(findMember.getName());
//      commit
            tx.commit();
        } catch (Exception e){
            tx.rollback();
        } finally {
//            EntityManager๊ฐ€ DB์ปค๋„ฅ์…˜์„ ๋ฌผ๊ณ  ๋™์ž‘ํ•˜๊ธฐ์— ์‚ฌ์šฉ์„ ํ•˜๊ณ  ๋‹ซ์•„์ค˜์•ผ ํ•œ๋‹ค.
            em.close();
        }
        emf.close();
    }
}
๐Ÿ’ก ์ถœ๋ ฅ๊ฐ’ : ์กฐํšŒ์‹œ์— select์ฟผ๋ฆฌ๊ฐ€ ์ž๋™์ ์œผ๋กœ ๋‚ ์•„๊ฐ€๋ฉฐ ๊ฐ’์„ ๋“ค๊ณ  ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
Hibernate: 
    select
        member0_.id as id1_0_0_,
        member0_.name as name2_0_0_ 
    from
        Member member0_ 
    where
        member0_.id=?
1
helloA

ํšŒ์› ์‚ญ์ œ

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

//        DB์˜ ์ปค๋„ฅ์…˜์„ ํ•˜๋‚˜ ์–ป์€ ๊ฒƒ์ด๋‹ค.
        EntityManager em = emf.createEntityManager();
//        Transaction ์‹œ์ž‘
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
            Member findMember = em.find(Member.class, 1L);
            
						em.remove(findMember);
//      commit
            tx.commit();
        } catch (Exception e){
            tx.rollback();
        } finally {
//            EntityManager๊ฐ€ DB์ปค๋„ฅ์…˜์„ ๋ฌผ๊ณ  ๋™์ž‘ํ•˜๊ธฐ์— ์‚ฌ์šฉ์„ ํ•˜๊ณ  ๋‹ซ์•„์ค˜์•ผ ํ•œ๋‹ค.
            em.close();
        }
        emf.close();
    }
}

ํšŒ์› ์‚ญ์ œ

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

//        DB์˜ ์ปค๋„ฅ์…˜์„ ํ•˜๋‚˜ ์–ป์€ ๊ฒƒ์ด๋‹ค.
        EntityManager em = emf.createEntityManager();
//        Transaction ์‹œ์ž‘
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
            Member findMember = em.find(Member.class, 1L);
            findMember.setName("helloJPA");
            
            //      commit
            tx.commit();
        } catch (Exception e){
            tx.rollback();
        } finally {
//            EntityManager๊ฐ€ DB์ปค๋„ฅ์…˜์„ ๋ฌผ๊ณ  ๋™์ž‘ํ•˜๊ธฐ์— ์‚ฌ์šฉ์„ ํ•˜๊ณ  ๋‹ซ์•„์ค˜์•ผ ํ•œ๋‹ค.
            em.close();
        }
        emf.close();
    }
}
์ถœ๋ ฅ ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜ค๋ฉฐ ์ปฌ๋ ‰์…˜์ฒ˜๋Ÿผ ํ™œ์šฉ์„ ํ•˜๊ธฐ์— ์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋œ๋‹ค. JPA๋ฅผ ํ†ตํ•ด Entity๋ฅผ ๋“ค๊ณ  ์˜ค๊ฒŒ ๋˜๋ฉด JPA๊ฐ€ Transactional์„ ์ปค๋ฐ‹ํ•˜๋Š” ์‹œ์ ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๊ฒŒ ๋œ๋‹ค. ๋ณ€๊ฒฝ์ ์ด ์žˆ์„ ์‹œ์— ์ž๋™์ ์œผ๋กœ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ง์ „์— UPDATE์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
Hibernate: 
    select
        member0_.id as id1_0_0_,
        member0_.name as name2_0_0_ 
    from
        Member member0_ 
    where
        member0_.id=?
Hibernate: 
    /* update
        hellojpa.Member */ update
            Member 
        set
            name=? 
        where
            id=?

์ฃผ์˜ ์‚ฌํ•ญ

  1. ์›น ์„œ๋ฒ„๊ฐ€ ์˜ฌ๋ผ์˜ค๋Š” ์‹œ์  DB๋‹น EntityManagerFactory ๋Š” ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ์ด ๋œ๋‹ค.
  2. EntityManager ๋Š” ๊ณ ๊ฐ์˜ ์š”์ฒญ์ด ์˜ฌ ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
  3. EntityManager ๋Š” ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ๊ณต์œ  ํ•  ์ˆ˜ ์—†๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ๋ฒ„๋ ค์•ผ ํ•œ๋‹ค.
  4. JPA์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์€ Transaction ์•ˆ์—์„œ๋งŒ ์‹คํ–‰๋œ๋‹ค.
๐Ÿ’ก JPQL : ๋งŽ์€ Table์ค‘์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์–ด๋–ป๊ฒŒ ์กฐํšŒ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ํ•ด๊ฒฐํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹

  1. ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰์„ ํ•ด์„œ ๋“ค๊ณ  ์™€์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ…Œ์ด๋ธ”์„ ๊ฒ€์ƒ‰์‹œ์— ๋ฌธ๋ฒ•์ด ์–ด๊ธ‹๋‚˜๋ฏ€๋กœ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฒ€์ƒ‰์„ ํ•ด์•ผ ํ•œ๋‹ค.
  2. ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ํฌํ•จ๋œ SQL์ด ํ•„์š”ํ•œ๋ฐ ์‹ค์ œ ๋ฌผ๋ฆฌ์ ์ธ ํ…Œ์ด๋ธ”์ธ RDB์— ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฐ๋‹ค๋ฉด ํ•ด๋‹น ๋””๋น„์— ์ข…์†์ ์ธ ์„ค๊ณ„๊ฐ€ ๋˜๋ฒ„๋ฆฐ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์ œ๊ณต๋œ๋‹ค.

๐Ÿ’ก ์‹คํ–‰์‹œ์— ํ˜„์žฌ ๋ฐ์ดํ„ฐ์— ๋งž๋Š” ์ ์ ˆํ•œ ์ฟผ๋ฆฌ๋ฌธ์ด ์ƒ์„ฑ๋œ๋‹ค.

๐Ÿ—’๏ธํ•ต์‹ฌ ๋‚ด์šฉ

  1. ๋ชจ๋“  ๋ณ€๊ฒฝ์€ Transaction ์•ˆ์—์„œ ์‹คํ–‰๋˜๋ฉฐ ์กฐํšŒ ๊ฐ™์€ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ๋Š” Transaction ์„ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„(์•„์ด์†”๋ ˆ์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ์•ˆ ๋ ์ง€๋„ ๋ชจ๋ฅธ๋‹ค ์ด ๋ถ€๋ถ„ ์œ„ํ—˜)์ž˜ ์ž‘๋™ํ•œ๋‹ค. Transaction ์‹œ์ž‘๊ณผ ์ปค๋ฐ‹์„ ๋‹ด๋‹นํ•œ๋‹ค.
  2. Transaction commit์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฐ˜์˜์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
  3. EntityManager ๋Š” ํ•˜๋‚˜์˜ ๋™์ž‘์ด ๋๋‚ ์‹œ ๋‹ซ๊ณ  ๋‹ค๋ฅธ ๋™์ž‘์ด ๋ฐœ์ƒ์‹œ ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.
  4. WAS๊ฐ€ ๋‚ด๋ ค๊ฐˆ ๊ฒฝ์šฐ ManagerFactory ๋ฅผ ๋‹ซ์•„์ค˜์•ผ๋งŒ ์ปค๋„ฅ์…˜ํ’€๋ง ๊ฐ™์€ ๋ถ€๋ถ„์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•ด์ฒด๋˜๊ฒŒ ๋œ๋‹ค.

์ถœ์ฒ˜ : https://inf.run/spjG