[Querydsl] querydsl 학습_4

2020. 11. 23. 19:23개발/DBMS

반응형

[4주차]

활용 -1 ( 벌크 연산), 활용 -2 (페이징 최적화)

1. 활용 -1 ( 벌크 연산)

  • 벌크 연산을 통하여 여러 행의 DB 업데이트를 진행 할 수 있다. (단, 벌크 연산 사용시 JPA 영속성이 달라 짐으로 사용에 주의가 필요하다)

TIP!

em.flush();
em.clear();

해당 기능을 통해 엔티티 메니저를 flush(), clear()를 통해 영속성을 비워고 초기화 시켜준다.

1-1. UPDATE

queryFactory
    .update(member)
    .set(member.username, "비회원")
    .where(member.age.lt(28))
    .execute();

UPDATE 문법


기능

문법

기능

update()

벌크 연산 할 테이블 정보

set(컬럼, 값)

업데이트할 정보 (컬럼명, 업데이트 값)

where()

업데이트할 조건

execute()

실행

 

1-2. DELETE

queryFactory.delete(member)
    .where(member.age.gt(18)).execute();

DELETE 문법

문법 기능

delete()

벌크 연산 할 테이블 정보

where()

삭제 조건

execute()

실행

 

2. 활용 -2 ( 페이징 최적화)

  • 기본 페이징에는 성능 상의 문제(내부적으로 데이터를 가져오는 쿼리, 총 데이터 갯수를 가져오는 쿼리로 나눠 2번 실행 된다) 를 어떻게 하면 최적화 할 수있을지 학습해 본다.

  • 단, 복잡한 쿼리가 아니거나, 데이터가 많지 않은 경우에는 기본으로 써도 무방하다.

2-1. 최적화 해볼 기본 쿼리

QueryResults<MemberTeamDto> results = queryFactory
    .select(new QMemberTeamDto(
        member.id.as("memberId"),
        member.username,
        member.age,
        team.id.as("teamId"),
        team.name.as("teamName")))
    .from(member)
    .leftJoin(member.team, team)
    .where(
        usernameEq(condition.getUsername()),
        teamNameEq(condition.getTeamName()),
        ageGoe(condition.getAgeGoe()),
        ageLoe(condition.getAgeLoe())
    )
    .offset(pageable.getOffset())
    .limit(pageable.getPageSize())
    .fetchResults();

List<MemberTeamDto> content = results.getResults();
long total = results.getTotal();

return new PageImpl<>(content, pageable, total);
  • 16 ~ 18 를 보면 2주차에서 배운 기본 페이징 조건이 들어가 있다. 20 ~ 21 라인를 보면 페이징 처리 된 결과에서 총 데이터 갯수를 가져온다.

2-2. 최적화 해본 쿼리

List<MemberTeamDto> content = queryFactory
    .select(new QMemberTeamDto(
        member.id.as("memberId"),
        member.username,
        member.age,
        team.id.as("teamId"),
        team.name.as("teamName")))
    .from(member)
    .leftJoin(member.team, team)
    .where(
        usernameEq(condition.getUsername()),
        teamNameEq(condition.getTeamName()),
        ageGoe(condition.getAgeGoe()),
        ageLoe(condition.getAgeLoe())
    )
    .offset(pageable.getOffset())
    .limit(pageable.getPageSize())
    .fetch();

JPAQuery<Member> countQuery = queryFactory.selectFrom(member)
    .leftJoin(member.team, team)
    .where(
        usernameEq(condition.getUsername()),
        teamNameEq(condition.getTeamName()),
        ageGoe(condition.getAgeGoe()),
        ageLoe(condition.getAgeLoe())
    );

return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchCount);
  • 16 ~ 18 를 보면 2주차에서 배운 기본 페이징 조건이 들어가 있다.

  • 20 ~ 27 라인를 보면 전체 데이터의 갯수를 가져 오는 쿼리를 별도로 만들어서 쓴다. ( 성능이 중요한 경우라면 이 처럼 별로 카운트 쿼리를 작성하는 것이 좋다. 별도 데이터( 컬럼 등)을 가져 올 필요가 없다.

[4주차]-END

반응형

'개발 > DBMS' 카테고리의 다른 글

[Querydsl] querydsl 학습_3  (0) 2020.09.04
[Querydsl] querydsl 학습_2  (0) 2020.08.28
[Querydsl] querydsl 학습_1  (0) 2020.08.19
[Querydsl] querydsl 적용시 주의점  (1) 2019.11.08