본문 바로가기

CS 잡지식

필드값에 대해서는 동시성 문제의 발생 유무를 꼭 확인하자!

@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개 이상의 쓰레드가 접근을 해보리면, 데이터 불일치 등의 문제가 생길 수

가 있다. 메서드는 메모리의 코드 영역에서 공유하면서 사용해도 문제가 없으므로, 동시성 문제가 없다.)