30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
안녕하세요 궁금한 것이 있어서 질문 남깁니다
안녕하세요 프로젝트를 하다보니 궁금한게 생겼습니다. 파일과 패키지 위치에 관한 것입니다 querydsl로 작성된 repository 는 domain layer인지 아니면 persistence layer 인가에 대한 궁금증입니다. 제 생각엔 jpa repository는 인터페이스이므로 도메인이라 볼 수 있을 것 같은데 querydsl 로 직접 작성된 쿼리가 있는 querydsl repository는 애매한 것 같습니다 (jpa repository 가 상속받지 않게 만들었습니다) web-domain-persistence 의 계층이라고 본다면 쿼리가 직접 작성되어 있으니 persistence layer가 맞을 것 같습니다. 그렇다고 굳이 인터페이스와 구현으로 나눠서 인터페이스는 도메인, 구현부는 persistence layer 로 가는게 맞나 싶기도 합니다. https://jojoldu.tistory.com/372이 블로그를 참고해봤는데 그냥 두 개 다 도메인에 두시기도 하시네요 영한님의 의견이 궁금합니다!
- 미해결실전! Querydsl
queryDSL 다중DB에 대해서 질문드립니다.
안녕하세요 선생님의 querydsl 강의를 수강하고 현업에서 적용을 하고 있는 개발자입니다. 위의 sql은 2개의 다른DB의 테이블을 조인하는 쿼리문인데요. fenoteDB.st_send는 fenoteDB의 st_send 테이블이고fe_order는 femarketDB의 fe_order 테이블입니다. 이를 queryDSL로 바꾸는 작업을 하고 있는데 구글링을 많이 해봤지만 2개의 DB의 경우 서로다른 엔티티를 사용하는 경우에 대한 자료만 나오고 따라서 위의 사진과 같은 쿼리를 querydsl로 바꾸는 자료가 나오질 않는데요. 계속 방법을 찾다 결국 영한 선생님께 도움을 청하게 되었습니다..혹시 이와 관련된 자료가 있으면 부탁드려도 될까요? 아니면 아예 방법이 없는 건지 알고 싶습니다!
- 미해결실전! Querydsl
BeforeEach에서 데이터를 제공할때 캐시를 비우지 않아도 될까요?
BeforeEach 어노테이션된 메소드를 이용해서 데이터를 제공할때 em.flush(); em.clear()를 수행해서 DB동기화를 하고 최종적으로 컨텍스트를 비워주는 작업이 필요치 않는지요? Test가 수행될때, 1차 캐시에 의존하게 되면 부정확하게 맺어진 양방향 연관관계 등이 있을때, 이를 테스트로 발견하기 어렵게 되지 않을까 라는 생각이 들었습니다.
- 미해결실전! Querydsl
sql 로그 질문
영한님 안녕하세요. 오늘 2번째 질문이네요..핫.. 다름이 아니라 제 sql 쿼리가 줄 바꿈 없이 쭉 한줄로 출력됩니다. 학습하기에 너무 불편해서 바꾸고 싶은데 구글링을 해봐도 관련 사항이 보이지 않아서 여기에 질문하게 되었습니다. 혹시 쿼리문을 보기 쉽도록 바꾸려면 어떤 설정을 추가해야할까요?
- 미해결실전! Querydsl
Member의 pk질문
영한님 안녕하세요. 먼저 항상 좋은 강의를 제공해주시는 점 깊은 감사의 말씀 드립니다.사실 질문이 querydsl보다는 다른 것과 관계된 질문일 수 있을 것 같습니다. 현재 코드에서 member가 1~4까지 만들어졌는데 왜 db의 pk는 3~6이 되는 것인가요? 제 생각대로라면 당연히 pk가 1부터 4가 되어야할 것 같습니다.
- 미해결실전! Querydsl
group by 시, count 하는 방법 문의
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. group by 할때 전체의 raw count 를 찾고싶은데요 그래서 제가 작업한거의 샘플입니다.. List<Long> fetch = queryFactory.select( A.sId ) .from(A) .leftJoin(b).on(b.id.eq(A.bId), b.deleteDate.isNull()) .leftJoin(s).on(s.id.eq(A.sId), s.deleteDate.isNull()) .where( likeBTitle(where.getBT()), eqSN(where.getSN()), eqBI(where.getBI()), eqId(where.getSI()), goeSDate(where.getSD()), loeEDate(where.getED()) ) .groupBy(date, A.sId, A.bId) .fetch(); return fetch.size(); 이게 제가 생각하는 한계인데 혹시 이것보다 더 좋은 방법이 있을까요ㅠㅠㅠ 위에 제가 작업해 놓은거는 데이터 양이 많아지면 서버에 무리가 갈것같아서.. 많이 구글링을 해보았는데요 잘 모르겠습니다ㅠㅠ
- 미해결실전! Querydsl
Spring Data JPA 날짜 비교
Spring Data JPA 날짜 비교 문의드립니다. List<BbsContents> all = bbsContentsRepository.findAllByDelYnAndImagePathNotNullAndImagePathNotContainingAndCreatedAtGreaterThan(YnType.N, "thumb", LocalDateTime.of(LocalDate.now().minusMonths(6), LocalTime.of(0,0,0))); 이런 식으로 쿼리를 작성했습니다. reg_dtm 은 LocalDateTime 입니다. @Column(name = "REG_DTM")private LocalDateTime createdAt; 실제 쿼리는 아래와 같이 생성되는데요. 제가 원하는 것은 reg_dtm>'2021-08-03 00:00:00.000' 인데, 아래와 같이 쿼리가 생성되어 원하는 결과가 나오지 않습니다. 혹시 원인이나 해결 방법을 찾을 수 있을까요? where bbscontent0_.del_yn='N' and (bbscontent0_.rep_img_file_path_nm is not null) and (bbscontent0_.rep_img_file_path_nm not like '%thumb%' escape '\') and bbscontent0_.reg_dtm>'08/03/2021 00:00:00.000'
- 미해결실전! Querydsl
fetchResults, fetchCount deprecated
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]fetchResults, fetchCount deprecated 되었는데, 그래도 알려주신대로 써야할지 아님 다른 대안이 있는지 궁금합니다.
- 해결됨실전! Querydsl
JPA, Querdsl 환경에서 팬텀리드는 어떻게 방지하나요?
안녕하세요. 초보개발자 명아주입니다. 새해복많이 받으세요! 이번에 QueryDSL 를 이용한 페이징 기능을 공부하면서 느꼈던 의문점이 있습니다. 일반적인 경우 쿼리가 2번 나가게 되는데, 그 사이에 팬텀리드가 발생한다면 어떻게 막을수 있을지 입니다. 어디서 언뜻 보기로, JPA 가 어플리케이션 레벨에서 Repeatable Read를 보장해준다고 봤었던것 같습니다. 물론 Repeatable Read더라도 phantom Read가 발생하는 걸로 알고 있지만요. 그래서 실무에서 이런 phantom read가 발생하는 걸 겪으신 경험이나 어떻게 해결하셨었는지 궁금합니다! 감사합니다!
- 해결됨실전! Querydsl
QueryProjection 수동으로 만들면 어떨까요?
안녕하세요! 초보개발자 명아주입니다. QueryProejction 사용 시, DTO가 QueryDSL 에 의존적인게 단점이라고 하셨습니다. 그 외에는 컴파일 레벨에서 체크할 수 있다는게 정말 큰 장점인 것 같습니다. 그래서 혹시 의존성을 갖지 않으면서 이걸 사용할 방법이 없을까? 라는 의문으로 한가지 테스트를 해보고 찾은 해결 방법은 CustomQUserDto 를 직접 만들어서 쓰면 어떨까 싶습니다. CustomQUserDto는 레포지토리 계층에서만 쓰고, 반환값은 UserDto로 나가니까 서비스에서는 CustomQUserDto를 몰라도 상관이 없을것 같다고 생각했습니다. package study.querydsl.repository.dto;import com.querydsl.core.types.ConstructorExpression;import com.querydsl.core.types.Expression;import com.querydsl.dto.UserDto;public class CustomQUserDto extends ConstructorExpression<UserDto> { public CustomQUserDto(Expression<String> name, Expression<Integer> age) { super(UserDto.class, new Class<?>[]{String.class, int.class}, name, age); //혹은 심플하게 super(UserDto.class, name, age); 라고 해도 됩니다. }} 샘플코드는 자동생성된 QMemberDto를 참고해서 이렇게 짜봤습니다. serialVersionUID는 어떻게 처리해야될지 몰라서 없앴고 없어도 테스트 상에서는 문제없었습니다. @Testpublic void findUserDtoByManualQueryProjection() throws Exception { //given //when List<UserDto> result = query .select(new CustomQUserDto(member.username, member.age)) .from(member) .fetch(); //then for (UserDto userDto : result) { System.out.println("userDto = " + userDto); }} 위처럼 테스트를 진행해봤을때 정상적으로 동작하는걸 확인했는데요. 혹시 이런식으로 QueryProjectionDto를 수동으로 만들어서 사용하시는 경우가 있으신지 궁금합니다. 감사합니다. 명아주 드림 새해 복많이 받으세요~~~~ p.s 한가지 질문드리고 싶은점이 있는데, 강의들으면서 따라 치는 코드를 깃허브에 올리고 있는데 혹시 문제가 된다면 비공개 레포로 변경하려고 합니다. 답변 주시는 대로 원하시는대로 처리하겠습니다!
- 미해결실전! Querydsl
querydsl 작성과 최적화에 문제가 있습니다! 도와주세요!
해당 유저(to_user)가 팔로우한 유저(from_user)가 작성한 모든 게시글(playlist)을 가져오는 쿼리를 작성하고 싶습니다. 정확히 말씀드리자면 작성은 하고 제대로 가져는 오는데 오답같습니다... public List<Playlist> findFolloweesMakePlaylist(Long userSeq){ return jpaQueryFactory .selectFrom(playlist) .join(userLikes).fetchJoin() .on(playlist.user.userSeq.eq(userLikes.toUser.userSeq)) .where(userLikes.fromUser.userSeq.eq(userSeq)) .fetch();} 제가 작성한 코드는 위와 같습니다. 나의 userId인 userSeq를 받아서 게시글 작성자 ID와 내가 좋아요 한 사람ID가 같은 부분을 on절로 join 하고, 플레이리스트 작성한 사람에게 좋아요를 한 사람이 저인지 where절로 체크하였습니다. 테스트 돌리면 답은 나오지만 team member처럼 직접적으로 이어져있지 않으니 join 과정에서 막대한 곱하기 연산이 나올것 같고 애초에 잘못짠것 같습니다... 도와주세요!
- 해결됨실전! Querydsl
countQuery 질문(질문수정)
countQuery는 count할 때, 쿼리 최적화를 위해서 하는 걸로 알고 있는데 public Page<MemberTeamDto> searchPageComplex(MemberSearchCondition condition, Pageable pageable) { List<MemberTeamDto> content = queryFactory .select(new QMemberTeamDto(member.id.as("memberId"), member.username.as("memberName"), member.age, team.id.as("teamId"), team.name.as("teamName"))) .from(member) .leftJoin(member.team, team) .where(member.username.eq(condition.getUsername()), team.name.eq(condition.getTeamName()), member.age.goe(condition.getAgeGoe()), member.age.loe(condition.getAgeLoe())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); JPAQuery<Member> countQuery = queryFactory .selectFrom(member) .leftJoin(member.team, team) .where(member.username.eq(condition.getUsername()), team.name.eq(condition.getTeamName()), member.age.goe(condition.getAgeGoe()), member.age.loe(condition.getAgeLoe())); return PageableExecutionUtils.getPage(content, pageable, () -> countQuery.fetchCount()); } 어차피 실행될 List<MemberDto> content = queryFactory.select(..생략.. 에다가 long count = content.size(); 하면 count가 나오지만 위처럼 굳이 countQuery를 짜서 쓰는 건 PageableExecutionUtils.getPage(content, pageable, () -> countQuery.fetchCount()); 오직 이 기능 때문인가요 ?
- 미해결실전! Querydsl
안녕하세요 영한님!
안녕하세요 영한님! Fecthjoin에 대해서 하나 여쭤보고 싶습니다! 모델 : @Entity@Table(name = "articles")class Article( @field:Id @field:GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long?, @field:ManyToOne(fetch = FetchType.LAZY) @field:JoinColumn(name = "user_id") val user: User,) : BaseTimeEntity() @Entity@Table(name = "users")class User( @field:Id @field:Column(length = 64, name = "user_id") val userId: String, @field:ManyToOne(fetch = FetchType.LAZY) @field:JoinColumn(name = "profile_image_id") var image: Image? = null) : BaseTimeEntity() @Entity@Table(name = "images")class Image( @field:Id @field:GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null,) 목적 : article을 가져올 때 article의 user와 user의 image까지 한 번에 가져오는 것입니다! 처음엔 아래처럼 유저와 이미지를 단순 Join을 했더니 게시글을 찾아올 수 없었는데 그 이유가 무엇일지 여쭤보고 싶습니다. override fun findByIdWithBoardUserAndUserImage(id: Long): Article? { return queryFactory.selectFrom(article) .where(article.id.eq(id)) .join(article.board, board).fetchJoin() .join(article.user, user).fetchJoin() .join(user.image,image).fetchJoin() .fetchOne()} 개인적으로 고민도 해봤는데 join(article.user, user).fetchJoin() 게시글과 유저를 조인할 때 innerJoin을 하게되고 이로인해 join(user.image,image).fetchJoin() 유저와 이미지를 조인할 때 조인할 유저 대상에 문제가 생기는것아닐까?라는 생각이 들었습니다. 그래서 유저와 이미지를 조인할 때 유저를 기준으로 leftJoin하여 유저를 모두 불러오면 해결할 수 있지않을까 생각하여 아래처럼 사용을 했고 게시글을 찾아올 수 있었습니다. override fun findByIdWithBoardUserAndUserImage(id: Long): Article? { return queryFactory.selectFrom(article) .where(article.id.eq(id)) .join(article.board, board).fetchJoin() .join(article.user, user).fetchJoin() .leftJoin(user.image,image).fetchJoin() .fetchOne()} 그렇지만 문제의 원인과 올바른 해결방법?이 무엇일지 정확한 답을 알고 분명하게 알고가고자 질문을 남깁니다!.
- 미해결실전! Querydsl
@Embeddable 관련질문
안녕하세요 질문이 있습니다. 기존 존재하는 컬럼을 변경하면 안되는 DB에 접속해서 사용을 하고 있습니다. team-member 일대다 관계이고 team 정보를 가져올때 member정보를 리스트로 가져오려고 합니다. @Entitypublic class team { @JoinColumn(name = "team_id")private List<member> members; } DTO를 따로 선언해서 가져옵니다. QueryResults<TeamResponse> results = queryFactory .select(new QTeamResponse( team.members )) .from(team) 그런데 에러가 발생하였습니다. nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: not an entity 위의 에러가 떠서 확인을 하였더니 member 클래스가 @Embeddable입니다. 이 문제때문에 위 에러가 발생하는것 같습니다. @Entity로 선언하자니 PK가 있어야한다는데 변경할수는 없고 어떻게 해야 리스트를 가져올수 있을가요? 리스트를 제외했더니 에러없어 잘 가져오는걸 보니 리스트 문제가 맞습니다.
- 미해결실전! Querydsl
특정 필드의 그룹별 최댓값 조회와 where절에 대한 List 사용 방법
안녕하세요. 강의를 들으면서 프로젝트를 진행하고 있다가 막히는 부분이 있어서 질문드립니다. 두서 없는 질문이어서 먼저 죄송합니다. 1. 첫번째는 https://www.inflearn.com/questions/14139 와 비슷한 질문입니다. 지금 하고 있는 프로젝트에서 상품에 대한 테이블은 다음과 같습니다. id price discountPrice shopId 1 10000 9000 1 2 12000 10000 1 3 8000 7500 1 4 10000 9900 2 이때 discountPrice와 price로 할인율을 계산하였는데요. shopId별로 가장 할인율이 높은 것을 1개 뽑고 그 뽑은 것들 중에서 할인율이 높은 순으로 10개를 뽑고 싶습니다. 할인율은 (price-discountPrice)/price * 100 으로 계산하였습니다. queryDSL에서는 from에 대한 서브쿼리를 지원하지 않아 위의 질문처럼 2개 쿼리를 쓰거나 네이티브 쿼리를 쓰려고 하는데요. 이 상황에서 2개 쿼리를 쓴다는게 어떻게 써야하는지 잘 모르겠어서 질문 드립니다. 또 다음 https://helloino.tistory.com/120https://pepperoni.netlify.app/mysql%EC%97%90%EC%84%9C%20%EA%B7%B8%EB%A3%B9%EB%B3%84%20%EC%B5%9C%EC%8B%A0%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0/두 개의 자료를 참조하여 다음과 같이 만들었습니다. 할인율을 직접 보려고 rate라는 걸 추가했는데 0으로 나오네요... 왜 안되는지도 궁금합니다 QProduct p1 = new QProduct("p1");QProduct p2 = new QProduct("p2");return queryFactory.select(Projections.fields(ProductTmp.class, shop.id.as("shopId"), shop.name.as("shopName"), p1.id, p1.name, p1.price, p1.discountedPrice, p1.price.subtract(p1.discountedPrice).divide(p1.price).multiply(100L).as("rate"), p1.image)) .from(p1) .innerJoin(p1.shop, shop) .leftJoin(p2) .on(p1.shop.id.eq(p2.shop.id) .and(p1.price.subtract(p1.discountedPrice).mod(p1.price).multiply(100L) .lt(p2.price.subtract(p2.discountedPrice).mod(p2.price).multiply(100L)))) .where(p2.id.isNull()) .orderBy(p1.price.subtract(p1.discountedPrice).mod(p1.price).multiply(100L).desc()) .limit(10) .fetch(); 2. 하고 있는 프로젝트에서 Shop 이란 Entity 안에는 List<String>category가 있습니다. 그런데 DB로 들어갈때는 해당 List의 요소들을 꺼내서 ,(콤마)로 이어서 하나의 String으로 만들어 DB에 넣어주고 DB에서 꺼낼때는 ,(콤마) 기준으로 나누어서 List<String>으로 꺼내줍니다. 이때 저는 입력으로 들어오는 String category가 shop의 category 안에 있는지 판단하고 이것을 where 절에 넣고 싶어서 다음을 구현했습니다. public BooleanExpression eqCategory(String category) { return hasText(category) ? shop.category.contains(category) : null;}.where(eqCategory(category)) 그런데 해당 에러가 뜨면서 되지 않습니다. java.lang.NullPointerException: Cannot invoke "org.hibernate.persister.collection.QueryableCollection.getElementPersister()" because "queryableCollection" is null shop.category.getType()은 interface java.util.List가 나오고 shop.category.getClass()는 class com.querydsl.core.types.dsl.ListPath가 나왔습니다. queryDSL에서는 List안에 있는지 판단하는게 지원이 안되는지 궁굼하고 이런 경우에는 어떻게 해결해야 하는지 궁금합니다.
- 미해결실전! Querydsl
persist 에 unknown Entity Hello 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요, Hello hello = new Hello();em.persist(hello); 여기서 persist 에 unknown Entity Hello 하고 에러가 뜨는데요 최신 버전의 스프링부트를 다운받아 그레들 버전도 7이라서 버전의 문제인가 검색을 통해 해결하려고 했지만 잘안되어서 질문을 남기게 되었습니다. 구글드라이브에 파일을 업로드하였는데 한 번 봐주셨으면 합니다. https://drive.google.com/file/d/1JN665qqgZ2DqhBJW5XIWCyiXcBWp0Yze/view?usp=sharing
- 미해결실전! Querydsl
concat() stringValue 나이를 완전히 가져오지 못합니다.ㅠㅠ
안녕하세요 질문이 있습니다 concat을 사용해서 stringValue를 활용할 때 나이를 다 가져오지 못하고 맨 앞에 있는 숫자만 가져오는데 왜 그럴까요ㅠㅠㅠㅠ
- 미해결실전! Querydsl
서브쿼리와 dto에 대해서 물어볼게 있습니다.
안녕하세요 제가 querydsl로 프로젝트를 하는 중인데 queryFactory .select(new QDto(user.id, JPAExpressions. 서브쿼리문) ) 이렇게 Dto 안에 서브쿼리문이 들어갈 수 있나요? 아무리 작업을 해도 안되서 물어봅니다ㅠㅠ
- 미해결실전! Querydsl
단축키 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]영한님 강의하시다 보면 intellij 상에서 함수를 선택한 후에 단축키를 누르면, 리턴 타입과 리턴 변수가 자동 생성되던데, 해당 단축키좀 알수 있을까요?
- 미해결실전! Querydsl
영속성 컨텍스트에 대해 질문드립니다.
jpaQueryFactory .selectFrom(member) .fetch();jpaQueryFactory .selectFrom(member) .fetch();이런식으로 테스트 코드를 짠 후 실행시켰는데select문이 2번 나갔습니다.제가 이해한 바로는 select문이 한번 나가고 2번째 쿼리에 대해서는 영속성 컨텍스트 1차 캐시에서 가져와서select문이 안나가야 하는데2번 나간게 이해가 되질 않습니다..