25%
66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
lazy loading 할 때 where 절 추가 관련 질문드립니다.
안녕하세요. OneToMany 가 여러개 있는 entity 를 페이징으로 가져오려고 하는 상황에서 default_batch_fetch_size 를 100 이상으로 설정해서 in query 로 가져오게 구성해놓았습니다. 이 때 lazy loading 으로 in query 호출 시 추가 where 조건을 넣어서 가져오고 싶은데요. 단 하나 가능한 케이스를 찾은건.. entity 클래스에 @Where 어노테이션을 달아서 처리하면 lazy loading in query 와 함께 명시한 where 절이 호출되는건 확인했습니다만, 이렇게 설정하면 관련된 모든 쿼리의 where 절에 추가될 수 있어서.. 특정 querydsl 로 호출 시에만 lazy loading 호출 시 where 조건을 추가하고싶습니다. 많이 검색해보면서 삽질해봤는데.. 딱히 방법이 보이지 않는 것 같은데요 ㅠㅠ 혹시 방법이 있을까요? 미리 감사합니다
- 미해결실전! Querydsl
JPAQueryFactory 필드 이동 오류 관련 질문입니다
강의를 보고 JPAQueryFactory를 필드로 옮겼을때 nullpointexception이 뜹니다. JPAQueryFactory를 startQuerydsl 메소드 안으로 옮기면 괜찮습니다. 강의 내용에서 필드로 옮기는 것이 가능하다고 하셨는데, 이 경우에는 어떻게 해야하는지 궁금합니다
- 미해결실전! Querydsl
fetch join시 where관련해서 질문드립니다.
안녕하세요 ! 이번에 기본편을 제외한(기본편은 책으로 했습니다 !) 강사님 강의를 완강하고 jpa활용 1편 애플리케이션을 스프링데이터jpa와 queyrdsl을 활용해서 혼자 만들어보고 있습니다. 그 중에 주문 목록 검색 시, 주문자나 주문상태로 검색하는것을 querydsl로 짜봤습니다. package com.example.springjpa.repository; import com.example.springjpa.domain.*; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.persistence.EntityManager; import java.util.List; import java.util.function.Supplier; import static com.example.springjpa.domain.QDelivery.delivery; import static com.example.springjpa.domain.QMember.member; import static com.example.springjpa.domain.QOrder.order; @Repository @Transactional public class SearchQueryRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public SearchQueryRepository(EntityManager em){ this.em = em; queryFactory = new JPAQueryFactory(em); } public List<Order> findAllByEntity(OrderSearch orderSearch){ List<Order> query = queryFactory.select(order) .from(order) .join(order.member, member).fetchJoin() .join(order.delivery, delivery).fetchJoin() .where(orderStatusEq(orderSearch.getOrderStatus()), membernameEq(orderSearch.getMemberName())) .fetch(); return query; } private BooleanBuilder orderStatusEq(OrderStatus orderStatus) { return nullSafeBuilder(()->order.status.eq(orderStatus)); } private BooleanBuilder membernameEq(String memberName) { return nullSafeBuilder(()->member.name.contains(memberName)); } public static BooleanBuilder nullSafeBuilder(Supplier<BooleanExpression> f) { try { return new BooleanBuilder(f.get()); } catch (Exception e) { return new BooleanBuilder(); } } } 본래 fetch join시 루트엔티티말고 조인하는 entity를 where로 검사하면 데이터 부정합이 생길수 있다고 하셨는데요 위의 경우 order와 member, delivery는 외래키가 있으니, 부정합이 일어날것 같지 않은데, 혹시 저게 옳은 코드일까요? 테스트를 돌려봤을때는 이상이 없습니다만 ㅠㅠ 아무리 생각해도 fetch join되는 테이블에 조건을 거는게 꺼림직해서.... 고민이 됩니다. 그냥 join으로 조회한 다음 dto에서 order.getDelivery().getAddress() 등을하는게 더 옳은 선택일까요?
- 미해결실전! Querydsl
질문있습니다.
삭제된 글입니다
- 미해결실전! Querydsl
count query 부분 질문이 있습니다.
localhost:8080/v3/members/?page=0&size=110 또는 page=2&size=40 으로 조회했을 때에는 카운트 쿼리가 실행되지 않는 걸 확인 했습니다. 페이지 시작이면서 컨텐츠 사이즈가 페이지 사이즈보다 작을 때 마지막 페이지 일 때 (offset + 컨텐츠 사이즈를 더해서 전체 사이즈 구함) 이 두 경우는 이해를 했는데(1번의 경우 시작이면서 마지막 페이지니까) page=1&size=110 또는 page=2&size=50 으로 조회할 경우 content.size()가 0인데도 카운트 쿼리가 실행됩니다. 메소드에서 size가 0이면 카운트 쿼리를 날리게 구현한 걸 봤지만 왜 이렇게 해뒀는지 도저히 상상이 안되네요. 이유를 알 수 있을까요? 허접한 질문이라 죄송합니다... 아직 부족한 게 많네요 ㅠㅠ
- 미해결실전! Querydsl
@Commit 에 대해
안녕하세요 저 선생님 궁금한게 하나 있어서 질문 올립니다. yml 파일에 ddl-auto : create 로 두고 @Rollback(value = false) 과 @Commit 의 차이점을 모르겠습니다. 물론 Rollback 의 개념과 Commit 의 개념은 알지만 둘다 같은 결과를 출력해서 질문 드려 봅니다.
- 미해결실전! Querydsl
주간 집계 쿼리 작성방법
주간 집계 sql문을 작성하고 있는데 SELECT DATE_FORMAT(DATE_SUB(`reg_date`, INTERVAL (DAYOFWEEK(`reg_date`)-1) DAY), '%Y/%m/%d') as start, count(`value`) as count, `flag` FROM `test_st` WHERE `reg_date` BETWEEN "2021-03-04 00:00:00" AND "2021-04-04 23:59:59" GROUP BY start, flag; 위와 같이 쿼리를 작성 하였습니다. 위와 같이 주간 집계 요구사항이 들어 왔을 경우에는, 어떤 방식으로 쿼리를 작성하고, application에서 로직 처리를 해야하는지 궁금합니다.
- 미해결실전! Querydsl
영한님 정렬 질문 있습니다!
pageable 객체로 Sort값을 가져왔을 때,querydsl 에서 Sort값을 바로 사용하는 방법은 없을까요? 직접 조건을 만들어서 사용하는 방법 뿐인가 의문이 들어 질문남깁니다! 좋은 인강들 올려주셔서 감사합니다
- 미해결실전! Querydsl
안녕하세요. 리턴 타입 질문 드립니다.
조회시에 List가 아닌 set 으로 리턴 하는 방법이 있나요? ex) public Set<Long> findByNamesIn(List<String> name) { return jpaQueryFactory .select(member.id) .from(member) .where(member.name.in(name)) .fetch(); // set return}
- 미해결실전! Querydsl
DTO안에 컬렉션이 있는 경우
안녕하세요 Dto안에 컬렉션이 있는 경우는 어떻게 사용할 수 있을까요? 예를 들어 team 엔티티를 dto로 조회하는데 teamDto 안에 List<memberDto>가 있는 경우는 어떻게 querydsl에서 지원하는지 궁금합니다
- 해결됨실전! Querydsl
hibernate proxy 관련 문제입니다.
onetomany relationship 에 있는 wsi, record 엔티티들이 존재하며 lazy loading입니다. 위 코드에서 wsi 리스트를 호출하게 되면 제 생각으로는 records 에 대한 프록시 객체가 생성되야서 records 라는 필드가 null이 아니여야 하는데 null이 됩니다.. 왜그럴까요. @Test fun findLatestByWsiIdTest() { val em = entityManager.createEntityManager() val tx = em.transaction tx.begin() createDummyData() em.flush() em.clear() val allProjectIdList = projectRepository.findAll().map { it.id!! } em.clear() println("********************* start ***************************") allProjectIdList.forEach { id -> run { val wsiList = wsiRepository.findAllByProjectId(id) //.map { it.id!! } println("each wsis of project size : ${wsiList.size}") wsiList.forEach { wsi -> run { println(wsi.records?.size) } } } } println("********************* end ***************************") tx.rollback() }
- 미해결실전! Querydsl
java: cannot find symbol
java: cannot find symbol가 나와서 빌드도 안되고 실행도 안되네요ㅠㅠ 어떤 이유일까요? 인텔리제이 18년도 버전은 되는데 20년도 버전은 안되네요....ㅜㅜ
- 미해결실전! Querydsl
안녕하세요. Repository에 대한 테스트 코드 작성에 관하여 문의드립니다.
안녕하세요. 영한님 항상 좋은 강의 제공해주시고 질문에 대해 친절히 답변해주셔서 감사합니다. QueryDSL로 코드를 작성하고 나서 Repository에 대한 테스트를 하기 위해 테스트코드를 작성할 시 궁금한 사항이 있어 문의드립니다. 1. 여러 엔티티가 연관관계가 맺어있는 상태입니다. 사용자 엔티티와 게시물 엔티티, 이미지파일 엔티티, 댓글 엔티티 등 2. 실무에서는 위의 예시보다 훨씬 더 복잡한 관계로 맺어있기 때문에 해당 기능을 테스트하기 위한 즉 stub 데이터가 많이 필요한 것으로 예상됩니다. 기능을 위한 테스트를 하기 위해 넣어야 할 데이터가 많은경우 기능을 테스트하는 것보다 데이터를 insert하는 코드가 많아져 번거로움이 발생할텐데 이럴경우 어떻게 대처하는지 궁금합니다.
- 미해결실전! Querydsl
Spring Data JPA와 Repository 구현 클래스 동시사용
안녕하세요. Spring Data JPA를 상속받은 Repository와 RepositoryCustom, RepositoryImpl가 존재하는데 Repository의 반환 Type이 해당 Entity라면 RepositoryImpl에서 구현한 메소드의 반환 Type 또한 해당 Entity로 반환해야하는건가요?? 이에 대한 해결책은 단순히 구현한 클래스를 사용하는 방법밖에 존재하지 않나요??
- 해결됨실전! Querydsl
테스트 관련 질문이 있습니다!
안녕하세요 강사님. QA관련 글들을 보다가 이 글을 보았는데요. https://www.inflearn.com/questions/42585.여기 글에 강사님이 남긴 답변중에 "@DataJpaTest는 기본적으로 JPA 테스트를 위한 최소한의 스프링 빈만 컨테이너에 로딩합니다. 제가 사용하는 빈들을 기본 설정으로 로딩하지 않습니다. 그래서 저는 실무에서 테스트를 작성할 때 @DataJpaTest를 잘 사용하지 않습니다. 실무에서는 이미 @SpringBootTest를 사용하고 있는데, 이렇게 추가 테스트가 들어가면 스프링 컨테이너가 추가로 한번 더 실행되어야 합니다." 라고 하셔서 질문이 있습니다!! 만약 100개의 테스크 클래스가 있다고 가정하면, 50개의 클래스에서는 @SpringBootTest를 사용하고, 20개는 @DataJpaTes, 나머지 30개는 순수 자바 or 목을 사용한다고 하면 테스트케이스를 전체 실행할때, 50개의 클래스마다 스프링 컨텍스트가 뜨고, 내리고 그리고 나머지 30개는 @DataJpaTest에 필요한 의존성만 받고, 내리고를 반복 하잖아요~~ 근데 강사님께서는 "한번 더 실행되어야 합니다." 라고 말씀을 해주셨는데 @DataJPaTest가 아닌 @SpringBootTest를 이용해도 스프링 컨텍스트가 한 번더 실행되고 내려가고를 반복해야하는 거 아닌가요??!! 제가 잘못알고있었던건지 혼란이 오네요! ㅠㅠ
- 미해결실전! Querydsl
2개 이상의 OneToMany 관계에서 fetch join 문제
안녕하세요 영한님! 좋은 강의 너무너무 잘 듣고 있습니다! 다름이 아니라 JPA와 Querydsl을 공부하던 중 궁금한 점이 생겨 이렇게 질문을 드립니다. OneToMany 관계에서는 N+1 문제를 해결하기 위해 fetch join을 사용해 자식 엔티티도 모두 함께 가져오는 것으로 배웠습니다. 만약 아래처럼 하나의 엔티티와 자식 엔티티, 자식 엔티티의 자식 엔티티가 모두 OneToMany 관계인 경우 최상위 엔티티를 가져올 때 한꺼번에 모든 자식 엔티티를 가져올 수 있는 방법이 있는지 여쭤보고 싶습니다..! @Entity public class Forest{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "forest_id") private Long id; @OneToMany(mappedBy = "forest") private List<Tree> trees= new ArrayList<>(); } @Entity public class Tree{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "tree_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "forest_id") private Forest forest; @OneToMany(mappedBy = "tree", cascade = CascadeType.ALL) private List<Leaf> leaves= new ArrayList<>(); } @Entity public class Leaf{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "leaf_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "Tree_id") private Tree tree; } 위 코드를 기준으로 제가 원하는 것은 모든 Forest을 가져올 때, Forest의 자식인 Tree와 Tree의 자식인 Leaf를 함께 가져오는 것인데, 처음엔 단순히 fetch join을 두번 사용하면 될 것이라고 생각했습니다. 따라서 코드를 다음과 같이 작성했습니다. public List<Forest> findAllFetch() { return queryFactory .selectFrom(forest) .leftJoin(forest.trees, tree).fetchJoin() .leftJoin(tree.leaves).fetchJoin() .fetch(); } 하지만 위 코드처럼 두개 이상의 OneToMany 관계에서 fetch join을 여러번 사용하면 MultipleBagFetchException이 발생했습니다. 찾아보니 JPQL에서는 xToMany에서는 일반적으로 fetch join은 한번만 허용된다고 하더라구요... 따라서 제가 생각한 해결책은 위 과정을 2번의 쿼리로 나누어 실행시키는 방법이었습니다. public List<Forest> findAllFetch() { List<Forest> result = queryFactory .selectFrom(forest).distinct() .leftJoin(forest.trees).fetchJoin() .fetch(); List<Long> selectedIds = result.stream() .map(Forest::getId) .collect(Collectors.toList()); queryFactory .selectFrom(tree).distinct() .leftJoin(tree.leaves).fetchJoin() .where(tree.forest.id.in(selectedIds )) .fetch(); return result ; } 혹시 위 코드보다 더 나은 방법이 있는지 아니면 한번의 쿼리로 모든 자식 엔티티를 받아올 수 있는 방법이 있는지 궁금합니다.
- 미해결실전! Querydsl
함수로 분리할 때 질문입니다.
안녕하세요. usernameEq(), ageEq()처럼 함수로 분리하니 메인 쿼리가 나가는 함수에서 실제로 가독성이 좋아지는걸 확인할 수 있었습니다. 여기서 질문이 한가지 있는데요. Querydsl강의는 아니고 타 강의였는데 DDD Aggregate root에 관한 이야기를 하신적이 있습니다. Post(글), Comment(댓글)로 예를 들자면 댓글의 경우 글에 종속되는 도메인 개념이기 때문에 PostRepository하나에 밀어넣는 방식을 선택할 수 있다고 들었습니다. 만약 Post, Comment 엔티티 모두에 같은 필드명인 username이라는 것이 존재하는 경우 함수의 네이밍과 분리를 어떻게 가져가야할까요? 1. postUsernameEq(), commentUsernameEq() 처럼 앞에 엔티티의 이름을 붙여서 분리한다. 2. usernameEq() 라는 하나의 함수를 만들고 인자로 엔티티를 함께 받아서 처리한다. (실제로 가능한지는 모르겠습니다) 이렇게 2가지의 방법을 생각해봤습니다. 이 부분에 대해서 영한님의 생각을 듣고 싶습니다. 감사합니다 :)
- 미해결실전! Querydsl
실무에서의 Projection 방식
안녕하세요. 실무에서는 프로퍼티 접근/필드 직접 접근/생성자/@QueryProjection 4가지 방식중 어떤걸 가장 많이 사용하나요? 상황에 따라 다르겠지만 일반적으로 실무에서 많이 사용되는 방법과 영한님의 생각을 듣고 싶습니다. 감사합니다.
- 해결됨실전! Querydsl
QueryDsl 1차 캐시관련
안녕하세요, 강사님! 강의를 복습하다가 궁금증이 생겨 질문 남깁니다. 조회된 엔티티는 영속화되며 1차 캐시에 저장이 되고 특별한 이벤트?! (EntityManager.clear() 또는 Transation이 종료 등등..)로 1차 캐시 내용이 없어진다고 이해하고 있습니다. 이렇게 이해한 내용 토대로 QueryDsl을 사용해도 1차 캐시를 사용하겠지라는 생각과는 다르게 동작하여 개념이 혼돈되고 있습니다. 아래 사진을 참고하시면 첫번째 쿼리를 실행후 그다음 쿼리 실행시 1차 캐시된 엔티티를 찾아 반환해 줘야하는데 다시 DB에 쿼리를 날려 결과를 가지고왔습니다. 제가 어떤 부분을 잘못 이해하고 있는 걸까요?
- 미해결실전! Querydsl
InitMember.class의 패키지 위치 질문있습니다.
영한님 안녕하세요. 덕분에 점점 JPA가 재밋어지고 최적화에 재미를 들이고 있습니다. 강의 중에 데이터를 초기화 하는 클래스를 main 패키지 하단에 두셧는데요. 보통 저런 데이터 초기화 클래스를 test 패키지에 안두고 main에 두어도 상관 없는지 궁금합니다. 실무에선 보통 저런 초기화 데이터를 실제 어떻게 만들고 관리하는지도 궁금합니다. 감사합니다.