You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
이렇게 되는데 눈에 잘 들어오지 않음.
단점 : type-safe 아님, 복잡함, 알아야 할게 너무 많음.
Type-safe 해결해주기 위해 뭔가 더 만들었으나, 여전히 복잡함.
Querydsl 소개2- 해결
Domain
Specific
Language
-> 도메인 특화 언어
특정 도메인에 초점을 맞춘 제한적인 표현력을 가진 컴퓨터 프로그래밍 언어
특징 : 단순, 간결, 유창
QueryDSL : 쿼리에 초점을 맞춤!
DB 에 상관없이, 모든 쿼리 기능을 추상화 해보겠다!
-> JPA, MongoDB, SQL 같은 기술을 위해 type-safe SQL 을 만다는 프레임워크
타입세이프한 쿼리를 작성하려면, 코드가 필요함.
JPA의 경우엔 엔티티에서 정보를 뽑아내고, 코드생성기가 돌아서 쿼리용 객체를 만듦
Member 엔티티 -> QMember 객체 생성
이객체로 쿼리를 작성할 수 있도록 해준다?
여러 디비도 가능하지만, 사실 QueryDSL 은 JPA 를 위해서 만들어짐
전강의에서 했던 같은 조회를 해보자.
Member 엔티티를 통해
이런 객체가 만들어짐.
이걸 통해서 SQL 이 만들어짐
작동 방식:
QueryDSL 작성하면, 이게 먼저 JPQL 로 생성됨.
이후 하이버네이트가 실행할 때 SQL 로 번역해서 실행함.
결국 QueryDSL 에서 JPQL 로 바꿔주는 빌더임.
결국 JPQL 을 알아야 제대로 사용할 수 있음.
장점 : type-safe, 단순, 쉬움
단점 : Q 코드 생성을 위한 APT 설정이 복잡함
Querydsl 설정
bulid.gradle 에 추가
//Querydsl 추가implementation'com.querydsl:querydsl-jpa:5.0.0:jakarta'annotationProcessor"com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"annotationProcessor"jakarta.annotation:jakarta.annotation-api"annotationProcessor"jakarta.persistence:jakarta.persistence-api"//Querydsl 추가, 자동 생성된 Q클래스 gradle clean으로 제거clean {
deletefile('src/main/generated')
}
환경에 따라 조금씩 달라서 확인은 필요.
추가적인 작업
Gradle 로 빌드할떄
Task> build > clean 을 통해 과거에 gradle 설정 초기화
Task>other > compileJava 를 해줘야함
그러면 Q 파일이 생성되는것 확인 가능.
참고: Q타입은 컴파일 시점에 자동 생성되므로 버전관리(GIT)에 포함하지 않는 것이 좋다.
gradle 옵션을 선택하면 Q타입은 gradle build 폴더 아래에 생성되기 때문에 여기를 포함하지 않아야 한다. 대부분 gradle build 폴더를 git에 포함하지 않기 때문에 이 부분은 자연스럽게 해결된다.
Task> build > clean 하면 Q 파일 삭제됨.
IntelliJ 로 빌드할떄
Build -> Build Project 또는 Build -> Rebuild 또는 main() , 또는 테스트를 실행하면 된다.
마찬가지로 이 경로도 git 에 포함하지 않는것이 좋다.
지우는 방법 : gradle 에서 설정함.
참고
Querydsl은 이렇게 설정하는 부분이 사용하면서 조금 귀찮은 부분인데, IntelliJ가 버전업 하거나 Querydsl의 Gradle 설정이 버전업 하면서 적용 방법이 조금씩 달라지기도 한다. 그리고 본인의 환경에 따라서 잘 동작하지 않기도 한다. 공식 메뉴얼에 소개 되어 있는 부분이 아니기 때문에, 설정에 수고로움이 있지만 querydsl gradle 로 검색하 면 본인 환경에 맞는 대안을 금방 찾을 수 있을 것이다.
공통
Querydsl을 사용하려면 JPAQueryFactory 가 필요하다. JPAQueryFactory 는 JPA 쿼리인 JPQL을 만들 기 때문에 EntityManager 가 필요하다.
설정 방식은 JdbcTemplate 을 설정하는 것과 유사하다.
참고로 JPAQueryFactory 를 스프링 빈으로 등록해서 사용해도 된다.
findAllOld
Querydsl을 사용해서 동적 쿼리 문제를 해결한다. BooleanBuilder 를 사용해서 원하는 where 조건들을 넣어주면 된다.
이 모든 것을 자바 코드로 작성하기 때문에 동적 쿼리를 매우 편리하게 작성할 수 있다.
findAll
앞서 findAllOld 에서 작성한 코드를 깔끔하게 리팩토링 했다. 다음 코드는 누가 봐도 쉽게 이해할 수 있을 것이다.
List<Item> result = query
.select(item)
.from(item)
.where(likeItemName(itemName), maxPrice(maxPrice))
.fetch();
Querydsl에서 where(A,B) 에 다양한 조건들을 직접 넣을 수 있는데, 이렇게 넣으면 AND 조건으로 처리된다. 참고로 where() 에 null 을 입력하면 해당 조건은 무시한다.
이 코드의 또 다른 장점은 likeItemName() , maxPrice() 를 다른 쿼리를 작성할 때 재사용 할 수 있다는 점 이다. 쉽게 이야기해서 쿼리 조건을 부분적으로 모듈화 할 수 있다. 자바 코드로 개발하기 때문에 얻을 수 있는 큰 장점이다.
컨피그 변경해서 실행시 잘 실행됨.
예외 변환 Querydsl 은 별도의 스프링 예외 추상화를 지원하지 않는다. 대신에 JPA에서 학습한 것 처럼 @Repository 에서 스프링 예외 추상화 처리를 해준다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Querydsl 소개1 - 기존 방식의 문제점
JAP 실무 사용시 꼭 필요한 기술.
갑자기 검색조건에 나이 이름을 추가하는 요구사항 발생
그럼 쿼리를 추가하면된다.
String sql = "select * from member" + "where name like ?" + "and age between ? and ?"
배포에 성공했는데 버그 발생..!
문제 : 띄어쓰기가 없어서 문자가 붙어버림 (memberwhere)
쿼리는 문자여서 실행하기 전까지 에러 확인 불가.
-> 런타임 에러
sql 작성시 컬럼명 전체를 외우기는 힘듦..
만약 SQL 이 클래스처럼 타입이 있고 자바코드로 작성할 수 있다면?
QueryDSL: 쿼리를 자바로 type-safe 하게 개발할 수 있게 지원하는 프레임워크.
주로 JPA 쿼리에 사용
20~40살, 성은 김씨, 나이많은 순서로 3명 출력
회원 엔티티
JPA Query 방법 3가지 있음.

