본문 바로가기
Develop/Spring

[querydsl] batch 성 거래 처리하기

by 코딩의성지 2021. 7. 8.

프로그램을 짜다보면 배치작업처럼 다량의 데이터가 업데이트 되거나 삭제되야하는 경우가 있다.

 

그런데 querydsl로 update 쿼리를 날리면 db의 상태와 영속성 컨택스트의 상태가 다른것을 확인할 수 있다.

영속성 컨택스트의 데이터는 그대로고 db만 값이 변경된다.

 

영속성 컨택스트의 1차 캐시와 동기화가 안되었기 때문이다. (JPA에서는 이를 Dirty Checking) 이라고 한다.

 

그래서 혹시나 내부에서 로직이 update이외에 다른게 있다면 꼭 영속성 컨택스트를 초기화 하는 과정을 넣어주는게 좋다.

 

long updateCnt = queryFactory
		.update(member)
		.set(member.userName, "babo")
		.set(member.age, member.age.add(1))
		.execute();

//영속성 컨택스트 초기화
em.flush();
em.clear();

List<Member> members = queryFactory
		.selectFrom(member)
		.fetch();

위 로직은 업데이트 후 조회하는 로직이들어가서 중간에 영속성 컨택스트를 초기화 해주지 않으면 db만 바뀌고 값의 출력은 바뀌지 않은 값이 그대로 출력된다.

 

만약에 아래 코드처럼 그냥 다 삭제하고 (업데이트도 마찬가지) 그 이후에 아무 로직도 없다면 따로 초기화를 안해줘도 된다.

public void allDelete() {
	long deleteCnt = queryFactory
		.delete(member)
		.execute();
}

반응형

댓글