JiwonDev

์Šคํ”„๋ง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๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ JPA EntityManager๊ฐ€ 1๊ฐœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

๋ฐ˜๋Œ€๋กœ, EntityManager๋ฅผ ํ•˜๋‚˜๋ฅผ ๋Œ๋ ค์“ฐ๋”๋ผ๋„ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๋‹ค๋ฅธ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

๋‚ด๋ถ€์ ์œผ๋กœ JPA EntityManager๊ฐ€ 2๊ฐœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 


๐Ÿ’ญ 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

ํ™œ๋™ํ•˜๊ธฐ