실전! Querydsl
실전! Querydsl
수강정보
(55개의 수강평)
995명의 수강생
스킬태그 #Back-End, #Java, #jQuery, #JPA
5개월 할부시
월 17,600원88,000원
지식공유자 : 김영한
41회 수업 · 총 6시간 24분 수업
기간 : 평생 무제한 시청
수료증 : 발급 강의
수강 난이도 : 중급이상
남기석 프로필

쿼리 dsl fetch join에 대해서 여쭤보고 싶습니다. 남기석 6일 전
안녕하세요 선생님. 배운내용을 더 잘 알고싶어서 이것저것 복습해보다 보니 자꾸 질문을 하게되네요 ㅎㅎ;; 쿼리 dsl을 이전 활용편에선 다룬 예제에 적용시켜보려다 자꾸 오류가 나서 질문을 남깁니다. @Overridepublic List<OrderDto> search() { List<OrderDto> dtos = queryFactory .select(Projections.constructor(OrderDto.class, order.id, member.username, order.orderDate, order.status, delivery.address, order.orderItems)) .from(order) .join(order.member, member).fetchJoin() .join(order.delivery, delivery).fetchJoin() .join(order.orderItems, orderItem).fetchJoin() .join(orderItem.item,item).fetchJoin() .fetch(); return dtos; }  .join(orderItem.item,item).fetchJoin() 이 부분이 잘못된것같은데 어떻게 처리를 해야하는것인지 감이 안잡히네요. "select distinct o from Order o join fetch o.delivery join fetch o.member" + " join fetch o.orderItems oi join fetch oi.item" 위 쿼리를  쿼리dsl로 해볼려고 했습니다. 추가로 join을 한 줄로 처리할 수도 있는지 여쭤보고 싶습니다. 혹시 질문이 이상하거나 애매모호하다면 알려주시면 감사하겠습니다!

3
남기석 프로필

where 절에서 or 을 어떻게 사용하면 되는 지 여쭤보고 싶습니다. 남기석 11일 전
안녕하세요 강사님 . 복습하면서 여쭤보고 싶은점이 생겨서 글을 남깁니다. @BeforeEachpublic void before(){ 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);} 처럼 기본으로 데이터에서 @Testpublic void searchAndParam(){ JPAQueryFactory queryFactory = new JPAQueryFactory(em); Member findMember = queryFactory .selectFrom(member) .where( member.username.eq("member1"), member.age.eq(10) .or(member.age.eq(20)) ) .fetchOne(); Assertions.assertThat(findMember.getUsername()).isEqualTo("member1");} 제가 하고 싶었던 것은    이름이 member1이면서 나이가 10살이거나   //  나이가 20살인 사람을 선택하려고 했습니다. //member member0_ where member0_.username='member1' and (member0_.age=10 or member0_.age=20); 아쉽게도 생각과 다르게 나왔습니다. 아직 배우는 입장이다보니 어떻게짜면 원하는 결과를 얻을 수 있는지 모르겠네요. 벌써 querydsl까지 왔습니다. 덕분에 좋은 강의 정말 잘 듣고있습니다. 감사합니다!.

2
bow77 Rain 프로필

영한 선생님, 테이블 설계 방법, index잡는 방법등에 대한 책을 추천받을 수 있을까요? bow77 Rain 16일 전
관계형 데이터베이스에 대해서 기본적인 테이블 설계 방법이나, index를 잡는 방법 등을 공부해두시면 좋을거에요. 결국 실무에서는 관계형 데이터베이스를 사용하고, 설계하고, index 때문에 고민할 일이 정말 많거든요. 그리고 꼭! 지금 시점에 토이 프로젝트를 한번 해보시는 것을 추천합니다. 작은 프로젝트라도 본인이 스스로 생각한 것을 가지고 만들어보면 진짜 자기것이 되거든요. 영한선생님! 죄송합니다만, 강의와 관련없는 질문 한가지만 여쭙겠습니다 ㅠㅠ.. 지금 현재도 토이 프로젝트를 진행중인데, 어느정도 돌아가게는 관계형 테이블을 설계할 수 있지만 좀 더 잘 할 수 있는 방법이 있지 않을까 계속 고민하게 되고, 더 공부하고 싶은 마음이 큽니다. 그런데, 데이터 베이스 책 같은 경우엔 SQL에 대한 내용은 쉽게 접할 수 있지만 설계에 대한 책은 제가 한동안 찾아보았지만 쉽지 않았던거같아요. 그리고, 찾은 내용도 제게 맞는것인지 확신이 들지 않습니다. 혹시 괜찮으시다면 말씀해주신 기본적인 테이블 설계 방법, index를 잡는 방법 등 말씀해주신 내용에 대한 강의나 책 2~3가지 정도 추천해주실 수 있을까요?  그리고 답변 작성 감사드립니다.

