전체 글
-
Querydsl - 수정, 삭제 벌크 연산Spring/Querydsl 2022. 3. 25. 15:25
수정, 삭제 벌크 연산 여러개 수정, 삭제를 하면 데이터 수만큼 쿼리가 나가지만 벌크 연산을 사용하면 쿼리가 1번만 나간다. 따라서 여러개 수정, 삭제를 할 때는 벌크 연산을 사용하면 성능이 최적화된다. @Test @DisplayName("벌크 연산") public void bulkUpdate() { long count = queryFactory .update(member) .set(member.username, "비회원") .where(member.age.lt(28)) .execute(); assertThat(count).isEqualTo(2); } count : 업데이트가 수행된 수 execute() : 벌크 연산 수행 /* update Member member1 set member1.username..
-
Querydsl - where절을 이용한 동적 쿼리Spring/Querydsl 2022. 3. 25. 14:36
where절을 이용한 동적 쿼리 where절을 이용하여 동적 쿼리를 처리할 수 있다. where 조건에서 null 값이 들어오면 값은 무시되고 쿼리가 생성된다. 이러한 특성 때문에 다른 쿼리에서도 재활용이 가능한 장점이 있고, 또한 쿼리 자체의 가독성이 높아진다. BooleanBuilder보다 사용하기 편하므로 이 방법을 권장한다. @Test public void dynamicQuery_WhereParam() { String usernameParam = "member1"; Integer ageParam = 10; List result = searchMember2(usernameParam, ageParam); assertThat(result.size()).isEqualTo(1); } private List..
-
Querydsl - BooleanBuilder 이용한 동적 쿼리Spring/Querydsl 2022. 3. 25. 14:19
BooleanBuilder 사용한 동적 쿼리 BooleanBuilder를 사용하면 동적 쿼리를 사용할 수 있다. where 절에서 사용하는 데이터 값이 null 일 경우 조건을 제외시킬 수 있어 동적 쿼리를 만들기 편리하다. @Test @DisplayName("BooleanBuilder를 이용한 동적쿼리") public void dynamicQuery_BooleanBuilder() { String usernameParam = "member1"; Integer ageParam = 10; List result = searchMember1(usernameParam, ageParam); assertThat(result.size()).isEqualTo(1); } private List searchMember1(S..
-
Querydsl - DTO로 조회하기Spring/Querydsl 2022. 3. 25. 12:15
순수 JPA에서의 DTO 조회 new 명령어 사용해야 한다. DTO의 package 이름을 다 적어줘야하는 불편함이 있다. 생성자 방식만 지원한다. List result = em.createQuery( "select new study.querydsl.dto.MemberDto(m.username, m.age) " + "from Member m", MemberDto.class) .getResultList(); 위와 같은 순수 JPA에서의 DTO 조회 시 사용하기 불편했던 것들을 Querydsl에서 해결해준다. DTO로 조회하기 프로퍼티 접근 - setter 필드 직접 접근 생성자 사용 @QueryProjection 프로퍼티 접근 - setter Projections.bean(class, {field, .....
-
Querydsl - 프로젝션에 따른 결과 반환Spring/Querydsl 2022. 3. 25. 10:53
튜플은 repository 계층에서만 쓰는게 좋은 설계 프로젝션에 따른 결과 반환 프로젝션 : select문에서 가져올 데이터를 지정하는 것을 말한다. 프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있다 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회 프로젝션 대상이 하나 프로젝션 대상이 하나면 타입을 명확하게 지정 가능 List result = queryFactory .select(member.username) .from(member) .fetch(); List result = queryFactory .selectFrom(member) .fetch(); 프로젝션 대상이 둘 이상 프로젝션 대상이 둘 이상일 때는 Tuple이나 DTO로 조회 List result = queryFactory .sele..
-
JPA - OSIV와 성능 최적화Spring/JPA 2022. 3. 24. 10:33
OSIV와 성능 최적화 Open Session In View : 하이버네이트 Open EntityManager In View : JPA (관례상 OSIV라 한다) OSIV ON spring.jpa.open-in-view=true // OSIV 기본값 OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 즉, 영속성 컨텍스트가 데이터베이스 커넥션을 응답을 보낼 때까지 유지하여 지금까지 View Template이나 API 컨트롤러에서 지연 로딩이 가능했던 것이다. 그런데 이 전략은 너무 오랜 시간 동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있고..
-
Querydsl - Querydsl 기본 문법Spring/Querydsl 2022. 3. 23. 22:36
Querydsl 기본 문법 Querydsl 사용 방법 Q-Type 검색 조건 쿼리 결과 조회 정렬 페이징 집합 조인 - 기본 조인 조인 - on절 조인 - 페치 조인 서브 쿼리 Case 문 상수, 문자 더하기 기본 문법을 테스트하기 위한 데이터 @Autowired EntityManager em; JPAQueryFactory queryFactory; @BeforeEach public void before() { queryFactory = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Memb..
-
JPA - API 개발 고급(OneToMany 컬렉션 조회 최적화)Spring/JPA 2022. 3. 23. 17:31
API 개발 고급(컬렉션 조회 최적화) 엔티티 직접 노출 엔티티를 DTO로 변환 - 페치 조인 최적화 JPA에서 DTO 직접 조회 - 컬렉션 조회 최적화 대부분의 성능 문제는 조회에서 발생하므로 컬렉션인 OneToMany 관계에서의 조회에 대한 성능 최적화에 대해 알아보자. 엔티티 직접 노출 항상 강조하지만 엔티티를 직접 전달하는 방법은 여러 문제가 발생할 뿐만 아니라 유지보수에도 문제가 생긴다. 따라서 참고만 하고 DTO를 사용하자. 지연로딩으로 인한 문제 지연 로딩으로 인해 JSON은 Order 엔티티가 갖고 있는 OrderItem를 proxy 객체로 가지고 있게 된다. proxy 객체로 가지고 있다는 것은 실제로 OrderItem 엔티티의 정보가 없고 OrderItem 엔티티의 정보를 접근할 시점에..