30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
test
test할때는 log.info잘 사용 안하나요?
- 미해결실전! Querydsl
안녕하세요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1. start.spring.io 에 Querydsl 을 지원하지 않는 특별한 이유가 있는지 궁금합니다. 그리고 build.gradle 에서 Querydsl 설정이 잘 안된다면 임의로 QHello 파일을 생성하더라도 문제가 없는 것인지 궁금합니다.2. H2 DB 접근 시 localhost 로 변경해서 사용해야 하는 이유가 뭘까요?
- 미해결실전! Querydsl
3.0 querydsl
선생님이 올린 3.0 + querydsl로 다시 gradle했는데 Gradel -> other -> complieQuerydsl이 없는데 상관없는건가요?
- 미해결실전! Querydsl
중첩 객체 조회 관련
안녕하세요! querydsl 강의를 보고 실무에 적용 하던 중 중첩 객체에 대해서 한번의 join query로 만들 수 없을지 궁금하여 질문 드립니다. 만약, A -< B -< C (-< 은 one to many 를 의미) 관계를 가진 객체가 있다고 할 때selectFrom(A) .leftJoin(A.B) .leftJoin(A.B.C) .where(A.id.eq(1)) .fetch();위 코드의 반환 값이 아래와 같기를 희망 하는데요A = { id: 1, Bs: [ { id : 1, Cs : [ { id: 1 } ] } ] }oneToMany를 조인 하게 되면, SQL은 many의 row를 반환하게 되면서, A객체가 B의 갯수만큼 반환 되게 됩니다.group by등을 통해 해결 하려 했을 때는, oneToMany 컬렉션들이 모두 불러와지지 않는것을 확인 하였고, group by를 활용 하지 않고, 모든 row를 불러와서 aggregate하는 방식으로 코드를 구현 했습니다. 매번 쿼리문을 작성할 때 마다 aggregate하는 코드를 작성하는 것은 옳지 않을 것 같아, 혹시 더 나은 방법이 있을지 문의 드립니다. 혹시 중첩 쿼리를 join 으로 모두 찾아 객체에서 맵핑하려는 시도가 bad practice라면 쿼리 숫자가 늘어나더라도, findByAId, findByBId 등의 방식으로 여러번 쿼리를 하고, 중간에 캐시 레이어를 두는것이 더 나을지도 궁금 합니다. 항상 좋은 강의 감사합니다 :)
- 미해결실전! Querydsl
스프링 부트 3.0 + Querydsl 설정 관련
안녕하세요! 강의 잘 듣고 있습니다 감사합니다.강의를 따라가다가 잘 안되는 부분이 있어서 질문글 하나 남겨봅니다.Gradle -> Tasks -> build -> cleanGradle -> Tasks -> other -> compileQuerydsl실행 시에 정상적으로 Q타입 클래스가 생성이 됩니다.그런데 이후에 테스트 코드를 돌려보면이런 오류가 뜹니다.이것저것 해보다가 build파일이 없는 상태에서(삭제 후에) 테스트를 돌리면 돌아가긴 합니다.정상적으로 빌드해서 돌려보고 싶은데 설정을 어떻게 바꿔야 할까요?https://drive.google.com/file/d/1H7Sz9Z994odDceIhuTp9S4bpfvhDjxAr/view?usp=sharing구글 드라이브 링크입니다.
- 미해결실전! Querydsl
update시 JPA와 queryDsl방법 질문드립니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)[질문 내용]안녕하세요 JPA강의와 queryDsl 강의를 모두 들으면서 포폴을 만들던 중 궁금한게 생겨 질문드립니다 . 먼저 질문이 많아서 죄송하고 늘 감사드립니다. 1.질문 jpa에서 update(변경감지를 사용한 방법 )public Team updateTeamInfo(TeamInfoUpdateDto teamInfoUpdateDto) { Team team = em.find(Team.class, teamInfoUpdateDto.getTeamId()); team.setTeamName(teamInfoUpdateDto.getTeamName()); team.setDetailIntro(teamInfoUpdateDto.getDetailIntro()); return team; }2. queryDsl에서 update 방법public long updateTeamInfo(TeamInfoUpdateDto teamInfoUpdateDto) { return queryFactory .update(team) .set(team.teamName, teamInfoUpdateDto.getTeamName()) .where(team.id.eq(teamInfoUpdateDto.getTeamId())) .execute(); }이 두 방법 다 정상적으로 select 쿼리 이후 update쿼리가 나가는것 까지 확인을 했는데, 차이점이라곤 queryDsl의 리턴 값이 long이다 라는 것밖에 확인을 못했습니다. 둘 중 어떤 것이 update를 할 때 사용하는게 좋을지 모르겠어서 질문드립니다.. 그냥 리턴 차이가 전부인지... 2. 질문queryDsl에서 update 쿼리의 리턴 값이 long인데 엔티티 타입으로 리턴할 순 없나요?? 3. 질문2번의 문제로 인해 update쿼리의 겨우 update 로직 이후 리턴 타입은 void로 주고 update한 엔티티를 select해서 엔티티 결과값을 리턴 해주었는데 select 쿼리 한 방 추가로 더 나가긴 하는데 이방법이 괜찮은지 다른 방법이 있는지 궁금합니다.. 감사합니다
- 미해결실전! Querydsl
dto로 바로 가져오는것에대해 궁금한점이 있습니다 .
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 네 (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네 (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? 네 (예/아니오)[질문 내용]강의를 듣기전에는 dto를 select절에서 바로 받는방법이 아닌 , 그대로 뽑아온뒤에 서비스단에서 dto도메인에 만들어둔 생성자펙터리메서드를 사용해서 반환받았습니다 . 리스트 같은경우에는 스트림맵을 사용했었고요 , 혹시 서비스단에서 반환하는방법이 단점이 있어서dto로 바로 받는방법을 사용해야하는건지 , 아니면 그저 선택 ?의 문제인지 알고싶습니다 .
- 미해결실전! Querydsl
join table.as() 테이블 이름을 수정 할 수 있나요 ??
안녕하세요 querydsl 공부중인 김준엽 입니다.chatRoom에 member1 member2 연관 관계가 있다면은 querydsl에 .select(chatRoom) .from(chatRoom) .join(chatRoom.member1, member) .join(chatRoom.member2, member) .fetch(); 있다면 .join(chatRoom.member1, member.as(member1) ) 해서 select에 member1.namemember2.name구분 지어서 표현이 가능한가요 ??
- 미해결실전! Querydsl
Querydsl과 JPQL의 성능차이가 존재하나요?
영한님 안녕하세요!Querydsl 관련해서 몇가지 질문이 있습니다.같이 공부하고 있는 스터디원 분들께서 Querydsl을 사용하면 JPQL에 비해 성능이 좋아진다고 설명해주셨습니다.저는 강의를 듣고 Querydsl을 사용하면 JPQL로 변환되어 쿼리가 나간다고 이해하고 있었습니다. "Querydsl은 결국 JPQL로 변환되어서 DB에 쿼리가 나간다" 가 맞는지 질문드리고 싶습니다.또한 Querydsl의 가장 큰 장점은 컴파일 시점에 에러를 잡을 수 있다는 것이라고 알고 있는데, 성능적인 부분에서의 장점도 있는지 여쭤보고 싶습니다. 감사합니다!!
- 미해결실전! Querydsl
SpringBoot 3.0.2 버전 QueryDSL 설정문제
[질문 내용]안녕하세요. 수강생 김땡땡이라고 합니다.추가로 작성해주신 Spring 3.0 버전 설정을 적용해서 build.gradle을 작성했는데 아래와 같은 에러가 발생하면서 테스트 에러가 발생합니다. 먼저 강의내용과 수업자료를 통해서 Springboot 3.0 이상 버전에서 설정해야되는 부분들을 추가했습니다. javax관련 오류는 뜨지 않습니다. 하지만 다른 문제가 생겼는데요.. gradle >other >compileQuerydsl 을 실행하면, 문제점이 있습니다. compileQuerydsl을 통해서 생성되는 Q Class는 build 경로에만 생기고 src/main에는 생성이 되지 않는다.<build 경로 아래에는 성공적으로 Qclass 가 생성되었습니다.>하지만 src/main아래에는 생성되지 않았네요.. 그래도 build 경로아래에 QClass가 생성되어있으니 간단한 Test는 될 것 같아서 수업 내용을 따라서 작성하고 실행해봤는데. 위와 같은 에러가 발생했습니다. Qclass를 찾지못해 발생하는 오류같은데.. 왜 이런 현상이 생기는지 모르겠습니다. 강사님과 똑같이 작성했는데.. 단순 버전 문제일까요? 이런경우엔 gradle 버전도 상관이 있는건가요? 현재 사용하는 gradle 버전은 확인해보니 7.6입니다. 검색을 많이 해봐도 해결방안이 나오질 않습니다. 도움 부탁드립니다. =======================저의 build.gradle 설정========================plugins { id 'java' id 'org.springframework.boot' version '3.0.2' id 'io.spring.dependency-management' version '1.1.0' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' // Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() } //querydsl 추가 시작 def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClasspath } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } //querydsl 추가 끝 ======================= Hello Entity =============================package study.querydsl.entity; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter public class Hello { @Id @GeneratedValue private Long id; }
- 미해결실전! Querydsl
@RequestBody, @RequestParam을 사용하면 왜 에러가 뜰까요?
안녕하세요!혼자 복습 해보다가 얼떨결에 시도해본 방법인데, 매개변수에@RequestBody를 선언해주고, 포스트맨에서 Body쪽에 값을 넘겨주었는데 에러가 떴습니다.그리고 @RequestBody를 제거한 뒤에, 포스트맨에서는 Param쪽에 값을 넘겨주니 작동이 됐습니다.전 그동안 연습하면서 controller 쪽에 값을 받아올 때는 @RequestBody / @RequestParam / @PathVariable셋중 하나 반드시 넣어줘야 한다고 배웠었는데요. 강의에서 아무것도 선언해주지 않아야 작동 되는 것을 보고 크게 혼란이 왔습니다.강의의 경우 포스트맨에서 쿼리스트링으로 값을 받아오고 있으니 @RequestParam을 넣어줘야 하지 않나요? 이것도 넣으면 마찬가지로 에러가 뜹니다. 왜 그런건가요??
- 미해결실전! Querydsl
QueryDsl만 이용 VS QueryDsl 과 JPA 기본 제공 api를 혼용
다이나믹한 쿼리가 필요한 부분에서만 QueryDSL를 이용하고, 그 외에는 JPA에서 제공되는 기본 api(save 등)를 이용하고 있습니다.그러다 아래와 같은 고민이 생겼습니다...Q. 향후 어떻게 변할지 모를 "확장성"과 "일관성"을 위해, 처음부터 모든 쿼리를 QueryDsl을 이용하는게 좋을까요...?그게 아니라면, 지금 처럼 JPA에서 제공되는 기본 api와 혼용하며 이용하다가 필요할 때마다, QueryDSL을 이용하여 다이나믹 쿼리를 생성하는게 맞을까요...
- 미해결실전! Querydsl
쿼리문 질문입니다.
4:58강의 쿼리문저의 쿼리문영한님은 왜 쿼리문이 2개가 나오나요?/*쿼리문*/쿼리문 총 2번이 찍히는데 환경이 다른 것 일까요,.,.
- 해결됨실전! Querydsl
querydsl 의존성문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. @queryprojection 어노테이션이 쿼리 디에스엘에 의존성에 대한 얘기를 해주셨는데요. 레포지토리에서 쓰는 쿼리디에스엘도 같은 의존성 문제가 있는거 아닌가요 ? 극단적인 예로 치명적인 버그로 쿼리디에스엘을 급히 밀어야 되는 문제라던가 다른걸로 대체를 해야 할때레포지토리에서 사용했던 쿼리펙토리도 모두 바꿔줘야 하는 부분이 아닌가 해서요.
- 해결됨실전! Querydsl
dto로 만들어 바로 조회
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 프로젝션을 보고 있던와중에 궁금증이 생겨서 질문남깁니다. dto로 반환해주고 싶은데 dto가 private final 일 경우 기본 생성자를 만들지 못하는데 이럴땐 final을 풀고 기본생성자를 사용해주는 방법으로 가는게 맞을까요 ? 다른방법이 있으면 추천 부탁드립니다
- 해결됨실전! Querydsl
세타조인 질문입니다.
@Test void theta_join() { em.persist(new Member("teamA")); em.persist(new Member("teamB")); em.persist(new Member("teamC")); List<Member> result = queryFactory .select(member) .from(member) .join(member.team, team) .where(member.username.eq(team.name)) .fetch(); System.out.println("result = " + result); // => result = [] assertThat(result).extracting("username").containsExactly("teamA","teamB"); }위와 같은 쿼리문의 결과는 빈 결과값이 나오는데 이유를 모르겠습니다. 바로 밑의 질문이랑 비슷한데 답변이 잘 이해가 되지 않아 질문을 올렸습니다.
- 미해결실전! Querydsl
강사님! 질문 하나만 할게요! select + from vs selectFrom
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]제목 그대로 select().from()이랑 selectFrom()이랑분명한 차이점이 뭘까요? 경우에 따라 둘 다 사용하시던데 어떤 부분에서 적절하게 골라서 사용해야 할까요?
- 미해결실전! Querydsl
프로퍼티 접근 방법과 setter
안녕하세요 궁금한 부분이 있어 질문 남깁니다 7:58~ 에서프로퍼티 접근은 setter 를 통해 값이 들어가므로@Data 애노테이션을 지우고 직접 getter, setter를 만들어주셨습니다. 저는 setter가 없으면 오류가 날 것이라 생각하여getter, setter를 생성하지 않고 테스트를 해보았는데 정상적으로 실행되더라고요. 오류가 나지 않는 게 맞는지, 그렇다면 이유가 무엇인지 궁금합니다 ㅠㅠ 아래는 실행한 코드입니다public class MemberDto { private String username; private int age; public MemberDto() { } }@Test public void findDtoBySetter() { List<MemberDto> result = queryFactory .select(Projections.bean(MemberDto.class, member.username, member.age)) .from(member) .fetch(); for (MemberDto memberDto : result) { System.out.println("memberDto = " + memberDto); } } +추가.......뒤늦게 MemberDto에 @ToString 을 달아 확인해보았습니다.오류는 나지 않았지만 안에 값은 없었네요 ㅎㅎㅎ.......
- 미해결실전! Querydsl
querydsl dto mapping & subquery 질문 남깁니다.
안녕하세요 열심히 수업듣고 따라하고있는 수강생입니다. 먼저 매번 답변주셔서 감사합니다. 질문으로는 dto mapping 에서 @queryprojection 으로 직접 조회를 해야하는 상황입니다. 글 : 채팅방 1 : N채팅방 : 채팅 1: N 일때 DTO 는 @Data public class QChatRoomDto { private QaType qaApart; private String qaContent; private String searchPlace; private String category; private Long chooseMemberIdx; // 채택 / 미채택 기준 private Long roomIdx; private Long otherMemberIdx; private String otherMemberNickname; private String otherMemberImgDto; private int qaCount; private String modifiedDate; private String recentlyMsg; private String recentlyMsgType; private Long notReadCount; @QueryProjection public QChatRoomDto(String qaContent, String searchPlace, String category, Long chooseMemberIdx, Long roomIdx, Long otherMemberIdx, String otherMemberNickname, String otherMemberImgDto, int qaCount, LocalDateTime modifiedDate, String recentlyMsg, String recentlyMsgType, Long notReadCount) { this.qaApart = QUESTION; this.qaContent = qaContent; this.searchPlace = searchPlace; this.category = category; this.chooseMemberIdx = chooseMemberIdx; this.roomIdx = roomIdx; this.otherMemberIdx = otherMemberIdx; this.otherMemberNickname = otherMemberNickname; this.otherMemberImgDto = otherMemberImgDto; this.qaCount = qaCount; this.modifiedDate = modifiedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); this.recentlyMsg = recentlyMsg; this.recentlyMsgType = recentlyMsgType; this.notReadCount = notReadCount; } } querydsl public Page<QChatRoomDto> myQuestionChatRoomList(Member questionMember, List<Member> blockMembers, QaStatusType qaStatusType, Pageable pageable) { return applyPagination(pageable, contentQuery -> contentQuery .selectDistinct(new QQChatRoomDto( qa.content.as("qaContent"), qa.searchPlace.as("searchPlace"), qa.category.name.as("category"), qa.selectMember.idx.as("chooseMemberIdx"), chatRoom.idx.as("roomIdx"), chatRoom.aMember.idx.as("otherMemberIdx"), chatRoom.aMember.nickname.as("otherMemberNickname"), chatRoom.aMember.memberImg.as("otherMemberImgDto"), chatRoom.qMember.qaList.size().as("qaCount"), chatRoom.modifiedDate.as("modifiedDate"), ExpressionUtils.as( JPAExpressions.select(chat.content) .from(chat) .where(chat.chatRoom.eq(chatRoom), chat.idx.eq( JPAExpressions.select(chat.idx.max()) .from(chat)) ), "recentlyMsg") , ExpressionUtils.as( JPAExpressions.select(chat.chatType) .from(chat) .where(chat.chatRoom.eq(chatRoom), chat.idx.eq( JPAExpressions.select(chat.idx.max()) .from(chat)) ), "recentlyMsgType"), ExpressionUtils.as( JPAExpressions.select(chat.count()) .from(chat) .where(chat.chatRoom.eq(chatRoom), chat.member.ne(questionMember), chat.readMsg.isFalse()), "notReadCount") ) ) .from(chatRoom) .join(chatRoom.qa, qa) .join(chatRoom.aMember, member) .where(chatRoom.qMember.eq(questionMember), isQaSelectMember(questionMember, qaStatusType), blockAMembersNotIn(blockMembers), chatRoom.idx.notIn( JPAExpressions.select(chatRoom.idx) .from(chatRoom) .where(chatRoom.isLeave.contains("_" + questionMember.getIdx() + "_"))), member.phoneNum.isNotNull() ) .orderBy(chatRoom.modifiedDate.desc())); }이렇게 작업을 했습니다. 매우 이상한 쿼리이겠지만 저한텐 이게 최선이었습니다 ㅠ여기서 궁금한점은 채팅룸 리스트를 뽑아야 하는데 recentlyMsg, recentlyMsgType채팅 리스트의 최근 데이터를 가지고 오고싶었으나 subQuery에서 limit 1 이 먹히지 않아 저런 괴랄한? 쿼리를 만들어 작동은 되게 만들었습니다. 해서 dto mapping 할때 컬렉션 리스트를 뽑는 다른 방법이 있는지 궁금합니다. chatRoom.chatlist 를 반환하여 queryprojection에서 가공하려 했지만 에러가 뜨면서 chatList는 반환이 안되어 질문글 남깁니다. 감사합니다.
- 미해결실전! Querydsl
count query 질문입니다
[질문 내용]아래처럼 List<MemberTeamDto> 를 쿼리해올때, 최적화를 위해 count query 를 따로 작성하셨는데, 왜 result.size() 로 바로 total count 값을 가져오면 안되는건지 궁금합니다! 이유가 무엇인가요?List<MemberTeamDto> result = 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();