@SpringBootTest
@Transactional
public class QuerydslBasicTest {
@Autowired
EntityManager entityManager;
JPAQueryFactory queryFactory; // 이 필드값에 여러 쓰레드가 접근을 하면 동시성(concurrency) 문제가 생기지 않는가?
// -> 동시성 문제가 생기지 않도록 코딩이 돼 있다!!
@BeforeEach
void beforeEach(){
queryFactory = new JPAQueryFactory(entityManager);
//이하 생략
}
@Test
void startQuerydslV2(){
QMember m = new QMember("m");
//queryFactor는 필드에서 선언하고, beforEach()에서 주입함.
Member member1 = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1")) //파라미터 바인딩 처리
.fetchOne();
assertThat(member1.getUsername()).isEqualTo("member1");
}
이런 고민을 할 수가 있다.
Q. JpaQueryFactory에 여러 쓰레드가 접근을 하게 되면, 동시성 문제가 생기지는 않을까??
A. 강사 왈 : 동시성 이슈가 생기지 않도록 코딩이 돼 있다고 한다.
자세한 내용은 JPA 책을 봐야 하겠지만,
"현재 내 트랜잭션이 어디에 걸려 있는지에 따라서, 쓰레드마자 JpaQueryFactory를 분배한다"라고 한다.
(필드값이라는 것은 항상 동시성 이슈를 고려해야 한다. 만약에 MemberRepository라는 싱글톤 객체 안에 존재하는
필드값 username이 있다고 하면, 그거에 대해 2개 이상의 쓰레드가 접근을 해보리면, 데이터 불일치 등의 문제가 생길 수
가 있다. 메서드는 메모리의 코드 영역에서 공유하면서 사용해도 문제가 없으므로, 동시성 문제가 없다.)
'CS 잡지식' 카테고리의 다른 글
Querydsl 사용 템플릿 (0) | 2023.05.17 |
---|---|
EntityManager에 대한 동시성(concurrency) 문제 (0) | 2023.05.17 |
show_sql: true와 format_sql, 2개 중 하나만 사용하자! (0) | 2023.05.17 |
Native Query(Spring Data Interface Projection 지원) (0) | 2023.05.15 |
page = 1, page_size(limit) = 10의 의미! (0) | 2023.05.15 |