장점 : SQL 과 비슷해서 금방 익숙해짐
단점 : 동적 쿼리 생성이 어려움.
JPA 에서 자바 코드로 쿼리를 작성할 수 있도록 지원해줌.

이 결과는
이렇게 되는데 눈에 잘 들어오지 않음.
단점 : type-safe 아님, 복잡함, 알아야 할게 너무 많음.
Type-safe 해결해주기 위해 뭔가 더 만들었으나, 여전히 복잡함.
Querydsl 소개2- 해결
Domain
Specific
Language
-> 도메인 특화 언어
특정 도메인에 초점을 맞춘 제한적인 표현력을 가진 컴퓨터 프로그래밍 언어
특징 : 단순, 간결, 유창
QueryDSL : 쿼리에 초점을 맞춤!
DB 에 상관없이, 모든 쿼리 기능을 추상화 해보겠다!
-> JPA, MongoDB, SQL 같은 기술을 위해 type-safe SQL 을 만다는 프레임워크
타입세이프한 쿼리를 작성하려면, 코드가 필요함.
JPA의 경우엔 엔티티에서 정보를 뽑아내고, 코드생성기가 돌아서 쿼리용 객체를 만듦
Member 엔티티 -> QMember 객체 생성
이객체로 쿼리를 작성할 수 있도록 해준다?
여러 디비도 가능하지만, 사실 QueryDSL 은 JPA 를 위해서 만들어짐
전강의에서 했던 같은 조회를 해보자.
Member 엔티티를 통해

