25%
66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
QUERYDSL rank 함수 문의
안녕하세요 강사님 querydsl 에서 rank 함수 사용법 문의드립니다. 개인적으로 검색해본 결과는 SqlQueryFactory를 사용해서 SqlExpression을 쓰면 되던데.. 해당 내용으로 변경해서 querydsl 을 호출하니 엔티티 및 속성 맵핑이 제대로 안되더라구요 예를 들어 엔티티명이 Customer , 실제 테이블명 CUST 일 경우, Customer로 쿼리를 날려 테이블이 존재하지 않는다고 오류가 발생합니다. 어떻게 사용해야할까요? ㅠㅠ 답변 부탁드립니다. 감사합니다!
- 미해결실전! Querydsl
디폴트 정렬 조건 추가하고자 하는 경우
페이징 쿼리를 요청 받았을 때,디폴트로 제일 마지막에 날짜(끌올 기능도 넣고 싶어 orderAt이란 LocalDate 프로퍼티 추가)를 기준으로 디폴트를 넣고자 합니다 public Page<Post> getPagePostBySearch( List<District> districts, PostSearchCondition condition, Pageable pageable){ return applyPagination(pageableWithOrderAt(pageable), query -> query .selectFrom(post) .join(post.category, category).fetchJoin() .join(post.seller, account).fetchJoin() .join(post.district, district).fetchJoin() .where( defaultCond(districts), searchCond(condition) ));} private PageRequest pageableWithOrderAt(Pageable pageable) { List<Sort.Order> orders = pageable.getSort().get().collect(Collectors.toList()); orders.add(new Sort.Order(Sort.Direction.DESC, "orderAt")); return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by(orders));} 이때 이렇게 입력 받은 pagable로 부터 PageRequest를 새로 만들어 적용해 주었는데,pagable로 부터 모든 sort를 변환해서 가져온다음에 다시 적용하는것은 비효율적인 것 같아 다른 좋은 방법을 적용하고 싶은데, 잘떠오르지 않아 질문드립니다. 더 좋은 방법을 적용할수 있는 힌트를 얻을 수 있을까요? 답변주시면 감사드리겠습니다.
- 미해결실전! Querydsl
Querydsl 지원 클래스를 사용할때 sort 익셉션 처리관련 질문
QueryDsl 지원 클래스를 직접 사용할 경우, paging, sorting의 로직을 한곳에서 관리할 수 있는데 @GetMapping("/search")public ResponseEntity<ResponseOKDto<GetPagePostsResponseDto>> getPagePostsSearch( PostSearchCondition condition, Pageable pageable, @ApiIgnore HttpSession session){ Account account = accountService.checkSessionAndFindAccountWithActivityArea(session); Page<Post> pagePost = checkStatusParamAndFindPosts(account, condition, pageable); return new ResponseEntity<>(new ResponseOKDto<>(new GetPagePostsResponseDto(pagePost)), HttpStatus.OK);} 이런식으로 만들었을 경우, 프론트에서 해당 도메인 클래스에 없는 프로퍼티에 대해 잘못 sorting을 요청했을 때 익셉션 처리를 해주려고하는데요 querydsl 지원 클래스내에서 해당 익셉션을 처리할 경우, 아래와 같이 다른 도메인 controller에서도 따로 익셉션을 처리하지 않아도 된다는 장점을 가지는 것 같은데요 protected <T> Page<T> applyPagination(Pageable pageable, Function<JPAQueryFactory, JPQLQuery> contentQuery, Function<JPAQueryFactory, JPQLQuery> countQuery){ checkSortProperties(pageable); JPQLQuery jpaContentQuery = contentQuery.apply(queryFactory); JPQLQuery jpaCountQuery = countQuery.apply(queryFactory); List<T> content = getQuerydsl().applyPagination(pageable, jpaContentQuery).fetch(); return PageableExecutionUtils.getPage(content, pageable, jpaCountQuery::fetchCount);}private void checkSortProperties(Pageable pageable) { List<String> domainFields = Arrays.stream(domainClass.getDeclaredFields()).map(Field::getName).collect(toList()); List<String> sortFields = pageable.getSort().get().map(Sort.Order::getProperty).collect(toList()); if (!domainFields.containsAll(sortFields)) { throw new IllegalSortArgumentException("invalid sort property, properties must be in " + domainFields); }} 고민이 되는 점은 컨트롤러에서 미리 걸러줘야 할 것 같은데, 레포지토리내에서 익셉션 처리를 해줘도 되나?라는 의문이 들었습니다. 익셉션 처리 위치를 이렇게 해줘도 될까요? 아니면 번거롭더라도 각각의 도메인에 대해 일일히 컨트롤러 클래스 내에서 처리를 해줘야 할까요? 답변주시면 감사드리겠습니다.
- 미해결실전! Querydsl
쿼리 dsl, jpa 사용 케이스
간단한 쿼리도 Querydsl로 작성 시,미연에 에러를 방지할 수 있고, 생산성이 좋다는 강점을 가지고 있는데, 그렇다면 대부분을 쿼리 dsl로 작성하고 몇몇 케이스에서만 jpa로 작성하면 될까요?
- 미해결실전! Querydsl
페이징 방법 질문입니다!
안녕하세요, 항상 좋은 강의 감사합니다. offset기반의 페이지네이션의 성능이 데이터가 많을 수록 떨어지기 때문에 데이터가 적거나 간단하게 사용할 필요성이 있는 곳이 아니라면, cursor 기반 페이지네이션을 사용하는 것으로 공부했는데, 실무에서도 사용을 하는지 궁금합니다.
- 미해결실전! Querydsl
벌크 연산과 동기화 시점관련 질문
벌크 연산 수행 후 em.flush(), em.clear() 를 통해 동기화 해주셨는데 벌크 연산 작업 과 다른 비즈니스 로직의 타이밍이 일치하게 될 경우 (이 때 서로 같은 엔티티를 다루는 케이스가 있다고 가정) 비즈니스 로직에서 예를 들어 어떤 포인트를 100 올려주는 로직이 실행되고 (user a) + 어떤 (user b)는 포인트 100 감소 벌크 연산에서는 포인트가 3000이상인 경우 30% 증가라는 작업이 이루어 질때,(비즈니스 로직이 먼저 진행 사건이라고 가정, 근데 타이밍이 애매하게 걸치면)위의 비즈니스 로직이 적용되기 전에 포인트 벌크 작업이 진행될 수 도 있을 것 같습니다.(예시가 좀 좋지 않은것 같긴한데요)이런 케이스를 막기 위해서는 user a와 b의 결과가 적용될 수 있도록 em.flush(), em.clear()의 동기화 작업을 먼저하고 벌크 연산을 해줘야 하나? 라는 생각이 들었는데이런 케이스에서는 벌크 작업 후 동기화해도 문제가 없을까요?
- 미해결실전! Querydsl
빌드파일 안에 레포지토리
레포지토리를 왜 빌드파일에 생성하는 건가요?
- 미해결실전! Querydsl
질문있습니다
확실히 컴포넌트처럼 분리해서 사용하니 재사용성이 아주 좋다는것을 알았는데요. 그렇다면 실무에서 어떤 식으로 분리하는지 알고 싶습니다. 예전에 임플리먼트도 JpaEl 이런식으로 네이밍 규칙의 권장사항이 있는것처럼 해당 메소드만 쓰는 적당한 네이밍규칙이라던가,,(물론 실무 프로젝트에 따라 많이 다를 수 도 있겠지만요! 감이 잘 잡히지않아서 질문드리는거라서 ㅠㅠ) 여튼, 하나에 서비스(ex, MemberService)에 모든 Eq 를(name, age, 등등) 다 몰아넣기는 너무 많을 경우에는 어떻게 하시는지(지저분해보여서 생각보다..) 따로 클래스를 만들어서 분리시킨다면 어떤식의 네이밍 규칙을 사용하는지 알고 싶습니다. 질문이 너무 초급적이라 죄송합니당 ㅠㅠ
- 미해결실전! Querydsl
상속 구조에서 querydsl 조회하기
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.w2tomwsznga7)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://docs.google.com/document/d/1xCQKit-1V6l6ObeCe49St33RHPzLF_P_c3o7aSDTKs0/edit#heading=h.7dhnp46ven0v)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. 이전 강의 에서 Entity에서 Iteam을 Book , Movie, Ablum으로 상속하는 구조를 가지고 있습니다. 이럴 경우 querydsl로 조회 할 때 dtype을 where 절에서 사용할 수 있는지 궁금합니다. 만약 사용할 수 없다면 실무에 적용할 수 있는 다른 좋은 방법이 있는지 궁금합니다.
- 미해결실전! Querydsl
coalesce를 활용한 조건 질의에 대해서 궁금한게 있습니다
안녕하세요 :) 열심히 찾아보고 찾아봤는데, 잘 모르겠어서 문의글 처음 올려봅니다. coalesce를 활용하여 값이 없을때는 특정 값이 바인딩되도록 하여 비교하는 조건을 작성하려고 합니다. 오라클 쿼리에선 nvl이라는 것을 활용하여 다음과 같은 쿼리가 나오게 하려고 하는데요. nvl(test_code, '01') = '01' Expressions.asEnum(entity.testCode.coalesce(TestCode.DEFAULT)).eq(testCode.DEFAULT) 이렇게 조건을 걸었을때 쿼리에선 다음과 같이 나옵니다 nvl(table.test_code, '<byte[]>') = '<byte[]>' 해당 엔티티에는 enum을 위해 converter도 설정되어 있는데 byte[]로 나오는게 이해되지 않습니다. 할 수 없이 enum을 string으로 변경하여 비교하도록 하니 쿼리는 동작합니다. Expressions.asString(entity.testCode.stringValue()).coalesce('01').asString().eq('01') 아래 코드와 같이 쿼리가 나옵니다. nvl(to_char(table.test_code), '01')='01' 이미 varchar형태인 컬럼을 to_char로 변경해서 돌리는게 비효율적인 것 같습니다. 조언 부탁드립니다
- 미해결실전! Querydsl
@QueryProjection Set<String> 타입
안녕하세요 프로젝트를 해보고있습니다. @QueryProjection 으로는 Set<String> 타입을 QueryDsl을 사용해서 new Operation으로 사용할 방법은 없나요??
- 해결됨실전! Querydsl
QueryDSL 테스트 관련해 질문드립니다
안녕하세요 영한님! compileQueryDSL로 생성된 Qclass들은 github에 올리지 말라고 하셔서 그대로 적용해 사용 중입니다. 제가 Qclass를 사용하는 Test 코드를 작성하고 로컬에서는 Qclass가 프로젝트 내에 존재하니 문제 없이 실행되지만, CI / CD 연습을 위해 github push, pull request 기준으로 깃 레포에서 코드를 받아와 빌드를 하는데 Qclass가 없어서 test 코드가 터져 빌드가 실패합니다. 1. Qclass를 노출하지 않는 이런 경우에는 Test 코드 작성을 어떻게 해야할까요? 2. Test 코드에 @Profile 을 local이 아닌 것을 줘서 수행되지 않도록 하는 것이 최선일까요?
- 미해결실전! Querydsl
N+1 현상
안녕하세요 영한님 잘보고있습니다. 감사합니다 질문이 하나 있습니다. public List<MemberTeamDto> searchByBuilder(MemberSearchCondition condition){ BooleanBuilder builder = new BooleanBuilder(); if(StringUtils.hasText(condition.getUsername())){ builder.and(member.username.eq(condition.getUsername())); } if(StringUtils.hasText(condition.getTeamName())){ builder.and(team.name.eq(condition.getTeamName())); } if(condition.getAgeGoe() != null){ builder.and(member.age.goe(condition.getAgeGoe())); } if(condition.getAgeLoe() != null){ builder.and(member.age.loe(condition.getAgeLoe())); } return 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(builder) .fetch(); } //페치조인 미 적용 테스트를 해보면 @Test public void searchTest(){ Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4" ,40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); MemberSearchCondition condition = new MemberSearchCondition(); condition.setAgeGoe(35); condition.setAgeLoe(40); condition.setTeamName("teamB"); List<MemberTeamDto> result = memberJpaRepository.searchByBuilder(condition); assertThat(result).extracting("username").containsExactly("member4"); } N+1 같은 현상이 일어나지 않습니다. 페치 조인을 사용하지 않았는데 이유가 있을까요 ?
- 미해결실전! Querydsl
강의듣는중에 테스트에서 갑자기 모든 테스트가 null point exception 이 뜹니다..
안녕하세요 영한팀장님. 강의 너무 잘듣고있습니다. 갑작스럽게 어제까지 잘돌아가던 테스트가 오늘 '집합'부분 테스트를 만들고나서 (aggregation()메소드) queryFactory 부분에서 nullpointexception이 납니다. 혹시 QClass가 이상하게 되었나 싶어서 clean하여 다시 컴파일하고 실행해도 동일합니다. 그 전에 잘되었던 기존 테스트들도 줄줄이 똑같은 예외를 뱉으며 테스트에 실패합니다.. 이유가 무엇일까요ㅠ 2시간동안 강의못듣고 끙끙 헤매다가 처음으로 질문을 올려봅니다ㅠㅠㅠ https://drive.google.com/file/d/1ad-mUAI4eRBYuNgKk72mF-MKnpNg2Bp8/view?usp=sharing 소스 코드 공유합니다!! 또한, symbol을 찾지 못하는 예외도 같이 떠서 구글링중에 인텔리제이 설정도 만져보았으나.. 해결되지 않습니다 ㅠㅠ
- 미해결실전! Querydsl
벌크연산시, 소수점은 반영이 안되나요?
안녕하세요 벌크연산에서 multiply나 devide를 사용하면서 전체 임금 30프로 인상이나 삭감등의 경우를 연습해보고있는데요, queryFactory .update(member) .set(member.salary, member.salary.multiply(1.3)) .execute(); 코드가 다음과 같은 경우, update member set salary=salary*1; 이런 쿼리가 나가는 것을 확인하였고, multiply와 devide함수가 받는 파라미터 정보를 보니 NumberExpression<Integer> 이렇게 되어있는데, 아마 받는 파라미터가 Integer로 정의되어있어서 소숫점은 버려지는것이 아닌가 싶습니다. 이런경우 받는 파라미터를 Double형으로 바꿔주면 해결이 될것 같은데, 어떤식으로 바꿀수가 있을까요? 아니면 다른 해결방법이 있을까요?
- 미해결실전! Querydsl
크로스조인
안녕하세요 영한님 강의 항상 잘 듣고있습니다. 실무에서도 cross join을 사용 하는 경우가 있을까요? 데이터 뻥튀기가 어마어마 한거같아서 질문드립니다
- 미해결실전! Querydsl
안녕하세요 Build and run 질문입니다
안녕하세요! 선생님 강의를 여러개 듣고 나서 개인 프로젝트를 하다가 로그인 & crud 정도만 조금 구현 해놓고 Querydsl을 듣고 있었습니다. 강의에서 5:34 에 나오는 Build and run using을 Gradle -> IntelliJ IDEA로 바꾸는 과정을 보면서 제 개인 프로젝트에 적용을 하지 않은것을 깨달아 그것을 변경하였는데 로그인 과정에서 전에 발생하지 않던 아래의 에러가 나는겁니다. Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.; 구글링을 통해서 아래와 같이 레포지토리에 있는 jpql 메소드의 파라미터에 @Param을 추가해서 에러는 해결했습니다. 여기서 궁금한것은 왜 Gradle 에서 IntelliJ IDEA로 바꿨다해서 에러가 났을까? 입니다. 감사합니다
- 미해결실전! Querydsl
predicate 보다 booleanExpression을 선호하는 이유가 뭔가요?
booleanExpression은 and, or 을 조합해서 새로운 BooleanExpression을 만드는것과 같이 메서드를 재사용할 수 있고 null을 받으면 무시해서 npe를 방지할 수 있다라고 하는 글을 봤습니다. 근데 predicate는 and, or을 조합하지 못한다는게 이해가 안됩니다. 정확히 어떤 상황을 말하는 것인지 여쭤봐도 될까요?
- 미해결실전! Querydsl
프로젝션 반환 타입의 레이어가 고민됩니다
프로젝션 쿼리에서 DTO를 사용하게 되면, Domain-Application-UI 모든 레이어에 의존성이 생기게 되는데요.. 그래서 DTO가 아니라 VO로 봐도 될지 고민 됩니다. 영한님의 의견과 실무에서 반환타입을 어떻게 사용하고 계신지 궁금합니다!!
- 미해결실전! Querydsl
그룹함수 질문이 있습니다.
안녕하세요. 결론부터 말씀드리자면 sum(time) 을 하는 방법을 여쭤보고 싶습니다. db는 mysql 이고 데이터 타입은 time 입니다. sum을 사용할려고 하다보니 일반 쿼리로 작성을 할때는 sum(time)으로 하면 정상으로 결과가 나오는데 QueryDsl에서 작성을 할려고 하다보니 time.sum이 되지 않더라고요. Expressions.timeTemplate이 라는걸 사용했을때는 생성된 쿼리를 직접 돌리면 원하는 결과는 나오는데 queryDsl에서는 오류가 나고 있구요. time -> millisecond, second 로 바꾸고 sum을 할려고 했는데 해당 함수는 그 위치의 값을 가지고 오더라구요. 딱히 찾아봐도 방법을 모르겠어서 문의 드립니다.