sql = “Select * from a ~~” → 쿼리문은 결국 문자열이다!
프로그램 빌드는 잘 되겠지만 실행해보기 전까지 api가 잘 작동하는 지 알 수가 없다!! → 즉 타입추론이 안된다!!
런타임 에러임! → 가장 좋은 에러는 컴파일 에러로써 개발하는 와중에 계속 고칠 수 있으면 너무 좋다!
그래서 나온 것이 QueryDsl → 쿼리를 Java로 type-safe하게 개발할 수 있게 지원하는 프레임워크
주로 JPA(JPQL)에서 사용!
QueryDsl은 자바 컴파일 시에, 즉 프로젝트 시작시에 루트파일의 /build에 Q파일을 만들고 그 Q파일을 활용한다! github에는 안올리는 거 추천!! .gitignore에 자동으로 잘 추가된다고는 하나 확인하자!

많은 사람들이 Intellij버전, QueryDsl의 gradle 버전차이로 초반 설정에 애를 먹고, 실제로 QueryDsl의 초반 설정이 어려운 편에 속한다고 한다!(휴 나만 그런게 아니었구나…!) 잘 안되면 구글에 “query dsl”을 쳐서 자신의 버전에 따른 설정을 꼭 완성하자!
자세한 내용은 QueryDsl 강의에서 더 배우겠지만, QueryDsl의 강점을 나타내는 코드 봐보자!
아래의 findAll() 코드를 보면 굉장히 한눈에 보기 좋게 JPQL문을 적용한 것을 볼 수 있다!
    import static hello.itemservice.domain.QItem.*;
    
    @Override
    public List<Item> findAll(ItemSearchCond cond) {
        String itemName = cond.getItemName();
        Integer maxPrice = cond.getMaxPrice();
        return query
                .select(item)
                .from(item)
                .where(likeItemName(itemName), maxPrice(maxPrice))
                .fetch();
    }
    private BooleanExpression likeItemName(String itemName) {
        if (StringUtils.hasText(itemName)) {
            return item.itemName.like("%" + itemName + "%");
        }
        return null;
    }
    private BooleanExpression maxPrice(Integer maxPrice) {
        if (maxPrice != null) {
            return item.price.loe(maxPrice);
        }
        return null;
    }
장점은 다음과 같다.