๐ 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
๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ธ์.
์ด ์์น์ ๋ฐ๋ฅด๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ์ ์ผ๋ก ์คํ๋ ๊ฒ์ ๋๋ค!
'JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA ์ํฐํฐ์ ๊ฐ์ฒด์งํฅ์ ์ค๊ณ (0) | 2024.12.09 |
---|---|
JPA PK ์์ฑ์ ๋ต @GeneratedValue(strategy = GenerationType.โ) (0) | 2024.12.09 |
JPA ๊ตฌ๋๋ฐฉ์ (0) | 2024.12.05 |
hibernate entitymanager ์์กด์ฑ (0) | 2024.12.05 |
em.persist vs em.merge (1) | 2024.11.30 |
๋๊ธ