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 |