개발을 본격적으로 들어가기 전에 기존에 보던 인강을 마무리하고 개발에 들어가고 싶어서 강의록을 가지고 이해하고 이해가 안되는 부분만 인강을 보는 식으로 빨리 진행하였다.
그러던중 동적 query에 대한 부분이 있었는데, 이 부분에 대해서 자세히 나오지 못해 아쉬웠다. 강의록에 있던 것은 JPQL이나 JPA Criteria 로 처리하는 것이었는데, 두 방법 다 한계가 있었다. 주로 동적 query를 위해 사용되는 QueryDSL에 대해서는 간단히 설명하고 다음 파트로 넘어가서 간단하게라도 QueryDSL을 공부해보기로 했다. (프로젝트에서도 검색, 즉 동적쿼리가 사용될 예정이다)
JPQL이나 JPA Criteria는 너무 복잡하고, 구현하기도 어렵다는 단점이 있었다.
대응책인 QueryDSL은 자바 코드로 sql query를 작성하게 해준다는 점에서 컴파일 시 오류를 잡는 등의 장점이 있었다.
다음은 각각 chatgpt가 짜준 JPQL 과 QueryDSL 이다.
(조건 검색 (나이가 20 이상인 회원 조회))
//JPQL
String jpql = "SELECT m FROM Member m WHERE m.age >= :age";
List<Member> members = em.createQuery(jpql, Member.class)
.setParameter("age", 20)
.getResultList();
//QUERYDSL
List<Member> members = queryFactory
.selectFrom(QMember.member)
.where(QMember.member.age.goe(20)) // greater or equal (>=)
.fetch();
JPQL은 문자열로 쿼리를 만들어내고 QueryDSL은 자바 코드로 쿼리가 작성된다.
그리고 jpql보다 sql에 더 가까운 형태를 띄고 있기에 직관적이다. (select문, where문등)
또한 자바로 작성되기에 IDE의 도움을 받는 등의 이점을 얻을 수 있다.
gradle 설정, Q클래스, BooleanBuilder등 단순히 jpql을 사용하는 것보다는 많은 설정이 필요하지만, 개발자의 실수를 잡기 어렵고 구현이 어려운 것보다는 나은 선택이라고 생각한다.
프로젝트 내에서 검색 기능이 있어서 어떻게 구현이 되는지 궁금했는데 이런 방식으로 구현될 수 있다는 것을 알았다.
이제는 진짜 개발을 미룰 수 없다. 내가 맡은 부분인 크롤링, db관리, 카카오 소셜 로그인등을 위해 더 열심히 공부하고 진행해야겠다는 생각이다.