본문 바로가기

Spring

(5)
QueryMethod는 어떻게 만들어지는 것일까? SpringDataJpa를 사용하다보면 QueryMethod를 만들어서 데이터베이스에 쿼리를 자주 날리게 된다. 그럼 어떻게 SpringDataJpa는 메소드명만 갖고 쿼리를 날리는것일까? 1. 일단 SpringDataJpa는 해당 메소드가 쿼리메소드인지, 아니면 커스텀메소드인지 구분을 한다. 2-1. 커스텀 메소드일 경우엔 해당 메소드를 바로 실행시킨다. 2-2. 쿼리메소드일 경우에는 쿼리메소드의 이름을 갖고 파싱하게 됩니다. 그럼 어떤 방식으로 파싱을 하게 되는것인가? 일단 findBy나 orderBy와 같은 접두어들은 메소드에서 분리시키고 나머지 부분을 파싱하게 됩니다. findByUserName을 예를 들어 설명하자면 findBy는 분리시키고 UserName만 따로 파싱을 한 후 쿼리를 만든다고합..
JPQL의 특징 JPQL이란? 객체지향 쿼리 언어로써 엔티티에 대한 쿼리를 만드는데 사용된다. 이번에 알게된 PQL의 특징은? 1) JPQL은 사용되기전 flush를 한번 한 후 사용된다 그 이유는 영속성 컨텍스트와 DB사이의 데이터 차이가 있을수도 있기때문에 그렇다고한다. + QueryDSL이나 Criteria같은 JPQL 빌더들도 flush를하고 쿼리를 날린다. 2) JPQL을 통해 가져온 데이터는 영속성컨텍스트에 저장이 된다. 만약 영속성 컨텍스트에 저장된 데이터를 똑같이 가져왔으면 가져온 데이터를 버린다 3) JPQL을 사용하면 영속성 컨텍스트에 들렸다가 없을경우 DB로 가는 것이 아니라 바로 DB로 냅다 직행한다. 즉 바로 JPQL을 SQL로 변환하기 때문에 내가 엔티티에 설정한 어노테이션인 LAZY와 같은게 ..
QueryDSL은 왜 Q-Class를 사용할까? QueryDSl로 개발을 하려면 Q-Class를 이용해 개발을 해야 한다. Q-Class와 같은걸 만들어 사용하는 방식이 처음이라 그런지 왜 굳이 이런 방식으로 사용하는거지? 라는 궁금증이 생기게 되었다. 그래서 이러한 궁금증을 내 나름대로 해결하여 한번 정리해보려고한다. Q-Class는 어떻게 생성되는것일까? Q-Class의 생성은 컴파일 시점이다. JPAAnnotationProcessor라는 친구가 컴파일 시점에 작동을 하는데, 해당 APT가 @Entity와 @Embeddable과 같은 어노테이션을 찾는다. 그 후 해당 내용들을 분석하여 Q-Class들을 생성하게 된다. 이때 APT는 Q-Class을 생성할때 Entity-Class와 최대한 비슷한 패키지 구조를 유지하려고 한다. 그럼 왜 QueryD..
QueryDSL 삽질기 QueryDSL을 이용해서 전체리스트를 뿌려주는 쿼리를 작성하고 있었고, 해당 쿼리는 페이징이 들어가야했다. 작성을 완료한 후! 잘되었겠지 하고 실행 ... postman으로 요청을 보냈다... BUT ,,,, expectin CLOSE, found '(' ... 내가 잘못 작성을 한 것 일까? 다시 한번 보았지만 이상한 부분은 없었다. 무슨 문제가 있는거지 열심히 검색을 하였다. 일단 내가 작성한 쿼리에는 GroupBy 가 들어가 있고, 페이징에 전체 리스트의 갯수를 구하기위해 fetchCount() 를 실행한 쿼리였다. 그러다 발견한 글은 https://github.com/querydsl/querydsl/issues/1614 JPA fetchCount() and group by not working ..
SpringDataJPA에서 Custom 할때 지켜야하는 규칙 s최근 프로젝트에서 QueryDSL을 적용한 후 실행시켰을때 아래와 같은 문제가 발생하면서 작동이 되지 않는 문제가 있었다. No property search found for type ********! 이유는 네이밍 규칙 때문에 발생한 오류였다 SpringDataJpa가 제공하는것 외의 QueryMethod를 사용하려면 SpringDataJPA가 정한 규칙을 따라야한다 . 그 규칙은 바로 { reposiotory 명 + Impl } 과 같은 방식으로 네이밍을 하는 것이다. 허나 나의 경우에는 바보같이 UserCheckRepositoryImpl이 맞는 네이밍이라면 UserRepositoryImpl 로 작성을 하여 발생한 버그 였다 그럼 왜 SpringDataJPA는 위와 같은 네이밍 규칙을 갖는것일까? ..