1
김기현 프로필

사용자 정의 리포지토리 구성을 조금 변경해 보았습니다 김기현 18일 전
안녕하세요! 질문에 앞서 좋은 강의 정말 감사드립니다!!  다름이아니라 아래와 같이 사용자 리포지토리를 구성해보았습니다 interface 안에 public 을 선언하지 않은 구현체도 한꺼번에 집어넣어 파일추가에 대한 부담을 줄여봤는데 어떻게 생각하시는지 의견 부탁드립니다!!  아래는 코드일부분을 캡쳐하였습니다 작업에 참고했던 문서 link 입니다 https://docs.spring.io/spring-data/jpa/docs/2.1.3.RELEASE/reference/html/#core.extensions.querydsl

3
YunJin Choi 프로필

Member Entity 관련 YunJin Choi 23일 전
Member Entity에서 생성자로 Entity를 만들때  if(team != null ) {     changeTeam(team) } 이라고만되있는데 실습예제에서는 db에 team이 잘들어가는거같은데 . 저는 else {this.team = team}을 추가해서 했는데 다른 뭔가가 있는건가요 ??

3
최홍준 프로필

fetch join 관련 질문 드립니다!! 최홍준 24일 전
안녕하세요 영한님 올려주시는 강의를 들으며 JPA와 queryDsl을 공부중 입니다. 좋은 강의 감사합니다 :) 이것저것 해보는 과정중에 궁금증이 생겨 질문 드립니다. 먼저 Team 과 Member 엔티티를 단순화 해 보았습니다. @Entity public class Team {     @Id @GeneratedValue     @Column(name = "team_id")     private Long id;     private String name;     private Integer rank;     @OneToMany(mappedBy = "team")     List<Member> members = new ArrayList<>(); } @Entity public class Member {     @Id     @GeneratedValue     @Column(name = "member_id")     private Long id;     private String username;     private int age;     @ManyToOne(fetch = FetchType.LAZY)     @JoinColumn(name = "team_id")     private Team team; } (질문 1) Team과 Member는 서로 Lazy로 설정해 두었는데요 (Team에 rank 필드를 추가해 보았습니다.) 만약, Team을 조회 할때는 항상 Member가 필요 하다고 가정을 한다면(fetchJoin) rank가 5이상인 Team을 조회를 하면서 (Team은 항상 조회 -> left join) Team에 속한 Member의 나이가 20살 이상인 데이터를 즉시 조회 하고 싶다면 어떻게 작성 해야 할까요? 예를 들어 위의 조건은 sql로 아래와 같이 사용할수 있습니다. select * from team left join member on (team.id = member.id and member.age > 20) where team.rank > 5 위의 쿼리를 querydsl로 작성 한다면 아래와 같이 작성 가능 할것 같은데요 (fetchJoin 사용) QTeam team = QTeam.team; QMember member = QMember.member; JPAQUERY<Team> query = queryFactory.selectFrom(team)         .distinct(); query.leftJoin(team.members, member)         .on(member.age.gt(20))         .fetchJoin(); query.where(team.rank.gt(5)); 하지만 이를 querydsl로 작성하면 아래와 같은 오류가 발생합니다. witch-clause not allowed on fetched associations 찾아보니까 fetch 조인을 사용할 때는 on절을 사용할수 없다고 하더라구요.. 이런경우에 어떤 방법으로 해결할 수 있을까요? (질문 2) 아래 와 같이 조회를 했을때 QTeam team = QTeam.team; QMember member = QMember.member; JPAQUERY<Team> query = queryFactory.selectForm(team)         .distinct(); query.leftJoin(team.members, member) query.where(team.name.eq("AAA")         .and(member.age > 20)); Team의 데이터를 꺼내보면 ( name = 'AAA' ) 조건이 잘 적용되어 팀 이름이 AAA인 팀만 조회가 됩니다. 문제는 Lazy설정된 Member를 get() 할 때 인데요 Team.members를 get() 하면 Lazy 로딩이기 때문에 select 쿼리가 각각 다시 발생하는데 이때 ( age > 20 ) 조건이 적용 되지 않고 AAA Team에 속한 모든 Member가 조회 되어 집니다. 같은 트렌젝션에서 수행이 된다면  Member을 get()할때  ( age > 20 ) 조건이 적용될꺼라 생각했는데 조건 적용없이 모든 Member를 조회 해서 당황 스럽네요 이부분은 왜 조건문이 적용되지 않은 결과가 get() 되는 건가요?

