์คํ๋งJPA์ ์์์ฑ์ปจํ ์คํธ (EntityManager)
by JiwonDev๐ญ JPA (ํ์ด๋ฒ๋ค์ดํธ)์ ์์์ฑ ์ปจํ ์คํธ
JPA์์ ์์์ฑ ์ปจํ ์คํธ๋ DB์์ ๊ฐ์ ธ์จ ์ํฐํฐ๋ฅผ ์ ์ฅํ๋ ์ฒซ๋ฒ์งธ ๋ฉ๋ชจ๋ฆฌ ์บ์ ์ ์ฅ์์ ๋๋ค.์ด๋ฅผ EntityManager ๊ฐ์ฒด์ API๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์์์ฑ ์ปจํ ์คํธ๋ 2๊ฐ์ง ์ค์ฝํ ํ์ ์ ๊ฐ์ง๋๋ค.
- Transcation-scoped ์์์ฑ ์ปจํ ์คํธ
- Extended-scoped ์์์ฑ ์ปจํ ์คํธ
๐ Transcation-scoped ์์์ฑ ์ปจํ ์คํธ
Transcation-scope๋ ํธ๋์ญ์ ์ ๋ฐ์ธ๋ฉ๋๊ณ , ํธ๋์ญ์ ์ด ๋๋ ๋ ์์์ฑ ์ปจํ ์คํธ์ ๋ชจ๋ ๋ด์ฉ์ด flush ๋ฉ๋๋ค.
EntityManager๋ ํ์ฌ ํธ๋์ญ์
์์ ์์์ฑ ์ปจํ
์คํธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์กด์ฌํ๋ค๋ฉด ์ฌ์ฌ์ฉํ๊ณ , ์๋ค๋ฉด ์๋ก ๋ง๋ญ๋๋ค.
์ฌ๊ธฐ์ ํต์ฌ์ '๊ฐ์ ํธ๋์ญ์
'์์ ์ฌ์ฌ์ฉํ๋ค๋ ๊ฒ๋๋ค. ํธ๋์ญ์
์ด ๋ค๋ฅด๋ฉด ๋น์ฐํ ์์์ฑ ์ปจํ
์คํธ๋ ๋ค๋ฆ
๋๋ค.
- DB์ ๋ํ ๋ณ๊ฒฝ์ฌํญ์, ํ์ฌ ํธ๋์ญ์ ์ด ๋๋๋ ์์ ์ ์ ๋ถ flushํฉ๋๋ค.
@PersistenceContext
private EntityManager entityManager;
๐ Extended-scoped ์์์ฑ ์ปจํ ์คํธ
์์์ฑ ์ปจํ ์คํธ๊ฐ ์ฌ๋ฌ ํธ๋์ญ์ ์ ๊ฑธ์ณ์์ ์ ์์ต๋๋ค.๋ค๋ง, ๋ฉ๋ชจ๋ฆฌ์์์ ์ํฐํฐ ์ ์งํ ๋ฟ ํธ๋์ญ์ ์ด ์๋ค๋ฉด DB์ flush๋ ๋น์ฐํ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๐งจ ์ฐธ๊ณ ๋ก ์ด๋ Hybernate์ Open Session In View(OSIV) ๊ธฐ๋ฅ๊ณผ ๊ด๋ จ ์์ต๋๋ค.
- DB์ ๋ํ ๋ณ๊ฒฝ์ฌํญ์ flush ํ์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์๋ค๊ฐ, ๋ค์ ํ์ฑ ํธ๋์ญ์ ์ด ์์๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
- ์ค๋ ๋์ ์์ ํ์ง ์์ต๋๋ค. ๋น์ฐํ EntityManager ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํ(๊ณต์ )ํ ์ ์์ต๋๋ค.
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;
๊ทธ๋ ๋ค๋ฉด ์คํ๋ง์์ ์ฌ์ฉํ๋ EntityManager๋ ์ด๋จ๊น์?์ด๋ ๊ฒ ์คํ๋ง ์ฑ๊ธํค ๋น์ผ๋ก ๋ฑ๋กํ๊ณ ๋ง ์ฌ์ฉํด๋ ๋ฌธ์ ๊ฐ ์๋๊ฑฐ๋ณด๋, Extended-scoped๋ก ์ฌ์ฉํ๋๊ฑธ๊น์?
๐ ์ ๋ต : ์คํ๋ง JPA๋ Transaction-scoped ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ ๋ค๋๊ฑด, ํธ๋์ญ์ ์ด ๋๋๋ฉด EntityManager๋ ์์ด์ ธ์ผํ ํ ๋ฐ, ์ด๋ป๊ฒ ์ฑ๊ธํค์ผ๋ก ์ ์งํ๊ณ ์ฌ์ฉํ๋๊ฑธ๊น์?
์ฐธ๊ณ ๋ก ์คํ๋ง์ ์ฑ๊ธํค ๊ฐ์ฒด๋ ์ฑ ์คํ์์ ์ ์์ฑ๋๊ณ , ์ข ๋ฃ๋ ๋๊น์ง ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ ์งํฉ๋๋ค.
@Bean
JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
// ..??? EntityManger๋ฅผ ๊ทธ๋ฅ ๋ฐ์๋ฒ๋ฆฌ๋๋ฐ..? ์ด๊ฑฐ ์ฑ๊ธํค์๋์ผ?
return new JPAQueryFactory(entityManager);
}
๊ทธ ๋น๋ฐ์ ํ๋ก์์ ์์ต๋๋ค.
์ฑ๊ธํค์ผ๋ก ๋ฑ๋ก๋ [์คํ๋ง์ EntityManager]๋ [JPA์ EntityManager]์ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋๋๋ค.์ด๋ ๊ฐ์ง ํ๋ก์ ๊ฐ์ฒด๋ก, ํธ๋์ญ์ ๋จ์๋ก ์ ์ ํ๊ฒ EntityManager๋ฅผ ํธ์ถํ์ฌ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๊ณต์ ํฉ๋๋ค.
๋ฐ๋๋ก, EntityManager๋ฅผ ํ๋๋ฅผ ๋๋ ค์ฐ๋๋ผ๋ ํธ๋์ญ์ ๋จ์๋ก ๋ค๋ฅธ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๐ญ JpaQueryFactory๋ ์ฑ๊ธํค ๋น์ผ๋ก ์ฌ์ฉํด๋ ๋ฉ๋๋ค.
QueryDsl์ JPAQueryFactory๋ EntityManager์ 1:1๊ด๊ณ๋ฅผ ๊ฐ์ง๋๋ค.
๊ทธ๋์ ์ฑ๊ธํค์ผ๋ก ๋ง๋ค๋ฉด ๋์์ฑ ๋ฌธ์ ๊ฐ ์๊ธธ ๊ฒ ๊ฐ์ง๋ง, ์ฌ์ค ์ฌ๊ธฐ์ ์ฃผ์ ๋๋๊ฑด ์คํ๋ง์ ํ๋ก์ ๊ฐ์ฒด์ ๋๋ค.
@Bean // ์ฑ๊ธํค์ผ๋ก ๋ฑ๋ก
JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
// ์ด EntityManager๋ ํ๋ก์ ๊ฐ์ฒด์
๋๋ค.
// ํ๋ก์๋ ํ์ฌ ํธ๋์ญ์
์ ์ฌ์ฉ์ค์ธ ์์์ฑ ์ปจํ
์คํธ์ ์ฐ๊ฒฐ์์ผ์ค๋๋ค.
return new JPAQueryFactory(entityManager);
}
ํ๋ก์ ๊ฐ์ฒด(EntityManager)๋ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋์ง๋ง,
ํด๋น ํ๋ก์ ๊ฐ์ฒด ๋ด๋ถ์์ ํ์ฌ ํธ๋์ญ์ ์ ๋ง๊ฒ ์ ์ ํ ์์์ฑ ์ปจํ ์คํธ์ ์ฐ๊ฒฐ์์ผ์ค๋๋ค. ๋์์ฑ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก ๋น์ผ๋ก ๋ฑ๋กํ์ง์๊ณ , ์๋์ ๊ฐ์ด ์ฌ์ฉํ์ ๋ ๋ฉ๋๋ค.
์ด์ฐจํผ ์ฑ๊ธํค ๊ฐ์ฒด๋ ์คํ๋ง ์ปจํ ์ด๋ ์ด๊ธฐํ์์ ์ ๋ฑ ํ๋ฒ ๋ง๋ค์ด์ง๋ฏ๋ก, ์๋์ ๊ฐ์ด ์์ฑ์์์ ๋ง๋ค์ด๋ ๋ฉ๋๋ค.
@Repository
public class MemberJpaRepository {
private final EntityManager entityManager;
private final JPAQueryFactory jpaQueryFactory;
public MemberJpaRepository(EntityManager entityManager) {
this.entityManager = entityManager;
this.jpaQueryFactory = new JPAQueryFactory(entityManager);
}
}
'๐ฑBackend > JDBC & JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring DB ๊ธฐ์ ํํค์น๊ธฐ #1 (1) | 2023.12.31 |
---|---|
JDBC Connection ์ ๋ํ ์ดํด, HikariCP ์ค์ ํ (0) | 2023.11.21 |
QueryDSL + JPA (0) | 2022.02.02 |
Spring Data JPA (0) | 2022.01.31 |
JPA ์ฑ๋ฅ ๊ฐ์ ํ (0) | 2022.01.22 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev