본문 바로가기

Spring

JPQL의 특징

JPQL이란?

 

객체지향 쿼리 언어로써 엔티티에 대한 쿼리를 만드는데 사용된다.

 

이번에 알게된 PQL의 특징은?

 

1) JPQL은 사용되기전 flush를 한번 한 후 사용된다 그 이유는 영속성 컨텍스트와 DB사이의 데이터 차이가 있을수도 있기때문에 그렇다고한다.

+ QueryDSL이나 Criteria같은 JPQL 빌더들도 flush를하고 쿼리를 날린다.

 

2) JPQL을 통해 가져온 데이터는 영속성컨텍스트에 저장이 된다. 만약 영속성 컨텍스트에 저장된 데이터를 똑같이 가져왔으면 가져온 데이터를 버린다

 

3)  JPQL을 사용하면 영속성 컨텍스트에 들렸다가 없을경우 DB로 가는 것이 아니라 바로 DB로 냅다 직행한다.

즉 바로 JPQL을 SQL로 변환하기 때문에 내가 엔티티에 설정한 어노테이션인 LAZY와 같은게 전부 무시한 채로 DB에 쿼리를 날린다

 

 

 

 

 

정말로 3번이 그런지 궁금해서 SimpleJpaRepository에 있는 findAll() 메소드를 까보기로 하였다.

 

	@Override
	public List<T> findAll(@Nullable Specification<T> spec) {
		return getQuery(spec, Sort.unsorted()).getResultList();
	}

 

findAll 메소드에 들어가게 되면 getQuery로 향하게 된다.  그럼  getQuery를 들어가보자.

 

	protected TypedQuery<T> getQuery(@Nullable Specification<T> spec, Sort sort) {
		return getQuery(spec, getDomainClass(), sort);
	}

 

 

리턴 타입이 typedQuery인 것을 보니 JPQL을 이용해서 쿼리를 날리는것을 볼 수 있다.

 

 

 

 

그럼 왜 findAll은 JPQL로 쿼리를 날리는 것일까?

 

그냥 내가 추측하기에는,,, findAll의 경우에는 모든 데이터를 가져와야 한다. 그런데 영속성 컨텍스트에서 변경된 데이터가 있을수도 있으니 한번 flush를 하고 가져와야한다고 생각한다. 그런데 마침 JPQL을 사용하면 일단 flush를 하고 쿼리를 날리도록 하니 JPQL로 작성된거지 않을까 싶다 ( 아닐 수도 ,,, )