25%
66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨실전! Querydsl
그냥 native SQL 짜듯이 짜면 되는게 신기하네요
심지어 자바 코드로 만들어서 컴파일 시에 에러까지 잡아주니까 너무 신기하고 재밌어요 ㅋㅋㅋ 다른 강의들에서 항상 QueryDSL 강조하시던 이유가 있었군요!!
- 해결됨실전! Querydsl
서브쿼리 질문입니다.
위 네이티브 쿼리를 Querydsl이나 @Query를 이용하여 작성하고 싶습니다. Querydsl이나 @Query나 모두 똑같은데서 문제가 발생하는데요.where절에서 두 개 이상의 필드를 명시할 경우 위처럼 컴파일 에러가 발생합니다. 강의 예제에서는 where절에 하나의 필드만 사용했는데두 개이상의 필드는 사용하지 못하는건가요?? --------------------------------- 네이티브 쿼리로 동작은하는데(반환타입을 List로하고 파라미터 없이할 경우)페이징도 하고싶어서 반환타입을 Page로 할경우 ID 컬럼을 찾을 수 없다는 에러가 납니다. 쿼리를 두번 나눠서 호출하는게 답일까요..? 질문을 요약하면1. 서브쿼리 사용 시 where절에 두 개 이상의 필드 사용 가능 여부 2. 네이티브 쿼리 사용 시 페이징 가능 여부 입니다.
- 미해결실전! Querydsl
JPQL로 해결 안 되는 부분
선생님 안녕하세요 양질의 강의 잘 듣고 있습니다. 다름이 아니고 SQL로는 쉽게 짤 수 있는 구문이 JPQL, QUERYDSL 로 변환하는데 어려움을 겪고 있씁니다. 상황은 간단히 요약하면 게시판 글 목록을 보여주기 위해 게시물인덱스, 제목, 내용, 글에 눌린 '총 좋아요 수' 를 reponse 로 주는 API를 만드려고 하는 것입니다. post 테이블이 있고, 어떤유저가 어떤 글에 좋아요를 눌렀는지 체크하는 'user_like' 테이블이 있습니다. SQL로 짠다면 아래와 같이 짤 수 있습니다. select p.post_idx,p.post_title,p.post_body,c.cnt from post pleft join (select count(*) as cnt, post_idx from user_likewhere is_clicked = 'Y'group by post_idx) as con c.post_idx = p.post_idx; https://www.inflearn.com/questions/14139 의 답변을 보고 해결방안을 생각해 보았는데, 1.네이티브 쿼리 사용 2.쿼리를 2번 나누어 호출 첫 번째 질문은 네이티브 쿼리로 위의 SQL문을 만들 수 있나요? 두 번째 질문은 설명을 보아도 쿼리를 2번 쓰는게 어떤건지 잘 모르겠습니다. 예를 들어 join 뒤에 subquery를 먼저 돌린다고 하면 [게시물인덱스, 총 좋아요수] 가 나옵니다. 이걸 DTO를 만들어서 리스트에 담을거고, 담은 값을 다시 꺼내어 나머지 쿼리를 돌린다는 걸까요? 람다를 써서 할 수 있는건지...? 어떻게 코드를 쓰는건지 감이 안 잡힙니다. 쿼리를 두 번 써서 어떻게 제가 원하는 게시물 정보 리스트를 얻을 수 있을까요?
- 미해결실전! Querydsl
Q Class 생성 시 extends 상속 질문
안녕하세요. Entity class에 extends DefualtEntity 를 할 경우 Q class 생서 시 DefualtEntity 의 값은 Q Class에 누락되는 현상이 있던데 상속을 해서 구성하면 안되는 걸까요? DefualtEntity 에는 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime regDate; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime udtDate; @PrePersist public void prePersist() { LocalDateTime now = LocalDateTime.now(); regDate = now; udtDate = now; } @PreUpdate public void preUpdate() { udtDate = LocalDateTime.now(); } 이런 공통적인 내용을 넣어보려합니다.
- 미해결실전! Querydsl
Dto에서 @QueryProjection 및 @Builder를 같이 사용해도 될까요?
안녕하세요 영한님! queryDsl 강좌를 잘 보고 있습니다. 이번 강좌를 듣고 궁금증이 생겨서 질문드립니다. 아래와 같이 @QueryProjection과 @Builder를 같이 적용을 해서 사용을 해도 아무런 문제가 없는건지 궁금합니다. @QueryProjection @Builder public TestDto(String name, int age) { this.name = name; this.age = age; } 일단 테스트로 같이 적용해서 돌려봤는데 별 이상없이 돌아가는거 같긴한데 권장되지 않는 방법인지 모르겠네요 감사합니다(__)
- 미해결실전! Querydsl
Query DSL의 지연로딩
안녕하세요 강의 너무 잘 듣고 있습니다 ㅎㅎ 듣다보니 궁금한게 생겼는데 --- Query DSL도 Entity Manager를 사용하는걸 보고 이런 생각이 들었습니다. ' 그러면 Query DSL도 지연 로딩이 가능한가? ' --- Entity Manger를 사용하는 JPA 같은 경우엔 영속성 컨텍스트를 사용하여 지연 로딩 사용이 가능한데 Query DSL도 사용 가능하다고 보는게 맞을까요? --- 실제로 Query DSL로 테스트를 했을 땐 Lazy 로딩으로 설정이 잡혀있어도 fetch join 처럼 다 조회해서 가져오긴하네용 ㅎㅎ --- 감사합니다.
- 미해결실전! Querydsl
Querydsl4RepositorySupport을 이용한 Controller 구현 문의
마지막 완강을 드디어 마치고, 실습하는 과정에 있어서 막히는 부분이있어서 문의 드립니다. MemberController.java 에서 이번에 적용된걸 추가해서 진행했는데 (v4, v5) @RestController@RequiredArgsConstructorpublic class MemberController { private final MemberJpaRepository memberJpaRepository; private final MemberRepository memberRepository; private final MemberTestRepository memberTestRepository; // 조회 API 컨트롤러 개발 @GetMapping("/v1/members") public List<MemberTeamDto> searchMemberV1(MemberSearchCondition condition) { return memberJpaRepository.search(condition); } // 단순 페이징 처리 (전체 카운트를 한번에 조회하는 단순한 방법) @GetMapping("/v2/members") public Page<MemberTeamDto> searchMemberV2(MemberSearchCondition condition, Pageable pageable) { return memberRepository.searchPageSimple(condition, pageable); } // 복잡한 페이징 처리 (데이터 내용과 전체 카운트를 별도로 조회하는 방법) @GetMapping("/v3/members") public Page<MemberTeamDto> searchMemberV3(MemberSearchCondition condition, Pageable pageable) { return memberRepository.searchPageComplex(condition, pageable); } // Querydsl 지원 클래스 직접 만들어서 페이징 처리 구현 @GetMapping("/v4/members") public Page<Member> searchMemberV4(MemberSearchCondition condition, Pageable pageable) { return memberTestRepository.applyPagination(condition, pageable); } // Querydsl 지원 클래스 직접 만들어서 페이징 처리 구현2 @GetMapping("/v5/members") public Page<Member> searchMemberV5(MemberSearchCondition condition, Pageable pageable) { return memberTestRepository.applyPagination2(condition, pageable); }} 기존에 searchPageSimple처럼 MemberRepositoryCustom 추가는 아닌거같고.. 아래와 같은 에러가 발생합니다. 기존방법과 좀 다른거같아, 혹시 다르게 설정을 어딘가에 줘야할까요?
- 미해결실전! Querydsl
BooleanBuilder와 BooleanExpression의 차이점이 궁금합니다.
안녕하세요. 강사님. 강의를 보는 도중 궁금한 점이 생겨 문의글 남깁니다. where 다중 조건을 사용하면 좋은 점이 메소드를 사용할 수 있어 재사용이 용이하다고 하셨는데요, BooleanBuilder를 메소드로 빼서 사용하는 것과의 차이점이 궁금합니다.
- 미해결실전! Querydsl
@Transaction에 대해서 질문드드립니다.
안녕하세요? 강사님. 항상 좋은 강의 잘 보고 있습니다. 이번강의를 보면서 에러가 발생하였습니다. Member member = new Member("member1", 10);memberRepository.save(member);Member findMember = memberRepository.findById(member.getId()).get();assertThat(findMember).isEqualTo(member); assertThat부분에서 <"Member(id=1, username=member1, age=10) (Member@1b444b5)"> to be equal to: <"Member(id=1, username=member1, age=10) (Member@5a1a20ae)"> but was not. Expected :Member(id=1, username=member1, age=10) Actual :Member(id=1, username=member1, age=10) 이러한 에러가 발생했습니다. 알고보니 @Transaction 어노테이션을 선언을 안해서 그랬습니다. member와 findMember의 메모리 주소가 달라서 에러가 발생한것 같은데 메모리가 주소가 왜 다른지 잘 이해가 안됩니다. meber객체를 save 하면서 영속성 컨텍스트에 담기고 findMember는 영속성컨텍스트에 담겨있는 member인것이 아아니라 새로 select문을 날려서 디비에서 조회한 값이더라구요( @Transactional이 없을 때 로그를 통해서 확인하였습니다) @Transactional을 선언 하고 save 후 em.flush(); em.clear();를 해준것과 같은 현상이 나더라구요. @Transactional이 롤백외에도 어떠한 기능이 있길래 이러한 현상이 나타나는지 알고 싶습니다. 감사합니다.
- 미해결실전! Querydsl
union 질문 입니다.
안녕하세요 강사님 강의 잘 듣고 있습니다. jqpl 에서는 union 자체를 지원하지 않는 걸로 알고 있는데 지원하지 않는 이유가 union으로 문제를 해결하는게 좋은 로직이 아니어서 일까요? union을 써서 해결해야 하는 것들은 어떤 식으로 해결하는지 궁금합니다!
- 미해결실전! Querydsl
쿼리문 작성 질문입니다!
안녕하세요 강사님! 강의 항상 열심히 듣고 있습니다. 이번에 스프링을 배운김에 토이 프로젝트를 하나 하고 있습니다. 기능중에 준비된 랜덤단어 두 개 로 유저의 닉네임을 랜덤으로 지어주는 기능을 만들려고 합니다. 그래서 랜덤단어X랜덤단어를 만드는거는 쉽지만 user table 에 이미 있는 닉네임이면 클라에 주기 전에 서버에서 먼저 거르는 작업을 하고자 합니다. 랜덤단어 하나를 만들어서 DB에 존재하는지 검사하는 로직을 통과할때까지 while문으로 돌릴까 생각하였지만 db와 연결을 너무 많이 하게 될 것 같아 포기하고 sql문으로 해결할 수 없는지 생각해 보았습니다. 그래서 생각한게 랜덤단어가 들어있는 테이블을 두 개 만들어서 세타조인을 해서 하나의 테이블을 만들고, 유저테이블에서 나온 닉네임과 대칭 차집합을 통해 아직 만들어지지 않은 닉네임들을 후보까지 안전하게 10개를 뽑아서 클라에 넘겨주자는 생각을 했습니다. 그래서 대칭 차집합 쿼리를 찾아보니 SELECT str FROM ( SELECT str FROM tableA UNION ALL SELECT str FROM tableB ) AS tmp GROUP BY str HAVING COUNT(*)=1 이렇게 구현할 수 있다는 것을 알게 되었습니다. 근데 jpql은 FROM 절에 서브쿼리를 적을 수 없어 이것을 구현할 수 없다고 생각했습니다. 혹시 뭔가 다른 구현이 가능한 방법이 있을까 해서 질문 드립니다!
- 미해결실전! Querydsl
jpaqueryfactory 권장 이유를 알 수 있을까요?
안녕하세요. 강의 정말 잘 듣고 있습니다!! 강의를 보면서 jpaqueryfactory를 최근 버전에서 권장하신다고 하셨는데, 혹시 왜 권장되어지고 있는지 이유를 알 수 있을까요?
- 미해결실전! Querydsl
Full outer join 질문있습니다 !
Querydsl로 Full outer join이 가능할까요?
- 미해결실전! Querydsl
join 여러번 할 경우 질문있습니다.
여러 엔티티들과 조인하고 싶으면 .join().join() 이렇게 조인 뒤에다 조인 써서 하면 되나요?
- 미해결실전! Querydsl
select 절에서 필드와 집계함수 동시 나열 문제
강의 예문) List<Tuple> result = queryFactory .select(member.username, JPAExpressions .select(memberSub.age.avg()) .from(memberSub) ) .from(member) .fetch(); 안녕하세요. select(member.age.avg(), member.age.max()) from(member)은 가능한데 위 예문을 select(member.username, member.age.avg()) .from(member)으로 바꿀 수 없는 이유가 무엇일까요?쿼린이라 질문이 초보적인 점 부디 이해를 부탁드립니다.
- 미해결실전! Querydsl
콘솔의 결과 코드와 작성한 jpql 간 차이
강의 예제) 회원과 팀을 조인하면서 팀 이름이 teamA인 팀만 조인, 회원만 모두 조회 위 예제를 가지고 querydsl을 작성하기 전에 먼저 선생님이 JPQL로 작성해주신 구문은 다음과 같은데요. JPQL: select m, t from Member m left join m.team t on t.name = 'teamA'; 테스트 결과 화면 설명해주실 때 콘솔 주석의 jpql은 with가 들어있더라구요. 이 둘이 다른 이유가 있을 것 같은데 무엇 때문일까요? /* select member1, team from Member member1 left join member1.team as team with team.name = ?1 */
- 미해결실전! Querydsl
예문 쿼리 결과 정렬 순서와 containsExactly
안녕하세요! 선생님의 보배로운 강의 넘나 잘 듣고 있습니다. 강의 중에 containsExactly("teamA", "teamB")에 관해 질문이 있는데요. 찾아보니 값만 맞으면 되는 게 아니라 순서도 맞는지 확인하는 것 같은데, 이때 "teamA", "teamB"가 맞으려면 오름차순 정렬이 되어야 하잖아요? 하지만 select ftom where문의 결과는 기본적으로 어떻게 정렬될지 알 수 없는 것 아닌지요?
- 미해결실전! Querydsl
querydsl와 jdbctemplate 의 성능 비교 질문입니다.
안녕하세요 김영한님, querydsl 강의를 수강중인 학생입니다. 수강중에 문득 querydsl 은 동적으로 query 를 만들어주는 도구이다 보니 jdbctemplate 와 querydsl 간의 성능에 따른 차이가 있을것으로 생각되어 검색을 해보았습니다. 아래의 stackover flow 에 기재된 내용으로는 약 6배 정도 차이가 난다고 적혀있는데요 실무에서 이정도의 성능적인 차이가 발생하는지 궁금합니다. https://stackoverflow.com/questions/38123217/performance-tests-between-querydsl-sql-vs-jdbctemplate 만약에 이렇게 성능적으로 차이가 많이 발생하게 된다면 실제 service 단계에서도 서버의 메모리나 확장에 관해서도 많은 리소스가 추가로 투입이 되어야할것 같습니다. 최근들어 쿠버네티스를 통해서 이러한 성능적이슈를 효율적으로 관리한다고 귓동냥으로 듣기는 했습니다. 저의 생각으로는 휴먼리소스를 투입해서 jdbctemplate 으로 코딩 할것인가 아니면 자본을 투입하여 문제를 해결할것인가의 문제로 보여 어떤것에 가치를 두냐에따라 답이 다른것같습니다. 이러한 jpa, jdbctemplate 의 성능적인 관점에서 김영한님 생각이 궁금합니다. 약간은 수업의 방향에 어긋나는것 같은 질문이라 조심스럽습니다... (ps. jpa 와 querydsl 의 성능을 비교하게 비슷할까요..? )
- 미해결실전! Querydsl
Spring Sort를 QueryDSL 변환 적용하는 방법 문의
안녕하세요. 강사님 QueryDSL 재미있게 배웠습니다. 정렬기준을 아래와 같이 받았을 때 pageable 파라미터를 이용해서 QueryDSL에 적용하는 방법에 대해서 고민입니다. 정렬기준 입력 형태: URI?sort=field1,asc&sort=field2,desc org.springframework.data.domain.Sort 방법1. pageable 값을 얻어와 직접 queryDSL에 OrderSpecifier로 지정 if (pageable != null) { query.offset(pageable.getOffset()); query.limit(pageable.getPageSize()); for (Sort.Order o : pageable.getSort()) { PathBuilder<Object> orderByExpression = new PathBuilder<Object>(Object.class, "object"); query.orderBy(new OrderSpecifier(o.isAscending() ? com.mysema.query.types.Order.ASC : com.mysema.query.types.Order.DESC, orderByExpression.get(o.getProperty()))); } } 방법2. applyPagination() 함수로 매핑 getQuerydsl().applyPagination(pageable, jPQLQuery); 결과적으로 방법2가 더 깔끔해 보이는데 원본 엔티티와 DTO객체가 달라서 org.hibernate.hql.internal.ast.QuerySyntaxException이 발생하는 이슈가 있습니다. 현재까지 결론은 방법1을 사용해야할 것으로 보이는데 더 좋은 방법을 아시는지 문의드립니다. 감사합니다.
- 미해결실전! Querydsl
where( , ) 사용시 OR 조건을 사용하는 방법
안녕하세요. return jpaQueryFactory .select(member) .from(member) .where(usernameEq(usernameParam), ageEq(ageParam)) .fetch() 위와 같이 where안에 콤마(,) 를 사용하면 and 조건으로 연결이 되는데요. 혹시 별도의 함수(OR조건으로 묶을수 있도록)를 만들지 않고 간단하게(콤마를 사용하는것 처럼) or 조건으로 연결하는 방법도 있을까요?