이런 객체가 만들어짐.
이걸 통해서 SQL 이 만들어짐

작동 방식:
QueryDSL 작성하면, 이게 먼저 JPQL 로 생성됨.
이후 하이버네이트가 실행할 때 SQL 로 번역해서 실행함.
결국 QueryDSL 에서 JPQL 로 바꿔주는 빌더임.
결국 JPQL 을 알아야 제대로 사용할 수 있음.
장점 : type-safe, 단순, 쉬움
단점 : Q 코드 생성을 위한 APT 설정이 복잡함
Querydsl 설정
bulid.gradle 에 추가
환경에 따라 조금씩 달라서 확인은 필요.
추가적인 작업
Gradle 로 빌드할떄
그러면 Q 파일이 생성되는것 확인 가능.
참고: Q타입은 컴파일 시점에 자동 생성되므로 버전관리(GIT)에 포함하지 않는 것이 좋다.
gradle 옵션을 선택하면 Q타입은
gradle build폴더 아래에 생성되기 때문에 여기를 포함하지 않아야 한다. 대부분gradle build폴더를 git에 포함하지 않기 때문에 이 부분은 자연스럽게 해결된다.Task> build > clean 하면 Q 파일 삭제됨.
IntelliJ 로 빌드할떄
Build -> Build Project또는Build -> Rebuild또는main(), 또는 테스트를 실행하면 된다.마찬가지로 이 경로도 git 에 포함하지 않는것이 좋다.
지우는 방법 : gradle 에서 설정함.
참고
Querydsl은 이렇게 설정하는 부분이 사용하면서 조금 귀찮은 부분인데, IntelliJ가 버전업 하거나 Querydsl의 Gradle 설정이 버전업 하면서 적용 방법이 조금씩 달라지기도 한다. 그리고 본인의 환경에 따라서 잘 동작하지 않기도 한다. 공식 메뉴얼에 소개 되어 있는 부분이 아니기 때문에, 설정에 수고로움이 있지만
querydsl gradle로 검색하 면 본인 환경에 맞는 대안을 금방 찾을 수 있을 것이다.Querydsl 적용
공통
Querydsl을 사용하려면
JPAQueryFactory가 필요하다.JPAQueryFactory는 JPA 쿼리인 JPQL을 만들 기 때문에EntityManager가 필요하다.설정 방식은
JdbcTemplate을 설정하는 것과 유사하다.참고로
JPAQueryFactory를 스프링 빈으로 등록해서 사용해도 된다.findAllOld
Querydsl을 사용해서 동적 쿼리 문제를 해결한다.
BooleanBuilder를 사용해서 원하는where조건들을 넣어주면 된다.이 모든 것을 자바 코드로 작성하기 때문에 동적 쿼리를 매우 편리하게 작성할 수 있다.
findAll
앞서
findAllOld에서 작성한 코드를 깔끔하게 리팩토링 했다. 다음 코드는 누가 봐도 쉽게 이해할 수 있을 것이다.Querydsl에서
where(A,B)에 다양한 조건들을 직접 넣을 수 있는데, 이렇게 넣으면 AND 조건으로 처리된다. 참고로where()에null을 입력하면 해당 조건은 무시한다.이 코드의 또 다른 장점은
likeItemName(),maxPrice()를 다른 쿼리를 작성할 때 재사용 할 수 있다는 점 이다. 쉽게 이야기해서 쿼리 조건을 부분적으로 모듈화 할 수 있다. 자바 코드로 개발하기 때문에 얻을 수 있는 큰 장점이다.컨피그 변경해서 실행시 잘 실행됨.
예외 변환
Querydsl은 별도의 스프링 예외 추상화를 지원하지 않는다. 대신에 JPA에서 학습한 것 처럼@Repository에서 스프링 예외 추상화 처리를 해준다.All reactions