7
mindone 프로필

동일 entity , table 다중 leftJoin시 방법 mindone 1달 전
안녕하세요 강의 잘듣고 있습니다. 강의를 따라서 실무에 적용하려고 하는데 어려움이 생겨 질문드립니다.  공통 코드성 테이블(CM_CDE)를 이용하려고 하는데  어떻게 이용하는지 몰라 여쭙니다.  Q >>  leftJoin을 같은 entity, 테이블로 두번 조인을 할려고 합니다. CM_CDE로 조건값을 다르게하고 두번 조인하려고 하는데 상위의 조건값(civPetTyp) 하나만 조인이 됩니다.  두번 하는 방법이 있을까요?  [[현재  작성문]] [[결과 쿼리]] [[원하는 쿼리형태]] select cmpt0_.CMPT_SN as col_0_0_, cmpt0_.CIV_PET_TYP as col_1_0_, cmpt0_.RCP_TYP as col_2_0_, cnstldg1_.CNT_NAM as col_3_0_, cnstdre3_.DRE_WRK_AMT as col_4_0_, code4_.CDE_NAM as col_5_0_, code5_.RSRV02 as col_6_0_ from MG_CMPT_MNG cmpt0_ left outer join MG_CNST_LDG cnstldg1_ on cmpt0_.CNT_SN=cnstldg1_.CNT_SN left outer join MG_CMPT_FTR cmptftr2_ on ( cmpt0_.CMPT_SN=cmptftr2_.CMPT_SN ) left outer join MG_CNST_DRE cnstdre3_ on ( cnstldg1_.CNT_SN=cnstdre3_.CNT_SN ) left outer join CM_CDE code4_ on ( code4_.CDE=cmpt0_.CIV_PET_TYP and code4_.GRP_CDE='CMP_ACTY_CDE' ) left outer join CM_CDE code5_ on ( code5_.CDE=cmpt0_.TRT_ARA and code5_.GRP_CDE='HJD_CDE' )

2
유근일 프로필

Union 사용이 가능할까요?? 유근일 1달 전
안녕하세요. 강의 잘 듣고 있습니다. 강의 내용 중에 Union에 대한 내용을 아직 확인하지 못했습니다. (혹시 있었다면 죄송합니다;; ) 혹시 Querydsl 기반으로 Union 사용이 가능할까요?? 구글링을 해보면 com.querydsl.sql.SQLExpressions 등등으로 제공되는 함수가 보이긴 하는데  com.querydsl.sql 하위 라이브러리는 왠지 JPQL이 아닌 nativeSQL 기반인거 같아서 사용이 꺼려집니다. 혹시 JPQL 기반으로 union 기능이 있는지?  아니면 구현으로 커버할 수 있는 방법이 있을까요?? 매번 답변 감사합니다.

1
김대호 프로필

