728x90
- (Java JPA) JPAQueryFactory를 필드로 제공할 때, 동시성 문제
- (As-is) → 기존 JPAQueryFactory를 메소드 안에 생성한 버전
@SpringBootTest
@Transactional
public class QuerydslBasicTest {
@PersistenceContext
EntityManager em;
@Test
public void startQuerydsl() {
JPAQueryFactory queryFactory = new JPAQueryFactory(em); //JPAQueryFactory를 메소드 안에 생성
QMember m = new QMember("m");
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1"))//파라미터 바인딩 처리
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
- 소스 설명
- EntityManager 로 JPAQueryFactory 생성한 후,
- 기존에는 메소드 안에 JPAQueryFactory객체를 생성하였습니다.
- (To-Be) → JPAQueryFactory를 필드에 정의한 버전
@SpringBootTest
@Transactional
public class QuerydslBasicTest {
@PersistenceContext
EntityManager em;
JPAQueryFactory queryFactory; //JPAQueryFactory을 필드에 정의
@BeforeEach
public void before() {
queryFactory = new JPAQueryFactory(em);
//…
}
@Test
public void startQuerydsl2() {
//JPAQueryFactory가 공통 필드에 정의됨 -> 테스트가 여러개일 때, 생략 가능!!
QMember m = new QMember("m");
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
}
- JPAQueryFactory를 필드에 정의하면 위 소스와 같습니다.
- 여러 메소드에서 호출할 때, 동시성 문제는?
- 동시성 문제는 JPAQueryFactory를 생성할 때 제공하는 EntityManager(em)에 달려있습니다.
- 스프링 프레임워크는 여러 쓰레드에서 동시에 같은 EntityManager에 접근해도, 트랜잭션 마다 별도의 영속성 컨텍스트를 제공하기 때문에, 동시성 문제는 걱정하지 않아도 됩니다(스프링 프레임워크 차원에서 해결됨).
- 여러 메소드에서 호출할 때, 동시성 문제는?
728x90
'JPA' 카테고리의 다른 글
queryDsl 기본 조인에 대해 (0) | 2022.02.14 |
---|---|
Q클래스 인스턴스 사용 방법 두가지 (0) | 2022.02.14 |
JPQL과 QueryDSL의 차이 (0) | 2022.02.14 |
쿼리 힌트란? (feat. 예제) (0) | 2022.02.14 |
JPA Auditing으로 생성시간/수정시간 자동화하기 (0) | 2022.02.14 |