⚡ 개요
근본적으로 동적 쿼리를 작성해야 하는 이유가 뭘까에 대해서 생각을 해봐야 한다.
데이터 베이스의 테이블 구조 또는 사용자 입력에 따라 조건 변경, UI에 따른 세부 조건 변경등 여러가지 이유가 있을수 있다. 만약 조회 하는 테이블은 같은데 조건만 달라지는 경우라면 동적 쿼리를 사용하지 않는다면 중복된 코드가 발생하고 이는 생산성 및 유지보수 측면에서 좋지 않은 결과를 가져온다고 생각을 한다.
예전에는 myBatis에서 쿼리를 작성할떄는 동적으로 param을 보내서 조회 하도록 작업을 하고 있었을 것이며, JPA를 사용 하는 개발자의 경우 초기에는 어떻게 동적 쿼리를 작업 해야하는지 모르는 사람한테 유용한 정보가 될거라고 생각한다.
내가 JPA를 사용하면서 동적 쿼리 및 배치 쿼리를 작업하는 방법에 대해서 일부 간단하게 정리를 해놓도록 하겠다.
⚡ 동적 쿼리 및 배치 쿼리 사용 방법
📝 BooleanBuilder
동적으로 쿼리 작업을 할때 가장 많이 사용하는 클래스 이며, 과거에 myBatis에서 많이 사용하던 방식과 비슷하다고 생각하면 된다. where 조건을 만들어서 조회시 붙여서 사용을 한다.
// 클래스내의 메소드 내용 확인해보면 좋음
import com.querydsl.core.BooleanBuilder;
// 사용 방법
BooleanBuilder whereOption = new BooleanBuilder();
// 가장 많이 사용
whereOption.and();
whereOption.or();
// ex
String id = "sotach"
String name = "sotach";
int year = 2024;
private final JPAQueryFactory queryFactory;
whereOption.and(QtestInfo.testInfo.id.eq(id));
whereOption.or(QtestInfo.testInfo.name.eq(name));
whereOption.and(QtestInfo.testInfo.year.eq(year));
// 호출
queryFactory
.selectFrom(QtestInfo.testInfo)
.where(where)
.fetch();
queryFactory를 통해서 한번쯤 조회를 해봤다면 위의 샘플 내용을 이해 할수 있다고 생각한다.
저기서 조금 더 나아간다면 id, name, year 값의 null 체크를 할 수도 있고, enum Type으로 받아서 switch 문을 돌려서 조건을 추가해도 된다.
📝 JPAUpdateClause, JPADeleteClause
데이터를 수정 및 삭제 할때 사용하는 배치 쿼리 방법에 대해서 설명 하려고 한다. 위의 동적 쿼리와 함께 가장 많이 사용하는 방법이다. 쉽게 조건에 따라서 수정 및 삭제 할 쿼리를 동적으로 만들어서 호출하도록 가능하게 해준다.
JPAUpdateClause
Qtest test = new QTest("test");
// em = EntityManager
JPAUpdateClause updateClause = new JPAUpdateClause(em, test);
// 기존 set 하는 방식과 동일하게 사용 하면 된다.
updateClause
.set()
.where()
.execute();
// 동적 사용시
// switch,loop 등을 이용해서 각각 셋팅하고 excute()
updateClause.set();
updateClause.set();
updateClause.set();
updateClause.where();
updateClause.execute();
내가 동적으로 사용할때 가장 많이 사용하는 방식중 하나이다.
위의 예시처럼 동적으로 사용시 switch, loop 문을 사용해서 동적으로 작업을 하기도 한다. 소스 내에서 활용이 가능한 곳이 많기 때문에 확인 해보면 좋을거 같다.
JPADeleteClause
Qtest test = new QTest("test");
// em = EntityManager
JPADeleteClause deleteClause = new JPADeleteClause(em, test);
// 기존 delete 문과 동일.
deleteClause
.where()
.execute();
// 동적 사용시
// switch,loop 등을 이용해서 각각 셋팅하고 excute()
deleteClause.where();
deleteClause.execute();
delete를 동적으로 사용하는 경우는 거의 없다고 생각을 한다. 굳이 JPADeleteClause 인스턴스를 생성하고, 조건을 추가해서 하기 보다는 그냥 queryFactory를 통해서 바로 호출하는 경우가 많다. 하지만 알고 있으면 좋을거 같아서 내용을 같이 정리 하게 되었다.
⚡ 생각
과거에 잘 모르고 사용했던 부분을 리팩터링 하면서 생산성 및 재사용에 도움이 되거나, 추후 유지보수가 수월한 코드를 작성하는것을 목표로 개발을 하고 리팩터링을 진행 하고 있다. :)
'Java' 카테고리의 다른 글
[JPA] CascadeType 사용시 주의 사항 (0) | 2024.02.24 |
---|---|
[JAVA] 날짜 변환 하기 (Date, Time, LocalDate, Timestamp등) (0) | 2024.01.21 |
[JAVA] Connection leck 관련 Apparent connection leak detected 경고 관련 내용 (0) | 2023.12.29 |
[Pythod] 파이썬 개발 도전 (2) (0) | 2023.12.10 |
[JAVA] java 21 LTS 릴리즈 내용 정리 (0) | 2023.09.20 |