JPA

JPA EntityManagerFactory, EntityManager๋Š” ์‚ฌ์šฉ ํ›„ ๊ผญ ๋‹ซ์•„์•ผ ํ•œ๋‹ค

devJK93 2024. 12. 5.

๐Ÿ“ JPA ๋ฆฌ์†Œ์Šค ๋ˆ„์ˆ˜๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ "๋ˆ„์ˆ˜"๋ž€, ์‚ฌ์šฉ๋œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ ์ ˆํžˆ ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ์ ์œ ๋˜๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ, ํŒŒ์ผ ํ•ธ๋“ค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์•„ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. JPA์—์„œ์˜ ๋ฆฌ์†Œ์Šค ๋ˆ„์ˆ˜๋ž€?

EntityManager์™€ EntityManagerFactory์˜ ์—ญํ• 

  • EntityManager:
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์„ธ์…˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ(Persistence Context)๋ฅผ ๊ด€๋ฆฌ.
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ ๋ฐ ์ข…๋ฃŒํ•ด์•ผ ํ•จ.
  • EntityManagerFactory:
    • EntityManager๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ณ ๋น„์šฉ ๊ฐ์ฒด.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€๊ณผ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์‹œ ๋ฐ˜๋“œ์‹œ ํ•ด์ œํ•ด์•ผ ํ•จ.

๋ฆฌ์†Œ์Šค ๋ˆ„์ˆ˜๋ž€?

  • EntityManager ๋ˆ„์ˆ˜: EntityManager๋ฅผ ๋‹ซ์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ์œ ์ง€๋˜์–ด ์—ฐ๊ฒฐ ํ’€์ด ๊ณ ๊ฐˆ๋  ์ˆ˜ ์žˆ์Œ.
  • EntityManagerFactory ๋ˆ„์ˆ˜: Factory๋ฅผ ๋‹ซ์ง€ ์•Š์œผ๋ฉด ์—ฐ๊ฒฐ ํ’€, ์บ์‹œ์™€ ๊ฐ™์€ ๊ณ ๋น„์šฉ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์•„ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋ฐ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜.

2. ๋ˆ„์ˆ˜๋กœ ์ธํ•œ ๋ฌธ์ œ

  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ (Memory Leak): EntityManagerFactory์™€ ๊ด€๋ จ๋œ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„ GC(Garbage Collector)๊ฐ€ ์ œ๊ฑฐํ•˜์ง€ ๋ชปํ•จ.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ˆ„์ˆ˜: ์—ฐ๊ฒฐ ํ’€์ด ๊ณ ๊ฐˆ๋˜์–ด ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†๊ฒŒ ๋จ.
  • ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ์ €ํ•˜: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ„์† ์ ์œ ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋จ.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ถฉ๋Œ: ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Œ.

3. ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€

1. EntityManager์™€ EntityManagerFactory์˜ ์ ์ ˆํ•œ ์ข…๋ฃŒ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์ด ๋๋‚œ ํ›„ ๋ฐ˜๋“œ์‹œ em.close()์™€ emf.close()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. try-finally ๊ตฌ์กฐ ์‚ฌ์šฉ

๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด try-finally ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:


EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();

try {
    EntityTransaction tx = em.getTransaction();
    tx.begin();

    Member member = new Member();
    member.setId(3L);
    member.setName("Steve");
    em.persist(member);

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

3. @PreDestroy๋ฅผ ํ™œ์šฉํ•œ ์ž๋™ ํ•ด์ œ

Spring ๋˜๋Š” Java EE ํ™˜๊ฒฝ์—์„œ๋Š” @PreDestroy๋ฅผ ํ™œ์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์‹œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. Pooled DataSource ์‚ฌ์šฉ

์—ฐ๊ฒฐ ํ’€์ด ๋ˆ„์ˆ˜๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์˜ค๋ž˜๋œ ์—ฐ๊ฒฐ์„ ๊ฐ•์ œ๋กœ ํ•ด์ œํ•˜๋„๋ก ์„ค์ •ํ•˜์„ธ์š”.

4. ๊ฒฐ๋ก 

  • JPA์—์„œ ๋ˆ„์ˆ˜๋Š” ์ฃผ๋กœ EntityManager์™€ EntityManagerFactory๋ฅผ ๋‹ซ์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ณ ๊ฐˆ, ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ญ์ƒ em.close()์™€ emf.close()๋ฅผ ํ˜ธ์ถœํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜์„ธ์š”.
  • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ซ๊ธฐ ์œ„ํ•ด try-finally ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ด ์›์น™์„ ๋”ฐ๋ฅด๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

๋Œ“๊ธ€