그래들설정에 문제가 생겼을때 어떻게해결해야하나요? 김대호 1달 전
너무막연한 질문이지만 그래들설정에서 문제가 생기면 어떻게 해결해샤하나요? 그래들 설정을 load하면 버전warning이뜨고, 변경하면 다른 dependency 의 버전warning이 뜹니다. 해결이 안되고 계속 반복삽질하고 있는데, 이런경우 어떻게 해결해야 하나요?

2
김태정 프로필

DTO 파라미터 방식 김태정 1달 전
안녕하세요 영한님, 항상 좋은 강의를 만들어 주셔서 감사합니다! 이번강의를 보다 의문점이 들었는데, 이전 강의에서 DTO 생성자 파라미터에 엔티티를 그대로 넣은 방식은 아무런 문제가 되지 않는다는 말씀을 들었던 기억이 있습니다.  이후의 확장성, 변동성을 생각했을때 이 방식이 정말 최고라고 생각 했었는데요,  같이 프로젝트를 진행하던 팀원이 DTO 생성자 파라미터에 엔티티 자체를 넣는 방식이 오히려 DTO를 들어가봐야 내부속성을 알기때문에 가독성이 떨어지지 않느냐는 얘기를 하였습니다. 서론이 길었네요, 프로젝션의 생성자 방식에서 생성자 파라미터에 엔티티 자체를 넣는것과 엔티티의 속성을 넣는것 중 어느 것이 실무에 더 잘쓰일까요..? 혹시몰라 코드 남김니다! @Testpublic void findDtoByConstructor(){ List<MemberDto> result = queryFactory .select(Projections.constructor(MemberDto.class, member.username, member.age)) .from(member) .fetch(); for (MemberDto memberDto : result) { System.out.println("memberDto = " + memberDto); }}@Testpublic void findUserDtoByConstructor(){ List<UserDto> result = queryFactory .select(Projections.constructor(UserDto.class, member)) .from(member) .fetch(); for (UserDto userDto : result) { System.out.println("memberDto = " + userDto); }}

3
이한솔 프로필

PostgreSQL기반에서 LocalDateTime 비교문을 테스트시 제대로 동작을 안합니다. 이한솔 1달 전
안녕하세요! 강의를 통해 배운 지식을 통해 영상및 텍스트 채팅 프로그램을 만들고 있습니다.  여기서 안읽은 메세지를 구하기위해서 내가 마지막으로 해당 방에서 메세지를 읽은 시간을 저장하고 있고,  그 시간보다 큰 시간대의 메세지를 조회해오는 쿼리입니다.  첫번째 이미지에서 보시는 것처럼 message 에서 updateAt이 마지막 메세지를 읽은 시각(lastReadAt)보다 큰 메세지를 조회해오는 쿼리인데, 실제 실행쿼리문을 보면 아래 두번째 사진처럼 나옵니다.  근데 이렇게 쿼리를 하게 될 경우 비교조건문이 제대로 동작을 하지 않습니다.  저기서 '2020-08-07T07:12:09.602+0900' 뒤나 앞에 `::timestamp`를 붙혀줘서 캐스팅을 해줘야 제대로된 결과가 나옵니다. 이럴경우 queryDSL로 해결을 하려면 어떻게 해야할까요? 

3
유근일 프로필

@Query vs QueryDSL 유근일 1달 전
안녕하세요. 강의 잘 듣고 있습니다. 거의 강의를 다 듣고 있는데요...한가지 아직 해결되지 않는 고민이 있어 질문 드립니다. 실무에서 개발가이드를 작성중에 있는데요... 기본적으로 Spring Data JPA 기반으로 제공되는 method와 추가 정의한 Query Method 기능을 사용하고 조건이 3개 이상이거나 복잡한 쿼리 같은 경우 @Query 기능이나 QueryDSL을 사용하려 합니다. 다만, @Query 를 사용해야 하는경우와 QueryDSL을 사용해야 하는 경우를 명확하게 구분해서 가이드하고 싶은데요... (개발자분들이 관련 경험이 없어 가이드에 의존해야 하므로) 일반적으로 QueryDSL이 JPQL을 모두 커버하고 type-safe 하기 때문에 QueryDSL을 우선 권장을 할수 있을것 같은데요... 그래도 제 생각엔 @Query를 사용한 JPQL을 직접 작성하는 경우도 많이 사용할 것 같아서 실무에선 어떠셨는지 문의 드립니다. 질문을 요약하자면, 1. QueryDSL 보다 @Query를 통한 JPQL을 직접 작성 하는게 더 나은 경우가 있는지? 2. QueryDSL와  @Query 사용을 병행하는 경우 이에 대한 사용 기준을 어떻게 잡을 수 있는지?    입니다. 혹시 실무 경험 공유가 어려우시다면... 일반적인 경우는 어떤지 문의 드립니다. 감사합니다. 

2
유근일 프로필

QueryDSL의 Custom Repository 작성 관련 질문이 있습니다. 유근일 1달 전
강의 내용 중에 Custom Repository 작성할 때 구현 클래스는 기존에 JpaRepository를 상속하고 있는 인터페이스명 + Impl을 붙여야 한다고 하셨는데요... ex) ARepository, ARepositoryCustom, ARepositoryImpl 근데 제가 테스트 했을 경우 아래와 같이 작성해도 동작에 문제가 없는것 처럼 확인이 되었습니다. ex) ARepository, ARepositoryCustom, ARepositoryCustomImpl (일반적으로 구현클래스는 구현 대상을 정의한 인터페이스명에 +Impl을 붙이기 때문에 이와 같이 접근함) 그래서 spring 문서를 확인해 봤는데 해당 문서에도 JpaRepository를 상속받고 있는 인터페이스명에 Impl을 추가해서 QueryDSL 구현 클래스 명을 정하라는 내용을 확인하지 못했습니다. interface UserRepository extends CrudRepository<User, Long>, CustomizedUserRepository { class CustomizedUserRepositoryImpl implements CustomizedUserRepository { https://docs.spring.io/spring-data/jpa/docs/2.1.3.RELEASE/reference/html/#repositories.custom-implementations 제가 잘못이해하고 있는 부분일지 문의 드립니다. 감사합니다.

2
kelvin 프로필

queryDsl where절 오류 문의 kelvin 1달 전
안녕하세요. 강의 열심히 듣고 있습니다.! queryDsl을 듣고 토이플젝으로 적용중에 이슈가 생겨 문의 드립니다. jpaQueryFactory.select(game) .distinct() .from(game) .leftJoin(game.gameInfo, gameInfo).fetchJoin() .leftJoin(game.charactors, charactor).fetchJoin() .where(game.gameId.eq(gameId)) .fetchOne(); 위와 같이 작업 후 테스트 코드를 돌리면 "java.lang.UnsupportedOperationException" 와같이 에러가 납니다. 에러 내용은 데이터를 가져와 vo에 넣을때 발생되는 이슈인데... where절을 빼면 이상 없는데 where절만 넣으면 위와 같은 이슈가 생깁니다. db에서 조회한 gameId를 넣어 준건데 왜 생기는지.... 도저히 알기 어려워 문의 드립니다. 문의가 좀 내용이 부족하지만 확인 부탁 드립니다.

3
edu 프로필

querydsl 로 @CreationTimestamp 사용이 가능한가요? edu 1달 전
안녕하세요. 강의를 보고 querydsl 을 실무에 적용하고자 학습중이었습니다.  실제로 적용하고 querydsl 로 업데이트 쿼리를 만들어 시도하니 정상적으로 작동하긴 했지만 Entity에 정의된 @UpdateTimestamp 라던가 Audit를 이용한 @LastModified가 무시되는걸로 확인됐습니다. 혹시나 해서 테스트코드를 짜보니, 엔터티를 검색하여 가져온 다음 set을 하는 경우엔 위의 기능들이 동작했지만 querydsl 의 update....execute() 를 사용할 경우 안되더군요. querydsl 을 사용하여 저 기능들을  활용할 방법이 있을까요? 만약 없다면 어떻게 해야하나요? 참고로 현재 사용중인 프로젝트 버전은 스프링부트 1.5.8 이며 JPA 2.1 , Hibernate는 5.2.18, querydsl 4.1.3 버전입니다.

2
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스